diff --git a/apps/activity/api/views.py b/apps/activity/api/views.py index 76b2b333..9d106ee5 100644 --- a/apps/activity/api/views.py +++ b/apps/activity/api/views.py @@ -42,4 +42,4 @@ class GuestViewSet(ReadProtectedModelViewSet): queryset = Guest.objects.all() serializer_class = GuestSerializer filter_backends = [SearchFilter] - search_fields = ['$name', ] + search_fields = ['$last_name', '$first_name', '$inviter__alias__name', '$inviter__alias__normalized_name', ] diff --git a/apps/activity/tables.py b/apps/activity/tables.py index 95f43e51..e4de1e4e 100644 --- a/apps/activity/tables.py +++ b/apps/activity/tables.py @@ -1,10 +1,11 @@ # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later - +from django.utils.html import format_html from django.utils.translation import gettext_lazy as _ import django_tables2 as tables from django_tables2 import A +from note.templatetags.pretty_money import pretty_money from .models import Activity, Guest @@ -51,3 +52,36 @@ class GuestTable(tables.Table): if record.entry: return str(record.date) return _("remove").capitalize() + + +class EntryTable(tables.Table): + type = tables.Column() + + last_name = tables.Column() + + first_name = tables.Column() + + note_name = tables.Column() + + balance = tables.Column() + + def render_note_name(self, value, record): + if hasattr(record, 'username'): + username = record.username + if username != value: + return format_html(value + " aka. " + username) + return value + + def render_balance(self, value): + return pretty_money(value) + + class Meta: + attrs = { + 'class': 'table table-condensed table-striped table-hover' + } + template_name = 'django_tables2/bootstrap4.html' + row_attrs = { + 'class': 'table-row', + 'id': lambda record: "row-" + str(record.type), + 'data-href': lambda record: record.type + } diff --git a/apps/activity/views.py b/apps/activity/views.py index 38e487e0..01b0e7f8 100644 --- a/apps/activity/views.py +++ b/apps/activity/views.py @@ -2,15 +2,18 @@ # SPDX-License-Identifier: GPL-3.0-or-later from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.contenttypes.models import ContentType +from django.db.models import F, Q from django.urls import reverse_lazy from django.views.generic import CreateView, DetailView, UpdateView, TemplateView from django.utils.translation import gettext_lazy as _ from django_tables2.views import SingleTableView - +from note.models import NoteUser, Alias from permission.backends import PermissionBackend + from .forms import ActivityForm, GuestForm from .models import Activity, Guest -from .tables import ActivityTable, GuestTable +from .tables import ActivityTable, GuestTable, EntryTable class ActivityCreateView(LoginRequiredMixin, CreateView): @@ -69,4 +72,51 @@ class ActivityInviteView(LoginRequiredMixin, CreateView): class ActivityEntryView(LoginRequiredMixin, TemplateView): - pass + template_name = "activity/activity_entry.html" + + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + + activity = Activity.objects.get(pk=self.kwargs["pk"]) + ctx["activity"] = activity + + matched = [] + + pattern = "^$" + if "search" in self.request.GET: + pattern = self.request.GET["search"] + + print(pattern) + + guest_qs = Guest.objects\ + .annotate(balance=F("inviter__balance"), note_name=F("inviter__user__username"))\ + .filter(Q(first_name__regex=pattern) | Q(last_name__regex=pattern) + | Q(inviter__alias__name__regex=pattern) + | Q(inviter__alias__normalized_name__startswith=Alias.normalize(pattern)))\ + .distinct()[:20] + for guest in guest_qs: + guest.type = "Invité" + matched.append(guest) + + note_qs = Alias.objects.annotate(last_name=F("note__noteuser__user__last_name"), + first_name=F("note__noteuser__user__first_name"), + username=F("note__noteuser__user__username"), + note_name=F("name"), + balance=F("note__balance"))\ + .filter(Q(note__polymorphic_ctype__model="noteuser") + & (Q(note__noteuser__user__first_name__regex=pattern) + | Q(note__noteuser__user__last_name__regex=pattern) + | Q(name__regex="^" + pattern) + | Q(normalized_name__startswith=Alias.normalize(pattern))))\ + .distinct()[:20] + for note in note_qs: + note.type = "Adhérent" + matched.append(note) + + table = EntryTable(data=matched) + ctx["table"] = table + + ctx["title"] = _('Entry for activity "{}"').format(activity.name) + ctx["noteuser_ctype"] = ContentType.objects.get_for_model(NoteUser).pk + + return ctx diff --git a/templates/activity/activity_detail.html b/templates/activity/activity_detail.html index 184cc6cd..b663e52d 100644 --- a/templates/activity/activity_detail.html +++ b/templates/activity/activity_detail.html @@ -48,6 +48,10 @@