Files @ 632e4747042f
Branch filter:

Location: conntrackt/conntrackt/templatetags/conntrackt_tags.py

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.
# -*- 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