vkk.templatetags.customtags

A collection of tags and filters used throughout the project.

  1"""
  2A collection of tags and filters used throughout the project.
  3"""
  4from django import template
  5from django.urls import reverse
  6from django.utils.html import escape
  7from django.utils.safestring import mark_safe
  8from django.utils.translation import gettext_lazy as _
  9from vkk.system.models import Announcement
 10from .navigation_tree import dirs
 11
 12register = template.Library()
 13
 14
 15@register.inclusion_tag('vkk/customtags/announcements.html')
 16def announcements():
 17    """
 18    A tag for adding a div-element containing the currently active system announcements.
 19    """
 20    return {'messages': Announcement.objects.filter(is_active=True)}
 21
 22
 23@register.inclusion_tag('vkk/customtags/form.html')
 24def div_form(form):
 25    """
 26    A tag for rendering a form as a collection of div elements.
 27     This was introduced prior to Django 4.1.
 28    """
 29    return {'form': form}
 30
 31
 32@register.filter
 33def verbose_name(obj):
 34    """
 35    A filter for getting an objects verbose name.
 36    """
 37    return obj._meta.verbose_name
 38
 39
 40@register.filter
 41def verbose_name_plural(obj):
 42    """
 43    A filter for getting an objects verbose name in a plural form.
 44    """
 45    return obj._meta.verbose_name_plural
 46
 47
 48@register.filter
 49def handle_value(obj):
 50    """
 51    A filter for displaying some python types in a sensible manner.
 52    """
 53    if obj is None:
 54        return _('-')
 55    elif isinstance(obj, bool):
 56        return _('Yes') if obj else _('No')
 57    else:
 58        return obj
 59
 60
 61@register.simple_tag
 62def model_name(model):
 63    """
 64    A filter for getting a models verbose name.
 65    """
 66    return model._meta.verbose_name
 67
 68
 69@register.inclusion_tag('vkk/customtags/nav.html', takes_context=True)
 70def navigation(context):
 71    """
 72    A tag for generating and adding a navigation.
 73    """
 74    match = context['view'].request.resolver_match
 75    links = []
 76    logout = False
 77    namespace_joined = None
 78    for namespace in match.namespaces:
 79        if namespace_joined is None:
 80            namespace_joined = namespace
 81        else:
 82            namespace_joined += ':' + namespace
 83        entries = dirs.get(namespace_joined)
 84        if entries is not None:
 85            for entry in entries:
 86                kwargs = {}
 87                for kwarg in entry[2]:
 88                    kwargs[kwarg] = match.kwargs[kwarg]
 89                links += [(
 90                    reverse(
 91                        namespace_joined + ':' + entry[0],
 92                        kwargs=kwargs
 93                    ),
 94                    entry[1]
 95                )]
 96
 97    if context['view'].request.user.is_authenticated:
 98        links += [
 99            (reverse('vkk:users:user_details_change'), _('Profile')),
100        ]
101        logout = True
102
103    context['links'] = links
104    context['logout'] = logout
105    return context
106
107
108def _get_option_url(request, option, kwarg):
109    match = request.resolver_match
110    kwargs = {**match.kwargs, **kwarg}
111    namespace = ':'.join(match.namespaces + [option])
112    return reverse(namespace, kwargs=kwargs)
113
114
115@register.inclusion_tag('vkk/customtags/list_table.html')
116def list_table(query_set, model, fields, options=None, request=None, key='pk'):
117    """
118    A tag for generating a HTML table based on a given queryset.
119    """
120
121    # Gathers desired fields of the model
122    _fields = [model._meta.get_field(field) for field in fields]
123
124    # Generates table head
125    thead = [_(field.verbose_name) for field in _fields]
126    if options is not None:
127        thead += ['' for option in options]
128
129    # Generates table body
130    tbody = []
131    for instance in query_set:
132        row = []
133        for field in _fields:
134            cell = getattr(instance, field.name)
135            row.append(handle_value(cell))
136        if options is not None:
137            kwarg = {key: getattr(instance, key)}
138            for option, value in options.items():
139                url = _get_option_url(request, option, kwarg)
140                tag = mark_safe('<a href="%s">%s</a>' % (url, escape(value)))
141                row.append(tag)
142        tbody.append(row)
143
144    return {'head': thead, 'tbody': tbody}
145
146
147@register.inclusion_tag('vkk/customtags/details_table.html')
148def details_table(model_instance, fields):
149    """
150    A tag for generating a HTML table based on a given model instance.
151    """
152    _fields = [model_instance._meta.get_field(field) for field in fields]
153
154    table_content = []
155    for field in _fields:
156        th = field.verbose_name
157        td = getattr(model_instance, field.name)
158        table_content.append([th, handle_value(td)])
159
160    return {'table_content': table_content}
register = <django.template.library.Library object>
@register.inclusion_tag('vkk/customtags/announcements.html')
def announcements():
16@register.inclusion_tag('vkk/customtags/announcements.html')
17def announcements():
18    """
19    A tag for adding a div-element containing the currently active system announcements.
20    """
21    return {'messages': Announcement.objects.filter(is_active=True)}

