Files @ 632e4747042f
Branch filter:

Location: conntrackt/conntrackt/templatetags/conntrackt_tags.py - annotation

branko
CONNT-34: Updated implementation for active_link Django template tag:

- Added possibility of passing-in the view positional and keyword
arguments.
- Updated inline documentation.
- Implemented tests.
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
265b2706e075
f397b9db8183
90fac7c6abb9
421171af6c75
3d702d4d7154
6fe5a626d13d
90fac7c6abb9
f397b9db8183
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
1b1abce6b0bb
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
90fac7c6abb9
90fac7c6abb9
421171af6c75
1b1abce6b0bb
1b1abce6b0bb
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
90fac7c6abb9
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
3d702d4d7154
90fac7c6abb9
1b1abce6b0bb
3d702d4d7154
90fac7c6abb9
90fac7c6abb9
f397b9db8183
632e4747042f
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
632e4747042f
632e4747042f
632e4747042f
632e4747042f
632e4747042f
632e4747042f
90fac7c6abb9
632e4747042f
632e4747042f
632e4747042f
632e4747042f
632e4747042f
632e4747042f
632e4747042f
632e4747042f
632e4747042f
90fac7c6abb9
90fac7c6abb9
632e4747042f
90fac7c6abb9
90fac7c6abb9
a5941ab6ea3b
a5941ab6ea3b
6fe5a626d13d
90fac7c6abb9
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
90fac7c6abb9
90fac7c6abb9
90fac7c6abb9
6fe5a626d13d
6fe5a626d13d
90fac7c6abb9
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
6fe5a626d13d
632e4747042f
632e4747042f
632e4747042f
632e4747042f
90fac7c6abb9
90fac7c6abb9
6fe5a626d13d
6fe5a626d13d
90fac7c6abb9
6fe5a626d13d
6fe5a626d13d
90fac7c6abb9
6fe5a626d13d
# -*- coding: utf-8 -*-
#
# Copyright (C) 2013 Branko Majic
#
# This file is part of Django Conntrackt.
#
# Django Conntrackt is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# Django Conntrackt is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Django Conntrackt.  If not, see <http://www.gnu.org/licenses/>.
#


# Django imports.
from django import template
from django import urls
from django.utils.html import format_html
from django.urls import reverse


# Get an instance of Django's template library.
register = template.Library()


@register.simple_tag(takes_context=False)
def html_link(text, view, *args, **kwargs):
    """
    A small wrapper for showing HTML links.

    Positional arguments:

        text - Text that should be used as a link.

        view - View name for which the URL should be shown

        args - Additional positional arguments that will be passed to resolver
        for creating the URL.

    Keyword arguments:

        id - Identifier for the <a> HTML element.

        class - Class(es) for the <a> HTML element.

        title - Title for the HTML <a> element.

        get - Additional GET parameter that should be appended to the URL.

    """

    # Verify the passed-in keyword arguments first.
    for key in kwargs.keys():
        if key not in ("get", "class", "title", "id"):
            raise template.TemplateSyntaxError("Unknown argument for 'html_link' tag: %r" % key)

    # Generate the URL by using the supplied view name and arguments that should
    # be passed to the view.
    url = urls.reverse(view, args=args)

    # Set-up the base pattern (url, parameters, text).
    if 'get' in kwargs:
        pattern = '<a href="{url}?{get}"'
    else:
        pattern = '<a href="{url}"'

    if 'class' in kwargs:
        pattern += ' class="{class}"'

    if 'title' in kwargs:
        pattern += ' title="{title}"'

    if 'id' in kwargs:
        pattern += ' id="{id}"'

    pattern += '>{text}</a>'

    # Render the tag.
    return format_html(pattern, url=url, text=text, **kwargs)


@register.simple_tag(takes_context=True)
def active_link(context, view_name, return_value='active', *args, **kwargs):
    """
    This template tag can be used to check if the provided URL matches against
    the path from the request or not.

    Arguments:

      context
        Context of the view being rendered.

      view_name
        Name of the view against which the context request path is
        being checked.

      args
        Positional parametrs for the view.

      kwargs
        Keyword arguments for the view.

    Returns:
      Value from return_value parameter if the rendered context
      corresponds to specified view, empty string otherwise.
    """

    matches = current_url_equals(context, view_name, *args, **kwargs)

    return return_value if matches else ''


def current_url_equals(context, view_name, *args, **kwargs):
    """
    Helper function for checking if the specified view with provided
    arguments corresponds to the current request path in the context.

    Passed-in positional and keyword arguments are used to resolve URL
    for views that use them.

    Arguments:

      context
        Context of the view being rendered.

      view_name
        Name of the view against which the context request path is
        being checked.

      args
        Positional parametrs for the view.

      kwargs
        Keyword arguments for the view.

    Returns:
      True, if the current URL equals to resolved view URL, False
      otherwise.
    """

    request = context.get('request')
    reversed_url = reverse(view_name, args=args, kwargs=kwargs)

    if request.path == reversed_url:
        return True

    return False