-
Notifications
You must be signed in to change notification settings - Fork 1
/
editor.py
107 lines (89 loc) · 3.33 KB
/
editor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
from __future__ import annotations
from django.contrib.postgres.search import SearchVector
from django.forms import TextInput
from django.utils.translation import gettext_lazy as _
from django_filters import CharFilter, ChoiceFilter, ModelChoiceFilter
from django_tables2 import Column, tables
from django_tables2.utils import Accessor
from apps.buddy_system.models import BuddyRequest
from apps.fiestarequests.models.request import BaseRequestProtocol
from apps.fiestatables.columns import AvatarColumn, NaturalDatetimeColumn
from apps.fiestatables.filters import BaseFilterSet, ProperDateFromToRangeFilter
from apps.plugins.middleware.plugin import HttpRequest
from apps.universities.models import Faculty
def related_faculties(request: HttpRequest):
return Faculty.objects.filter(university__section=request.in_space_of_section)
class BaseRequestsFilter(BaseFilterSet):
search = CharFilter(
method="filter_search",
label=_("Search"),
widget=TextInput(attrs={"placeholder": _("Hannah, Diego, Joe...")}),
)
state = ChoiceFilter(choices=BaseRequestProtocol.State.choices)
matched_when = ProperDateFromToRangeFilter(
field_name="match__created",
)
matcher_faculty = ModelChoiceFilter(
queryset=related_faculties,
label=_("Faculty of matcher"),
field_name="match__matcher__profile__faculty",
)
def filter_search(self, queryset, name, value):
return queryset.annotate(
search=SearchVector(
"issuer__last_name",
"issuer__first_name",
"match__matcher__last_name",
"match__matcher__first_name",
"state",
)
).filter(search=value)
class Meta(BaseFilterSet.Meta):
pass
class BaseRequestsTable(tables.Table):
issuer_name = Column(
accessor="issuer.full_name_official",
order_by=("issuer__last_name", "issuer__first_name", "issuer__username"),
verbose_name=_("Issuer"),
)
issuer_picture = AvatarColumn(accessor="issuer.profile.picture", verbose_name="🧑")
matcher_name = Column(
accessor="match.matcher.full_name_official",
order_by=(
"match__matcher__last_name",
"match__matcher__first_name",
"match__matcher__username",
),
linkify=("sections:user-detail", {"pk": Accessor("match.matcher.pk")}),
)
matcher_email = Column(
accessor="match.matcher.email",
visible=False,
)
matcher_picture = AvatarColumn(
accessor="match.matcher.profile.picture",
verbose_name=_("Matcher"),
)
requested = NaturalDatetimeColumn(verbose_name=_("Requested"), accessor="created")
matched = NaturalDatetimeColumn(
accessor="match.created",
verbose_name=_("Matched"),
attrs={"td": {"title": None}}, # TODO: fix attrs accessor
)
class Meta:
model = BuddyRequest
# TODO: dynamic by section preferences
fields = ("state",)
sequence = (
"issuer_name",
"issuer_picture",
"state",
"...",
"matcher_name",
"matcher_picture",
"requested",
"matched",
"match_request",
)
empty_text = _("No requests found")
attrs = dict(tbody={"hx-disable": True})