A tag for adding a div-element containing the currently active system announcements.

@register.inclusion_tag('vkk/customtags/form.html')
def div_form(form):
24@register.inclusion_tag('vkk/customtags/form.html')
25def div_form(form):
26    """
27    A tag for rendering a form as a collection of div elements.
28     This was introduced prior to Django 4.1.
29    """
30    return {'form': form}

A tag for rendering a form as a collection of div elements. This was introduced prior to Django 4.1.

@register.filter
def verbose_name(obj):
33@register.filter
34def verbose_name(obj):
35    """
36    A filter for getting an objects verbose name.
37    """
38    return obj._meta.verbose_name

A filter for getting an objects verbose name.

@register.filter
def verbose_name_plural(obj):
41@register.filter
42def verbose_name_plural(obj):
43    """
44    A filter for getting an objects verbose name in a plural form.
45    """
46    return obj._meta.verbose_name_plural

A filter for getting an objects verbose name in a plural form.

@register.filter
def handle_value(obj):
49@register.filter
50def handle_value(obj):
51    """
52    A filter for displaying some python types in a sensible manner.
53    """
54    if obj is None:
55        return _('-')
56    elif isinstance(obj, bool):
57        return _('Yes') if obj else _('No')
58    else:
59        return obj

A filter for displaying some python types in a sensible manner.

@register.simple_tag
def model_name(model):
62@register.simple_tag
63def model_name(model):
64    """
65    A filter for getting a models verbose name.
66    """
67    return model._meta.verbose_name

A filter for getting a models verbose name.

@register.inclusion_tag('vkk/customtags/list_table.html')
def list_table(query_set, model, fields, options=None, request=None, key='pk'):
116@register.inclusion_tag('vkk/customtags/list_table.html')
117def list_table(query_set, model, fields, options=None, request=None, key='pk'):
118    """
119    A tag for generating a HTML table based on a given queryset.
120    """
121
122    # Gathers desired fields of the model
123    _fields = [model._meta.get_field(field) for field in fields]
124
125    # Generates table head
126    thead = [_(field.verbose_name) for field in _fields]
127    if options is not None:
128        thead += ['' for option in options]
129
130    # Generates table body
131    tbody = []
132    for instance in query_set:
133        row = []
134        for field in _fields:
135            cell = getattr(instance, field.name)
136            row.append(handle_value(cell))
137        if options is not None:
138            kwarg = {key: getattr(instance, key)}
139            for option, value in options.items():
140                url = _get_option_url(request, option, kwarg)
141                tag = mark_safe('<a href="%s">%s</a>' % (url, escape(value)))
142                row.append(tag)
143        tbody.append(row)
144
145    return {'head': thead, 'tbody': tbody}

A tag for generating a HTML table based on a given queryset.

@register.inclusion_tag('vkk/customtags/details_table.html')
def details_table(model_instance, fields):
148@register.inclusion_tag('vkk/customtags/details_table.html')
149def details_table(model_instance, fields):
150    """
151    A tag for generating a HTML table based on a given model instance.
152    """
153    _fields = [model_instance._meta.get_field(field) for field in fields]
154
155    table_content = []
156    for field in _fields:
157        th = field.verbose_name
158        td = getattr(model_instance, field.name)
159        table_content.append([th, handle_value(td)])
160
161    return {'table_content': table_content}

A tag for generating a HTML table based on a given model instance.