Table filters

* adds table filtering for InterventionTable
* adds default ordering
* moves user-access filtering from view to InterventionTableFiler
* adds generic render_icn method for BaseTable (for usage with fontawesome5)
* adds translations
* improves table.html template
This commit is contained in:
mipel
2021-07-22 10:00:59 +02:00
parent f88b206756
commit 0c1fa72556
8 changed files with 228 additions and 29 deletions

113
intervention/filters.py Normal file
View File

@@ -0,0 +1,113 @@
"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 22.07.21
"""
import django_filters
from django import forms
from django.contrib.auth.models import User
from django.db.models import QuerySet, Q
from django.utils.translation import gettext_lazy as _
from intervention.models import Intervention
class InterventionTableFilter(django_filters.FilterSet):
q = django_filters.Filter(
method='_filter_by_keyword',
widget=forms.HiddenInput(), # use search bar in template, we only need the filter logic in here!
)
sa = django_filters.BooleanFilter(
method='_filter_show_all',
label=_("Show all"),
label_suffix=_(""),
widget=forms.CheckboxInput()
)
sr = django_filters.BooleanFilter(
method='_filter_show_recorded',
label=_("Show recorded"),
label_suffix=_(""),
widget=forms.CheckboxInput()
)
# Gemarkung ##ToDo
g = django_filters.CharFilter(
field_name="name",
lookup_expr="icontains",
label=_(""),
label_suffix=_(""),
widget=forms.TextInput(
attrs={
"placeholder": _("District"),
"title": _("Search for district")
}
),
)
# Kreis
## ToDo
# Flur
## ToDo
# Zähler
## ToDo
# Nenner
## ToDo
class Meta:
model = Intervention
fields = []
def __init__(self, user: User, *args, **kwargs):
self.user = user
super().__init__(*args, **kwargs)
def _filter_by_keyword(self, queryset, name, value) -> QuerySet:
""" Filters queryset depending on value of search bar input
Args:
queryset ():
name ():
value ():
Returns:
"""
# build filter expression
q = Q(title__icontains=value) | Q(identifier__icontains=value)
return queryset.filter(q)
def _filter_show_all(self, queryset, name, value) -> QuerySet:
""" Filters queryset depending on value of 'show_all' setting
Args:
queryset ():
name ():
value ():
Returns:
"""
if not value:
return queryset.filter(
users__in=[self.user], # requesting user has access
)
else:
return queryset
def _filter_show_recorded(self, queryset, name, value) -> QuerySet:
""" Filters queryset depending on value of 'show_recorded' setting
Args:
queryset ():
name ():
value ():
Returns:
"""
if not value:
return queryset.filter(
recorded_on=None,
)
else:
return queryset

View File

@@ -5,11 +5,13 @@ Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 01.12.20
"""
from django.http import HttpRequest
from django.urls import reverse
from django.utils.html import format_html
from django.utils.timezone import localtime
from django.utils.translation import gettext_lazy as _
from intervention.filters import InterventionTableFilter
from intervention.models import Intervention
from konova.sub_settings.django_settings import DEFAULT_DATE_TIME_FORMAT
from konova.utils.tables import BaseTable
@@ -39,6 +41,12 @@ class InterventionTable(BaseTable):
empty_values=[],
accessor="recorded_on",
)
e = tables.Column(
verbose_name=_("Editable"),
orderable=True,
empty_values=[],
accessor="users",
)
lm = tables.Column(
verbose_name=_("Last edit"),
orderable=True,
@@ -58,10 +66,16 @@ class InterventionTable(BaseTable):
class Meta(BaseTable.Meta):
template_name = "django_tables2/bootstrap4.html"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __init__(self, request: HttpRequest, *args, **kwargs):
self.title = _("Interventions")
self.add_new_url = reverse("intervention:new")
qs = kwargs.get("queryset", None)
self.filter = InterventionTableFilter(
user=request.user,
data=request.GET,
queryset=qs,
)
super().__init__(request, self.filter, *args, **kwargs)
def render_id(self, value, record: Intervention):
""" Renders the id column for an intervention
@@ -128,6 +142,27 @@ class InterventionTable(BaseTable):
)
return format_html(html)
def render_e(self, value, record: Intervention):
""" Renders the registered column for an intervention
Args:
value (str): The identifier value
record (Intervention): The intervention record
Returns:
"""
html = ""
has_access = value.filter(
username=self.user.username
).exists()
html += self.render_icn(
tooltip=_("Full access granted") if has_access else _("Access not granted"),
icn_class="fas fa-edit rlp-r-inv" if has_access else "far fa-edit",
)
return format_html(html)
def render_ac(self, value, record):
"""
Renders possible actions for this record, such as delete.

View File

@@ -24,11 +24,13 @@ def index_view(request: HttpRequest):
A rendered view
"""
template = "generic_index.html"
user = request.user
# Filtering by user access is performed in table filter inside of InterventionTableFilter class
interventions = Intervention.objects.filter(
deleted_on=None, # not deleted
next_version=None, # only newest versions
users__in=[user], # requesting user has access
).order_by(
"-created_on"
)
table = InterventionTable(
request=request,