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.