Skip to content
Snippets Groups Projects
Verified Commit c51734a5 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Add more fields to person and group filters and merge some filter fields

parent 18caee07
No related branches found
No related tags found
1 merge request!327Resolve "Improve newly added filters"
from django_filters import CharFilter, FilterSet
from typing import Sequence
from django.db.models import Q
from django.utils.translation import gettext as _
from django_filters import CharFilter, FilterSet, ModelChoiceFilter, ModelMultipleChoiceFilter
from material import Layout, Row
from aleksis.core.models import Group, GroupType, Person, SchoolTerm
class MultipleCharFilter(CharFilter):
"""Filter for filtering multiple fields with one input.
>>> multiple_filter = MultipleCharFilter(["name__icontains", "short_name__icontains"])
"""
def filter(self, qs, value): # noqa
q = None
for field in self.fields:
if not q:
q = Q(**{field: value})
else:
q = q | Q(**{field: value})
return qs.filter(q)
def __init__(self, fields: Sequence[str], *args, **kwargs):
self.fields = fields
super().__init__(self, *args, **kwargs)
class GroupFilter(FilterSet):
name = CharFilter(lookup_expr="icontains")
short_name = CharFilter(lookup_expr="icontains")
school_term = ModelChoiceFilter(queryset=SchoolTerm.objects.all())
group_type = ModelChoiceFilter(queryset=GroupType.objects.all())
parent_groups = ModelMultipleChoiceFilter(queryset=Group.objects.all())
search = MultipleCharFilter(["name__icontains", "short_name__icontains"], label=_("Search"))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form.layout = Layout(Row("name", "short_name"))
self.form.layout = Layout(Row("search"), Row("school_term", "group_type", "parent_groups"))
self.form.initial = {"school_term": SchoolTerm.current}
class PersonFilter(FilterSet):
first_name = CharFilter(lookup_expr="icontains")
last_name = CharFilter(lookup_expr="icontains")
name = MultipleCharFilter(
[
"first_name__icontains",
"additional_name__icontains",
"last_name__icontains",
"short_name__icontains",
],
label=_("Search by name"),
)
contact = MultipleCharFilter(
[
"street__icontains",
"housenumber__icontains",
"postal_code__icontains",
"place__icontains",
"phone_number__icontains",
"mobile_number__icontains",
"email__icontains",
],
label=_("Search by contact details"),
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form.layout = Layout(Row("first_name", "last_name"))
self.form.layout = Layout(Row("name", "contact"), Row("is_active", "sex", "primary_group"))
class Meta:
model = Person
fields = ["sex", "is_active", "primary_group"]
......@@ -60,19 +60,9 @@
</table>
<h5>{% blocktrans %}Owners{% endblocktrans %}</h5>
<form method="get">
{% form form=owners_filter.form %}{% endform %}
{% trans "Search" as caption %}
{% include "core/partials/save_button.html" with caption=caption icon="search" %}
</form>
{% render_table owners_table %}
<h5>{% blocktrans %}Members{% endblocktrans %}</h5>
<form method="get">
{% form form=members_filter.form %}{% endform %}
{% trans "Search" as caption %}
{% include "core/partials/save_button.html" with caption=caption icon="search" %}
</form>
{% render_table members_table %}
{% endblock %}
......@@ -134,11 +134,6 @@
{% has_perm 'core.view_person_groups' user person as can_view_groups %}
{% if can_view_groups %}
<h5>{% blocktrans %}Groups{% endblocktrans %}</h5>
<form method="get">
{% form form=groups_filter.form %}{% endform %}
{% trans "Search" as caption %}
{% include "core/partials/save_button.html" with caption=caption icon="search" %}
</form>
{% render_table groups_table %}
{% endif %}
{% endblock %}
......@@ -168,12 +168,8 @@ def person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
# Get groups where person is member of
groups = Group.objects.filter(members=person)
# Get filter
groups_filter = GroupFilter(request.GET, queryset=groups)
context["groups_filter"] = groups_filter
# Build table
groups_table = GroupsTable(groups_filter.qs)
groups_table = GroupsTable(groups)
RequestConfig(request).configure(groups_table)
context["groups_table"] = groups_table
......@@ -194,24 +190,16 @@ def group(request: HttpRequest, id_: int) -> HttpResponse:
# Get members
members = group.members.filter(is_active=True)
# Get filter
members_filter = PersonFilter(request.GET, queryset=members)
context["members_filter"] = members_filter
# Build table
members_table = PersonsTable(members_filter.qs)
members_table = PersonsTable(members)
RequestConfig(request).configure(members_table)
context["members_table"] = members_table
# Get owners
owners = group.owners.filter(is_active=True)
# Get filter
owners_filter = PersonFilter(request.GET, queryset=owners)
context["owners_filter"] = owners_filter
# Build table
owners_table = PersonsTable(owners_filter.qs)
owners_table = PersonsTable(owners)
RequestConfig(request).configure(owners_table)
context["owners_table"] = owners_table
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment