Introduce a common template for object list views

This commit is contained in:
Jeremy Stretch 2020-02-13 13:13:27 -05:00
parent 3b65e4013a
commit 843b52145c
3 changed files with 51 additions and 6 deletions

View File

@ -0,0 +1,28 @@
{% extends '_base.html' %}
{% load buttons %}
{% load helpers %}
{% block content %}
<div class="pull-right noprint">
{% if permissions.add %}
{% add_button content_type.model_class|url_name:"add" %}
{% import_button content_type.model_class|url_name:"import" %}
{% endif %}
{% export_button content_type %}
</div>
<h1>{% block title %}{{ content_type.model_class|model_name_plural|bettertitle }}{% endblock %}</h1>
<div class="row">
{% if filter_form %}
<div class="col-md-9">
{% include 'utilities/obj_table.html' with bulk_edit_url=content_type.model_class|url_name:"bulk_edit" bulk_delete_url=content_type.model_class|url_name:"bulk_delete" %}
</div>
<div class="col-md-3 noprint">
{% include 'inc/search_panel.html' %}
</div>
{% else %}
<div class="col-md-12">
{% include 'utilities/obj_table.html' with bulk_edit_url=content_type.model_class|url_name:"bulk_edit" bulk_delete_url=content_type.model_class|url_name:"bulk_delete" %}
</div>
{% endif %}
</div>
{% endblock %}

View File

@ -1,9 +1,10 @@
import datetime import datetime
import json import json
import re import re
import yaml
import yaml
from django import template from django import template
from django.urls import NoReverseMatch, reverse
from django.utils.html import strip_tags from django.utils.html import strip_tags
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from markdown import markdown from markdown import markdown
@ -11,7 +12,6 @@ from markdown import markdown
from utilities.choices import unpack_grouped_choices from utilities.choices import unpack_grouped_choices
from utilities.utils import foreground_color from utilities.utils import foreground_color
register = template.Library() register = template.Library()
@ -101,6 +101,21 @@ def model_name_plural(obj):
return obj._meta.verbose_name_plural return obj._meta.verbose_name_plural
@register.filter()
def url_name(model, action):
"""
Return the URL name for the given model and action, or None if invalid.
"""
url_name = '{}:{}_{}'.format(model._meta.app_label, model._meta.model_name, action)
try:
# Validate and return the URL name. We don't return the actual URL yet because many of the templates
# are written to pass a name to {% url %}.
reverse(url_name)
return url_name
except NoReverseMatch:
return None
@register.filter() @register.filter()
def contains(value, arg): def contains(value, arg):
""" """

View File

@ -71,7 +71,7 @@ class ObjectListView(View):
filterset = None filterset = None
filterset_form = None filterset_form = None
table = None table = None
template_name = None template_name = 'utilities/obj_list.html'
def queryset_to_yaml(self): def queryset_to_yaml(self):
""" """
@ -156,9 +156,11 @@ class ObjectListView(View):
# Provide a hook to tweak the queryset based on the request immediately prior to rendering the object list # Provide a hook to tweak the queryset based on the request immediately prior to rendering the object list
self.queryset = self.alter_queryset(request) self.queryset = self.alter_queryset(request)
# Compile user model permissions for access from within the template # Compile a dictionary indicating which permissions are available to the current user for this model
perm_base_name = '{}.{{}}_{}'.format(model._meta.app_label, model._meta.model_name) permissions = {}
permissions = {p: request.user.has_perm(perm_base_name.format(p)) for p in ['add', 'change', 'delete']} for action in ('add', 'change', 'delete', 'view'):
perm_name = '{}.{}_{}'.format(model._meta.app_label, action, model._meta.model_name)
permissions[action] = request.user.has_perm(perm_name)
# Construct the table based on the user's permissions # Construct the table based on the user's permissions
table = self.table(self.queryset) table = self.table(self.queryset)