# 61 Filter offices frontend/backend

* adds filters for registration and conservation offices
* adds SelectionTableFilter as new holder for these types of filter components
pull/64/head
mpeltriaux 3 years ago
parent 5bca8fc8f7
commit 834fa8dbd4

@ -10,7 +10,22 @@ from django.utils.translation import gettext_lazy as _
from django import forms from django import forms
from django.db.models import QuerySet, Q from django.db.models import QuerySet, Q
from konova.filters import QueryTableFilter, CheckboxTableFilter from konova.filters import QueryTableFilter, CheckboxTableFilter, SelectionTableFilter
class SelectionCompensationTableFilter(SelectionTableFilter):
""" Specialization of regular SelectionTableFilter for compensation model
"""
def filter_reg_office(self, queryset, name, value):
return queryset.filter(
intervention__responsible__registration_office=value
)
def filter_cons_office(self, queryset, name, value):
return queryset.filter(
intervention__responsible__conservation_office=value
)
class QueryCompensationTableFilter(QueryTableFilter): class QueryCompensationTableFilter(QueryTableFilter):
@ -74,6 +89,7 @@ class CompensationTableFilter:
Just some minor changes for Compensation model. Just some minor changes for Compensation model.
""" """
selection_filter = None
query_filter = None query_filter = None
checkbox_filter = None checkbox_filter = None
qs = None qs = None
@ -83,11 +99,16 @@ class CompensationTableFilter:
qs = kwargs.get("queryset", None) qs = kwargs.get("queryset", None)
request_data = kwargs.get("data", None) request_data = kwargs.get("data", None)
self.query_filter = QueryCompensationTableFilter( self.selection_filter = SelectionCompensationTableFilter(
user=user, user=user,
data=request_data, data=request_data,
queryset=qs, queryset=qs,
) )
self.query_filter = QueryCompensationTableFilter(
user=user,
data=request_data,
queryset=self.selection_filter.qs,
)
self.checkbox_filter = CheckboxCompensationTableFilter( self.checkbox_filter = CheckboxCompensationTableFilter(
user=user, user=user,
data=request_data, data=request_data,
@ -149,6 +170,7 @@ class EcoAccountTableFilter:
""" TableFilter for eco accounts """ TableFilter for eco accounts
""" """
selection_filter = None
query_filter = None query_filter = None
checkbox_filter = None checkbox_filter = None
qs = None qs = None
@ -158,11 +180,16 @@ class EcoAccountTableFilter:
qs = kwargs.get("queryset", None) qs = kwargs.get("queryset", None)
request_data = kwargs.get("data", None) request_data = kwargs.get("data", None)
self.query_filter = QueryTableFilter( self.selection_filter = SelectionTableFilter(
user=user, user=user,
data=request_data, data=request_data,
queryset=qs, queryset=qs,
) )
self.query_filter = QueryTableFilter(
user=user,
data=request_data,
queryset=self.selection_filter.qs,
)
self.checkbox_filter = CheckboxEcoAccountTableFilter( self.checkbox_filter = CheckboxEcoAccountTableFilter(
user=user, user=user,
data=request_data, data=request_data,

@ -5,10 +5,11 @@ Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 22.07.21 Created on: 22.07.21
""" """
from konova.filters import QueryTableFilter, CheckboxTableFilter from konova.filters import QueryTableFilter, CheckboxTableFilter, SelectionTableFilter
class InterventionTableFilter: class InterventionTableFilter:
selection_filter = None
query_filter = None query_filter = None
checkbox_filter = None checkbox_filter = None
qs = None qs = None
@ -18,11 +19,16 @@ class InterventionTableFilter:
qs = kwargs.get("queryset", None) qs = kwargs.get("queryset", None)
request_data = kwargs.get("data", None) request_data = kwargs.get("data", None)
self.query_filter = QueryTableFilter( self.selection_filter = SelectionTableFilter(
user=user, user=user,
data=request_data, data=request_data,
queryset=qs, queryset=qs,
) )
self.query_filter = QueryTableFilter(
user=user,
data=request_data,
queryset=self.selection_filter.qs,
)
self.checkbox_filter = CheckboxTableFilter( self.checkbox_filter = CheckboxTableFilter(
user=user, user=user,
data=request_data, data=request_data,

@ -6,11 +6,14 @@ Created on: 11.01.22
""" """
import django_filters import django_filters
from dal_select2.widgets import ModelSelect2
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db.models import QuerySet, Q from django.db.models import QuerySet, Q
from codelist.models import KonovaCode
from codelist.settings import CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID
from intervention.inputs import DummyFilterInput from intervention.inputs import DummyFilterInput
from konova.models import Parcel, District from konova.models import Parcel, District
@ -351,6 +354,79 @@ class RecordableTableFilterMixin(django_filters.FilterSet):
return queryset return queryset
class RegistrationOfficeTableFilterMixin(django_filters.FilterSet):
""" A mixin for AbstractTableFilter
Specialized on filtering for related registration offices
"""
ro = django_filters.ModelChoiceFilter(
method="filter_reg_office",
label=_(""),
label_suffix=_(""),
queryset=KonovaCode.objects.filter(
is_archived=False,
is_leaf=True,
code_lists__in=[CODELIST_REGISTRATION_OFFICE_ID],
),
widget=ModelSelect2(
url="codes-registration-office-autocomplete",
attrs={
"data-placeholder": _("Registration office"),
"title": _("Search for registration office"),
"class": "",
}
),
)
def filter_reg_office(self, queryset, name, value):
qs = queryset.filter(
responsible__registration_office=value
)
return qs
class ConservationOfficeTableFilterMixin(django_filters.FilterSet):
""" A mixin for AbstractTableFilter
Specialized on filtering for related conservation offices
"""
co = django_filters.ModelChoiceFilter(
method="filter_cons_office",
label=_(""),
label_suffix=_(""),
queryset=KonovaCode.objects.filter(
is_archived=False,
is_leaf=True,
code_lists__in=[CODELIST_CONSERVATION_OFFICE_ID],
),
widget=ModelSelect2(
url="codes-conservation-office-autocomplete",
attrs={
"data-placeholder": _("Conservation office"),
"title": _("Search for conservation office"),
"class": "",
}
),
)
def filter_cons_office(self, queryset, name, value):
qs = queryset.filter(
responsible__conservation_office=value
)
return qs
class SelectionTableFilter(AbstractTableFilter,
RegistrationOfficeTableFilterMixin,
ConservationOfficeTableFilterMixin):
""" TableFilter holding different filter options for selection related filtering
"""
pass
class QueryTableFilter(AbstractTableFilter, class QueryTableFilter(AbstractTableFilter,
KeywordTableFilterMixin, KeywordTableFilterMixin,
FileNumberTableFilterMixin, FileNumberTableFilterMixin,

@ -3,6 +3,16 @@
{% load django_tables2 %} {% load django_tables2 %}
{% load i18n static fontawesome_5 %} {% load i18n static fontawesome_5 %}
{% block head %}
{% comment %}
dal documentation (django-autocomplete-light) states using form.media for adding needed scripts.
This does not work properly with modal forms, as the scripts are not loaded properly inside the modal.
Therefore the script linkages from form.media have been extracted and put inside dal/scripts.html to ensure
these scripts are loaded when needed.
{% endcomment %}
{% include 'dal/scripts.html' %}
{% endblock %}
{% block body %} {% block body %}
<div class="col-md"> <div class="col-md">
{% if table.title %} {% if table.title %}
@ -83,6 +93,11 @@
<div id="filter" class="collapse" aria-labelledby="filterHeader"> <div id="filter" class="collapse" aria-labelledby="filterHeader">
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
{% with table.filter.selection_filter.form as form %}
{% include 'filter/query_filter.html' %}
{% endwith %}
</div>
<div class="row mt-3">
{% with table.filter.query_filter.form as form %} {% with table.filter.query_filter.form as form %}
{% include 'filter/query_filter.html' %} {% include 'filter/query_filter.html' %}
{% endwith %} {% endwith %}

Loading…
Cancel
Save