mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 23:54:30 +01:00 
			
		
		
		
	Each table can be sorted (with a few exceptions)
This commit is contained in:
		| @@ -18,7 +18,7 @@ from django.views import View | |||||||
| from django.views.decorators.cache import cache_page | from django.views.decorators.cache import cache_page | ||||||
| from django.views.generic import DetailView, TemplateView, UpdateView | from django.views.generic import DetailView, TemplateView, UpdateView | ||||||
| from django.views.generic.list import ListView | from django.views.generic.list import ListView | ||||||
| from django_tables2.views import MultiTableMixin | from django_tables2.views import MultiTableMixin, SingleTableMixin | ||||||
| from note.models import Alias, NoteSpecial, NoteUser | from note.models import Alias, NoteSpecial, NoteUser | ||||||
| from permission.backends import PermissionBackend | from permission.backends import PermissionBackend | ||||||
| from permission.views import ProtectQuerysetMixin, ProtectedCreateView | from permission.views import ProtectQuerysetMixin, ProtectedCreateView | ||||||
| @@ -63,19 +63,15 @@ class ActivityListView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin | |||||||
|     Displays all Activities, and classify if they are on-going or upcoming ones. |     Displays all Activities, and classify if they are on-going or upcoming ones. | ||||||
|     """ |     """ | ||||||
|     model = Activity |     model = Activity | ||||||
|     tables = [ActivityTable, ActivityTable] |     tables = [ | ||||||
|  |         lambda data: ActivityTable(data, prefix="all-"), | ||||||
|  |         lambda data: ActivityTable(data, prefix="upcoming-"), | ||||||
|  |     ] | ||||||
|     extra_context = {"title": _("Activities")} |     extra_context = {"title": _("Activities")} | ||||||
|  |  | ||||||
|     def get_queryset(self, **kwargs): |     def get_queryset(self, **kwargs): | ||||||
|         return super().get_queryset(**kwargs).distinct() |         return super().get_queryset(**kwargs).distinct() | ||||||
|  |  | ||||||
|     def get_tables(self): |  | ||||||
|         tables = super().get_tables() |  | ||||||
|  |  | ||||||
|         tables[0].prefix = "all-" |  | ||||||
|         tables[1].prefix = "upcoming-" |  | ||||||
|         return tables |  | ||||||
|  |  | ||||||
|     def get_tables_data(self): |     def get_tables_data(self): | ||||||
|         # first table = all activities, second table = upcoming |         # first table = all activities, second table = upcoming | ||||||
|         return [ |         return [ | ||||||
| @@ -99,7 +95,7 @@ class ActivityListView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin | |||||||
|         return context |         return context | ||||||
|  |  | ||||||
|  |  | ||||||
| class ActivityDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | class ActivityDetailView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableMixin, DetailView): | ||||||
|     """ |     """ | ||||||
|     Shows details about one activity. Add guest to context |     Shows details about one activity. Add guest to context | ||||||
|     """ |     """ | ||||||
| @@ -107,13 +103,16 @@ class ActivityDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|     context_object_name = "activity" |     context_object_name = "activity" | ||||||
|     extra_context = {"title": _("Activity detail")} |     extra_context = {"title": _("Activity detail")} | ||||||
|  |  | ||||||
|  |     table_class = GuestTable | ||||||
|  |     context_table_name = "guests" | ||||||
|  |  | ||||||
|  |     def get_table_data(self): | ||||||
|  |         return Guest.objects.filter(activity=self.object) \ | ||||||
|  |             .filter(PermissionBackend.filter_queryset(self.request, Guest, "view")) | ||||||
|  |  | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super().get_context_data() |         context = super().get_context_data() | ||||||
|  |  | ||||||
|         table = GuestTable(data=Guest.objects.filter(activity=self.object) |  | ||||||
|                            .filter(PermissionBackend.filter_queryset(self.request, Guest, "view"))) |  | ||||||
|         context["guests"] = table |  | ||||||
|  |  | ||||||
|         context["activity_started"] = timezone.now() > timezone.localtime(self.object.date_start) |         context["activity_started"] = timezone.now() > timezone.localtime(self.object.date_start) | ||||||
|  |  | ||||||
|         return context |         return context | ||||||
| @@ -172,12 +171,14 @@ class ActivityInviteView(ProtectQuerysetMixin, ProtectedCreateView): | |||||||
|         return reverse_lazy('activity:activity_detail', kwargs={"pk": self.kwargs["pk"]}) |         return reverse_lazy('activity:activity_detail', kwargs={"pk": self.kwargs["pk"]}) | ||||||
|  |  | ||||||
|  |  | ||||||
| class ActivityEntryView(LoginRequiredMixin, TemplateView): | class ActivityEntryView(LoginRequiredMixin, SingleTableMixin, TemplateView): | ||||||
|     """ |     """ | ||||||
|     Manages entry to an activity |     Manages entry to an activity | ||||||
|     """ |     """ | ||||||
|     template_name = "activity/activity_entry.html" |     template_name = "activity/activity_entry.html" | ||||||
|  |  | ||||||
|  |     table_class = EntryTable | ||||||
|  |  | ||||||
|     def dispatch(self, request, *args, **kwargs): |     def dispatch(self, request, *args, **kwargs): | ||||||
|         """ |         """ | ||||||
|         Don't display the entry interface if the user has no right to see it (no right to add an entry for itself), |         Don't display the entry interface if the user has no right to see it (no right to add an entry for itself), | ||||||
| @@ -266,15 +267,9 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView): | |||||||
|             if settings.DATABASES[note_qs.db]["ENGINE"] == 'django.db.backends.postgresql' else note_qs.distinct()[:20] |             if settings.DATABASES[note_qs.db]["ENGINE"] == 'django.db.backends.postgresql' else note_qs.distinct()[:20] | ||||||
|         return note_qs |         return note_qs | ||||||
|  |  | ||||||
|     def get_context_data(self, **kwargs): |     def get_table_data(self): | ||||||
|         """ |  | ||||||
|         Query the list of Guest and Note to the activity and add information to makes entry with JS. |  | ||||||
|         """ |  | ||||||
|         context = super().get_context_data(**kwargs) |  | ||||||
|  |  | ||||||
|         activity = Activity.objects.filter(PermissionBackend.filter_queryset(self.request, Activity, "view"))\ |         activity = Activity.objects.filter(PermissionBackend.filter_queryset(self.request, Activity, "view"))\ | ||||||
|             .distinct().get(pk=self.kwargs["pk"]) |             .distinct().get(pk=self.kwargs["pk"]) | ||||||
|         context["activity"] = activity |  | ||||||
|  |  | ||||||
|         matched = [] |         matched = [] | ||||||
|  |  | ||||||
| @@ -287,8 +282,17 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView): | |||||||
|             note.activity = activity |             note.activity = activity | ||||||
|             matched.append(note) |             matched.append(note) | ||||||
|  |  | ||||||
|         table = EntryTable(data=matched) |         return matched | ||||||
|         context["table"] = table |  | ||||||
|  |     def get_context_data(self, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Query the list of Guest and Note to the activity and add information to makes entry with JS. | ||||||
|  |         """ | ||||||
|  |         context = super().get_context_data(**kwargs) | ||||||
|  |  | ||||||
|  |         activity = Activity.objects.filter(PermissionBackend.filter_queryset(self.request, Activity, "view"))\ | ||||||
|  |             .distinct().get(pk=self.kwargs["pk"]) | ||||||
|  |         context["activity"] = activity | ||||||
|  |  | ||||||
|         context["entries"] = Entry.objects.filter(activity=activity) |         context["entries"] = Entry.objects.filter(activity=activity) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ from django.utils import timezone | |||||||
| from django.utils.translation import gettext_lazy as _ | from django.utils.translation import gettext_lazy as _ | ||||||
| from django.views.generic import DetailView, UpdateView, TemplateView | from django.views.generic import DetailView, UpdateView, TemplateView | ||||||
| from django.views.generic.edit import FormMixin | from django.views.generic.edit import FormMixin | ||||||
| from django_tables2.views import SingleTableView | from django_tables2.views import MultiTableMixin, SingleTableMixin, SingleTableView | ||||||
| from rest_framework.authtoken.models import Token | from rest_framework.authtoken.models import Token | ||||||
| from note.models import Alias, NoteClub, NoteUser, Trust | from note.models import Alias, NoteClub, NoteUser, Trust | ||||||
| from note.models.transactions import Transaction, SpecialTransaction | from note.models.transactions import Transaction, SpecialTransaction | ||||||
| @@ -165,7 +165,8 @@ class UserDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|         # Display only the most recent membership |         # Display only the most recent membership | ||||||
|         club_list = club_list.distinct("club__name")\ |         club_list = club_list.distinct("club__name")\ | ||||||
|             if settings.DATABASES["default"]["ENGINE"] == 'django.db.backends.postgresql' else club_list |             if settings.DATABASES["default"]["ENGINE"] == 'django.db.backends.postgresql' else club_list | ||||||
|         membership_table = MembershipTable(data=club_list, prefix='membership-') |         club_list_order_by = self.request.GET.getlist("membership-sort", ("club__name", "-date_start")) | ||||||
|  |         membership_table = MembershipTable(data=club_list, prefix='membership-', order_by=club_list_order_by) | ||||||
|         membership_table.paginate(per_page=10, page=self.request.GET.get("membership-page", 1)) |         membership_table.paginate(per_page=10, page=self.request.GET.get("membership-page", 1)) | ||||||
|         context['club_list'] = membership_table |         context['club_list'] = membership_table | ||||||
|  |  | ||||||
| @@ -243,7 +244,7 @@ class UserListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView): | |||||||
|         return context |         return context | ||||||
|  |  | ||||||
|  |  | ||||||
| class ProfileTrustView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | class ProfileTrustView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, DetailView): | ||||||
|     """ |     """ | ||||||
|     View and manage user trust relationships |     View and manage user trust relationships | ||||||
|     """ |     """ | ||||||
| @@ -252,13 +253,25 @@ class ProfileTrustView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|     context_object_name = 'user_object' |     context_object_name = 'user_object' | ||||||
|     extra_context = {"title": _("Note friendships")} |     extra_context = {"title": _("Note friendships")} | ||||||
|  |  | ||||||
|  |     tables = [ | ||||||
|  |         lambda data: TrustTable(data, prefix="trust-"), | ||||||
|  |         lambda data: TrustedTable(data, prefix="trusted-"), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     def get_tables_data(self): | ||||||
|  |         note = self.object.note | ||||||
|  |         return [ | ||||||
|  |             note.trusting.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct(), | ||||||
|  |             note.trusted.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct(), | ||||||
|  |         ] | ||||||
|  |  | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super().get_context_data(**kwargs) |         context = super().get_context_data(**kwargs) | ||||||
|         note = context['object'].note |  | ||||||
|         context["trusting"] = TrustTable( |         tables = context["tables"] | ||||||
|             note.trusting.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct().all()) |         for name, table in zip(["trusting", "trusted_by"], tables): | ||||||
|         context["trusted_by"] = TrustedTable( |             context[name] = table | ||||||
|             note.trusted.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct().all()) |  | ||||||
|         context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_trust", Trust( |         context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_trust", Trust( | ||||||
|             trusting=context["object"].note, |             trusting=context["object"].note, | ||||||
|             trusted=context["object"].note |             trusted=context["object"].note | ||||||
| @@ -277,7 +290,7 @@ class ProfileTrustView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|         return context |         return context | ||||||
|  |  | ||||||
|  |  | ||||||
| class ProfileAliasView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | class ProfileAliasView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableMixin, DetailView): | ||||||
|     """ |     """ | ||||||
|     View and manage user aliases. |     View and manage user aliases. | ||||||
|     """ |     """ | ||||||
| @@ -286,12 +299,15 @@ class ProfileAliasView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|     context_object_name = 'user_object' |     context_object_name = 'user_object' | ||||||
|     extra_context = {"title": _("Note aliases")} |     extra_context = {"title": _("Note aliases")} | ||||||
|  |  | ||||||
|  |     table_class = AliasTable | ||||||
|  |     context_table_name = "aliases" | ||||||
|  |  | ||||||
|  |     def get_table_data(self): | ||||||
|  |         return self.object.note.alias.filter(PermissionBackend.filter_queryset(self.request, Alias, "view")).distinct() \ | ||||||
|  |                                      .order_by('normalized_name') | ||||||
|  |  | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super().get_context_data(**kwargs) |         context = super().get_context_data(**kwargs) | ||||||
|         note = context['object'].note |  | ||||||
|         context["aliases"] = AliasTable( |  | ||||||
|             note.alias.filter(PermissionBackend.filter_queryset(self.request, Alias, "view")).distinct() |  | ||||||
|             .order_by('normalized_name').all()) |  | ||||||
|         context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_alias", Alias( |         context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_alias", Alias( | ||||||
|             note=context["object"].note, |             note=context["object"].note, | ||||||
|             name="", |             name="", | ||||||
| @@ -451,7 +467,8 @@ class ClubDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|         managers = Membership.objects.filter(club=self.object, roles__name="Bureau de club", |         managers = Membership.objects.filter(club=self.object, roles__name="Bureau de club", | ||||||
|                                              date_start__lte=date.today(), date_end__gte=date.today())\ |                                              date_start__lte=date.today(), date_end__gte=date.today())\ | ||||||
|             .order_by('user__last_name').all() |             .order_by('user__last_name').all() | ||||||
|         context["managers"] = ClubManagerTable(data=managers, prefix="managers-") |         managers_order_by = self.request.GET.getlist("managers-sort", ('user__last_name')) | ||||||
|  |         context["managers"] = ClubManagerTable(data=managers, prefix="managers-", order_by=managers_order_by) | ||||||
|         # transaction history |         # transaction history | ||||||
|         club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note))\ |         club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note))\ | ||||||
|             .filter(PermissionBackend.filter_queryset(self.request, Transaction, "view"))\ |             .filter(PermissionBackend.filter_queryset(self.request, Transaction, "view"))\ | ||||||
| @@ -469,7 +486,8 @@ class ClubDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|         club_member = club_member.distinct("user__username")\ |         club_member = club_member.distinct("user__username")\ | ||||||
|             if settings.DATABASES["default"]["ENGINE"] == 'django.db.backends.postgresql' else club_member |             if settings.DATABASES["default"]["ENGINE"] == 'django.db.backends.postgresql' else club_member | ||||||
|  |  | ||||||
|         membership_table = MembershipTable(data=club_member, prefix="membership-") |         membership_order_by = self.request.GET.getlist("membership-sort", ("user__username", "-date_start")) | ||||||
|  |         membership_table = MembershipTable(data=club_member, prefix="membership-", order_by=membership_order_by) | ||||||
|         membership_table.paginate(per_page=5, page=self.request.GET.get('membership-page', 1)) |         membership_table.paginate(per_page=5, page=self.request.GET.get('membership-page', 1)) | ||||||
|         context['member_list'] = membership_table |         context['member_list'] = membership_table | ||||||
|  |  | ||||||
| @@ -510,7 +528,7 @@ class ClubDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|         return context |         return context | ||||||
|  |  | ||||||
|  |  | ||||||
| class ClubAliasView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | class ClubAliasView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableMixin, DetailView): | ||||||
|     """ |     """ | ||||||
|     Manage aliases of a club. |     Manage aliases of a club. | ||||||
|     """ |     """ | ||||||
| @@ -519,11 +537,16 @@ class ClubAliasView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|     context_object_name = 'club' |     context_object_name = 'club' | ||||||
|     extra_context = {"title": _("Note aliases")} |     extra_context = {"title": _("Note aliases")} | ||||||
|  |  | ||||||
|  |     table_class = AliasTable | ||||||
|  |     context_table_name = "aliases" | ||||||
|  |  | ||||||
|  |     def get_table_data(self): | ||||||
|  |         return self.object.note.alias.filter( | ||||||
|  |             PermissionBackend.filter_queryset(self.request, Alias, "view")).distinct() | ||||||
|  |  | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super().get_context_data(**kwargs) |         context = super().get_context_data(**kwargs) | ||||||
|         note = context['object'].note |  | ||||||
|         context["aliases"] = AliasTable(note.alias.filter( |  | ||||||
|             PermissionBackend.filter_queryset(self.request, Alias, "view")).distinct().all()) |  | ||||||
|         context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_alias", Alias( |         context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_alias", Alias( | ||||||
|             note=context["object"].note, |             note=context["object"].note, | ||||||
|             name="", |             name="", | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ from django.forms import HiddenInput | |||||||
| from django.http import Http404 | from django.http import Http404 | ||||||
| from django.utils.translation import gettext_lazy as _ | from django.utils.translation import gettext_lazy as _ | ||||||
| from django.views.generic import UpdateView, TemplateView, CreateView | from django.views.generic import UpdateView, TemplateView, CreateView | ||||||
|  | from django_tables2 import MultiTableMixin | ||||||
| from member.models import Membership | from member.models import Membership | ||||||
|  |  | ||||||
| from .backends import PermissionBackend | from .backends import PermissionBackend | ||||||
| @@ -107,10 +108,31 @@ class ProtectedCreateView(LoginRequiredMixin, CreateView): | |||||||
|         return super().dispatch(request, *args, **kwargs) |         return super().dispatch(request, *args, **kwargs) | ||||||
|  |  | ||||||
|  |  | ||||||
| class RightsView(TemplateView): | class RightsView(MultiTableMixin, TemplateView): | ||||||
|     template_name = "permission/all_rights.html" |     template_name = "permission/all_rights.html" | ||||||
|     extra_context = {"title": _("Rights")} |     extra_context = {"title": _("Rights")} | ||||||
|  |  | ||||||
|  |     tables = [ | ||||||
|  |         lambda data: RightsTable(data, prefix="clubs-"), | ||||||
|  |         lambda data: SuperuserTable(data, prefix="superusers-"), | ||||||
|  |     ] | ||||||
|  |  | ||||||
|  |     def get_tables_data(self): | ||||||
|  |         special_memberships = Membership.objects.filter( | ||||||
|  |             date_start__lte=date.today(), | ||||||
|  |             date_end__gte=date.today(), | ||||||
|  |         ).filter(roles__in=Role.objects.filter((~(Q(name="Adhérent BDE") | ||||||
|  |                                                   | Q(name="Adhérent Kfet") | ||||||
|  |                                                   | Q(name="Membre de club") | ||||||
|  |                                                   | Q(name="Bureau de club")) | ||||||
|  |                                                 & Q(weirole__isnull=True))))\ | ||||||
|  |             .order_by("club__name", "user__last_name")\ | ||||||
|  |             .distinct().all() | ||||||
|  |         return [ | ||||||
|  |             special_memberships, | ||||||
|  |             User.objects.filter(is_superuser=True).order_by("last_name"), | ||||||
|  |         ] | ||||||
|  |  | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super().get_context_data(**kwargs) |         context = super().get_context_data(**kwargs) | ||||||
|  |  | ||||||
| @@ -128,19 +150,9 @@ class RightsView(TemplateView): | |||||||
|             role.clubs = [membership.club for membership in active_memberships if role in membership.roles.all()] |             role.clubs = [membership.club for membership in active_memberships if role in membership.roles.all()] | ||||||
|  |  | ||||||
|         if self.request.user.is_authenticated: |         if self.request.user.is_authenticated: | ||||||
|             special_memberships = Membership.objects.filter( |             tables = context["tables"] | ||||||
|                 date_start__lte=date.today(), |             for name, table in zip(["special_memberships_table", "superusers"], tables): | ||||||
|                 date_end__gte=date.today(), |                 context[name] = table | ||||||
|             ).filter(roles__in=Role.objects.filter((~(Q(name="Adhérent BDE") |  | ||||||
|                                                       | Q(name="Adhérent Kfet") |  | ||||||
|                                                       | Q(name="Membre de club") |  | ||||||
|                                                       | Q(name="Bureau de club")) |  | ||||||
|                                                     & Q(weirole__isnull=True))))\ |  | ||||||
|                 .order_by("club__name", "user__last_name")\ |  | ||||||
|                 .distinct().all() |  | ||||||
|             context["special_memberships_table"] = RightsTable(special_memberships, prefix="clubs-") |  | ||||||
|             context["superusers"] = SuperuserTable(User.objects.filter(is_superuser=True).order_by("last_name").all(), |  | ||||||
|                                                    prefix="superusers-") |  | ||||||
|  |  | ||||||
|         return context |         return context | ||||||
|  |  | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ from django.utils.translation import gettext_lazy as _ | |||||||
| from django.views.generic import UpdateView, DetailView | from django.views.generic import UpdateView, DetailView | ||||||
| from django.views.generic.base import View, TemplateView | from django.views.generic.base import View, TemplateView | ||||||
| from django.views.generic.edit import BaseFormView, DeleteView | from django.views.generic.edit import BaseFormView, DeleteView | ||||||
| from django_tables2 import SingleTableView | from django_tables2 import MultiTableMixin, SingleTableMixin, SingleTableView | ||||||
| from note.models import SpecialTransaction, NoteSpecial, Alias | from note.models import SpecialTransaction, NoteSpecial, Alias | ||||||
| from note_kfet.settings.base import BASE_DIR | from note_kfet.settings.base import BASE_DIR | ||||||
| from permission.backends import PermissionBackend | from permission.backends import PermissionBackend | ||||||
| @@ -259,13 +259,21 @@ class RemittanceCreateView(ProtectQuerysetMixin, ProtectedCreateView): | |||||||
|         return context |         return context | ||||||
|  |  | ||||||
|  |  | ||||||
| class RemittanceListView(LoginRequiredMixin, TemplateView): | class RemittanceListView(LoginRequiredMixin, MultiTableMixin, TemplateView): | ||||||
|     """ |     """ | ||||||
|     List existing Remittances |     List existing Remittances | ||||||
|     """ |     """ | ||||||
|     template_name = "treasury/remittance_list.html" |     template_name = "treasury/remittance_list.html" | ||||||
|     extra_context = {"title": _("Remittances list")} |     extra_context = {"title": _("Remittances list")} | ||||||
|  |  | ||||||
|  |     tables = [ | ||||||
|  |         lambda data: RemittanceTable(data, prefix="opened-remittances-"), | ||||||
|  |         lambda data: RemittanceTable(data, prefix="closed-remittances-"), | ||||||
|  |         lambda data: SpecialTransactionTable(data, prefix="no-remittance-", exclude=('remittance_remove', )), | ||||||
|  |         lambda data: SpecialTransactionTable(data, prefix="with-remittance-", exclude=('remittance_add', )), | ||||||
|  |     ] | ||||||
|  |     paginate_by = 10     # number of rows in tables | ||||||
|  |  | ||||||
|     def dispatch(self, request, *args, **kwargs): |     def dispatch(self, request, *args, **kwargs): | ||||||
|         # Check that the user is authenticated |         # Check that the user is authenticated | ||||||
|         if not request.user.is_authenticated: |         if not request.user.is_authenticated: | ||||||
| @@ -275,49 +283,37 @@ class RemittanceListView(LoginRequiredMixin, TemplateView): | |||||||
|             raise PermissionDenied(_("You are not able to see the treasury interface.")) |             raise PermissionDenied(_("You are not able to see the treasury interface.")) | ||||||
|         return super().dispatch(request, *args, **kwargs) |         return super().dispatch(request, *args, **kwargs) | ||||||
|  |  | ||||||
|  |     def get_tables_data(self): | ||||||
|  |         return [ | ||||||
|  |             Remittance.objects.filter(closed=False).filter( | ||||||
|  |                 PermissionBackend.filter_queryset(self.request, Remittance, "view")), | ||||||
|  |             Remittance.objects.filter(closed=True).filter( | ||||||
|  |                 PermissionBackend.filter_queryset(self.request, Remittance, "view")), | ||||||
|  |             SpecialTransaction.objects.filter(source__in=NoteSpecial.objects.filter(~Q(remittancetype=None)), | ||||||
|  |                                               specialtransactionproxy__remittance=None).filter( | ||||||
|  |                 PermissionBackend.filter_queryset(self.request, Remittance, "view")), | ||||||
|  |             SpecialTransaction.objects.filter(source__in=NoteSpecial.objects.filter(~Q(remittancetype=None)), | ||||||
|  |                                               specialtransactionproxy__remittance__closed=False).filter( | ||||||
|  |                 PermissionBackend.filter_queryset(self.request, Remittance, "view")), | ||||||
|  |         ] | ||||||
|  |  | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super().get_context_data(**kwargs) |         context = super().get_context_data(**kwargs) | ||||||
|  |  | ||||||
|         opened_remittances = RemittanceTable( |         tables = context["tables"] | ||||||
|             data=Remittance.objects.filter(closed=False).filter( |         names = [ | ||||||
|                 PermissionBackend.filter_queryset(self.request, Remittance, "view")).all(), |             "opened_remittances", | ||||||
|             prefix="opened-remittances-", |             "closed_remittances", | ||||||
|         ) |             "special_transactions_no_remittance", | ||||||
|         opened_remittances.paginate(page=self.request.GET.get("opened-remittances-page", 1), per_page=10) |             "special_transactions_with_remittance", | ||||||
|         context["opened_remittances"] = opened_remittances |         ] | ||||||
|  |         for name, table in zip(names, tables): | ||||||
|         closed_remittances = RemittanceTable( |             context[name] = table | ||||||
|             data=Remittance.objects.filter(closed=True).filter( |  | ||||||
|                 PermissionBackend.filter_queryset(self.request, Remittance, "view")).all(), |  | ||||||
|             prefix="closed-remittances-", |  | ||||||
|         ) |  | ||||||
|         closed_remittances.paginate(page=self.request.GET.get("closed-remittances-page", 1), per_page=10) |  | ||||||
|         context["closed_remittances"] = closed_remittances |  | ||||||
|  |  | ||||||
|         no_remittance_tr = SpecialTransactionTable( |  | ||||||
|             data=SpecialTransaction.objects.filter(source__in=NoteSpecial.objects.filter(~Q(remittancetype=None)), |  | ||||||
|                                                    specialtransactionproxy__remittance=None).filter( |  | ||||||
|                 PermissionBackend.filter_queryset(self.request, Remittance, "view")).all(), |  | ||||||
|             exclude=('remittance_remove', ), |  | ||||||
|             prefix="no-remittance-", |  | ||||||
|         ) |  | ||||||
|         no_remittance_tr.paginate(page=self.request.GET.get("no-remittance-page", 1), per_page=10) |  | ||||||
|         context["special_transactions_no_remittance"] = no_remittance_tr |  | ||||||
|  |  | ||||||
|         with_remittance_tr = SpecialTransactionTable( |  | ||||||
|             data=SpecialTransaction.objects.filter(source__in=NoteSpecial.objects.filter(~Q(remittancetype=None)), |  | ||||||
|                                                    specialtransactionproxy__remittance__closed=False).filter( |  | ||||||
|                 PermissionBackend.filter_queryset(self.request, Remittance, "view")).all(), |  | ||||||
|             exclude=('remittance_add', ), |  | ||||||
|             prefix="with-remittance-", |  | ||||||
|         ) |  | ||||||
|         with_remittance_tr.paginate(page=self.request.GET.get("with-remittance-page", 1), per_page=10) |  | ||||||
|         context["special_transactions_with_remittance"] = with_remittance_tr |  | ||||||
|  |  | ||||||
|         return context |         return context | ||||||
|  |  | ||||||
|  |  | ||||||
| class RemittanceUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): | class RemittanceUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableMixin, UpdateView): | ||||||
|     """ |     """ | ||||||
|     Update Remittance |     Update Remittance | ||||||
|     """ |     """ | ||||||
| @@ -325,19 +321,18 @@ class RemittanceUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView) | |||||||
|     form_class = RemittanceForm |     form_class = RemittanceForm | ||||||
|     extra_context = {"title": _("Update a remittance")} |     extra_context = {"title": _("Update a remittance")} | ||||||
|  |  | ||||||
|  |     table_class = SpecialTransactionTable | ||||||
|  |     context_table_name = "special_transactions" | ||||||
|  |  | ||||||
|     def get_success_url(self): |     def get_success_url(self): | ||||||
|         return reverse_lazy('treasury:remittance_list') |         return reverse_lazy('treasury:remittance_list') | ||||||
|  |  | ||||||
|     def get_context_data(self, **kwargs): |     def get_table_data(self): | ||||||
|         context = super().get_context_data(**kwargs) |         return SpecialTransaction.objects.filter(specialtransactionproxy__remittance=self.object).filter( | ||||||
|  |             PermissionBackend.filter_queryset(self.request, Remittance, "view")) | ||||||
|  |  | ||||||
|         data = SpecialTransaction.objects.filter(specialtransactionproxy__remittance=self.object).filter( |     def get_table_kwargs(self): | ||||||
|             PermissionBackend.filter_queryset(self.request, Remittance, "view")).all() |         return {"exclude": ('remittance_add', 'remittance_remove', ) if self.object.closed else ('remittance_add', )} | ||||||
|         context["special_transactions"] = SpecialTransactionTable( |  | ||||||
|             data=data, |  | ||||||
|             exclude=('remittance_add', 'remittance_remove', ) if self.object.closed else ('remittance_add', )) |  | ||||||
|  |  | ||||||
|         return context |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class LinkTransactionToRemittanceView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): | class LinkTransactionToRemittanceView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView): | ||||||
|   | |||||||
| @@ -22,7 +22,7 @@ from django.views import View | |||||||
| from django.views.generic import DetailView, UpdateView, RedirectView, TemplateView | from django.views.generic import DetailView, UpdateView, RedirectView, TemplateView | ||||||
| from django.utils.translation import gettext_lazy as _ | from django.utils.translation import gettext_lazy as _ | ||||||
| from django.views.generic.edit import BaseFormView, DeleteView | from django.views.generic.edit import BaseFormView, DeleteView | ||||||
| from django_tables2 import SingleTableView | from django_tables2 import SingleTableView, MultiTableMixin | ||||||
| from member.models import Membership, Club | from member.models import Membership, Club | ||||||
| from note.models import Transaction, NoteClub, Alias, SpecialTransaction, NoteSpecial | from note.models import Transaction, NoteClub, Alias, SpecialTransaction, NoteSpecial | ||||||
| from note.tables import HistoryTable | from note.tables import HistoryTable | ||||||
| @@ -100,7 +100,7 @@ class WEICreateView(ProtectQuerysetMixin, ProtectedCreateView): | |||||||
|         return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.pk}) |         return reverse_lazy("wei:wei_detail", kwargs={"pk": self.object.pk}) | ||||||
|  |  | ||||||
|  |  | ||||||
| class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, DetailView): | ||||||
|     """ |     """ | ||||||
|     View WEI information |     View WEI information | ||||||
|     """ |     """ | ||||||
| @@ -108,34 +108,40 @@ class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|     context_object_name = "club" |     context_object_name = "club" | ||||||
|     extra_context = {"title": _("WEI Detail")} |     extra_context = {"title": _("WEI Detail")} | ||||||
|  |  | ||||||
|     def get_context_data(self, **kwargs): |     tables = [ | ||||||
|         context = super().get_context_data(**kwargs) |         lambda data: HistoryTable(data, prefix="history-"), | ||||||
|  |         lambda data: WEIMembershipTable(data, prefix="membership-"), | ||||||
|         club = context["club"] |         lambda data: WEIRegistrationTable(data, prefix="pre-registration-"), | ||||||
|  |         lambda data: BusTable(data, prefix="bus-"), | ||||||
|  |     ] | ||||||
|  |     paginate_by = 20   # number of rows in tables | ||||||
|  |  | ||||||
|  |     def get_tables_data(self): | ||||||
|  |         club = self.object | ||||||
|         club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note)) \ |         club_transactions = Transaction.objects.all().filter(Q(source=club.note) | Q(destination=club.note)) \ | ||||||
|             .filter(PermissionBackend.filter_queryset(self.request, Transaction, "view")) \ |             .filter(PermissionBackend.filter_queryset(self.request, Transaction, "view")) \ | ||||||
|             .order_by('-created_at', '-id') |             .order_by('-created_at', '-id') | ||||||
|         history_table = HistoryTable(club_transactions, prefix="history-") |  | ||||||
|         history_table.paginate(per_page=20, page=self.request.GET.get('history-page', 1)) |  | ||||||
|         context['history_list'] = history_table |  | ||||||
|  |  | ||||||
|         club_member = WEIMembership.objects.filter( |         club_member = WEIMembership.objects.filter( | ||||||
|             club=club, |             club=club, | ||||||
|             date_end__gte=date.today(), |             date_end__gte=date.today(), | ||||||
|         ).filter(PermissionBackend.filter_queryset(self.request, WEIMembership, "view")) |         ).filter(PermissionBackend.filter_queryset(self.request, WEIMembership, "view")) | ||||||
|         membership_table = WEIMembershipTable(data=club_member, prefix="membership-") |  | ||||||
|         membership_table.paginate(per_page=20, page=self.request.GET.get('membership-page', 1)) |  | ||||||
|         context['member_list'] = membership_table |  | ||||||
|  |  | ||||||
|         pre_registrations = WEIRegistration.objects.filter( |         pre_registrations = WEIRegistration.objects.filter( | ||||||
|             PermissionBackend.filter_queryset(self.request, WEIRegistration, "view")).filter( |             PermissionBackend.filter_queryset(self.request, WEIRegistration, "view")).filter( | ||||||
|             membership=None, |             membership=None, | ||||||
|             wei=club |             wei=club | ||||||
|         ) |         ) | ||||||
|         pre_registrations_table = WEIRegistrationTable(data=pre_registrations, prefix="pre-registration-") |         buses = Bus.objects.filter(PermissionBackend.filter_queryset(self.request, Bus, "view")) \ | ||||||
|         pre_registrations_table.paginate(per_page=20, page=self.request.GET.get('pre-registration-page', 1)) |             .filter(wei=self.object).annotate(count=Count("memberships")).order_by("name") | ||||||
|         context['pre_registrations'] = pre_registrations_table |         return [club_transactions, club_member, pre_registrations, buses, ] | ||||||
|  |  | ||||||
|  |     def get_context_data(self, **kwargs): | ||||||
|  |         context = super().get_context_data(**kwargs) | ||||||
|  |  | ||||||
|  |         club = context["club"] | ||||||
|  |  | ||||||
|  |         tables = context["tables"] | ||||||
|  |         for name, table in zip(["history_list", "member_list", "pre_registrations", "buses"], tables): | ||||||
|  |             context[name] = table | ||||||
|  |  | ||||||
|         my_registration = WEIRegistration.objects.filter(wei=club, user=self.request.user) |         my_registration = WEIRegistration.objects.filter(wei=club, user=self.request.user) | ||||||
|         if my_registration.exists(): |         if my_registration.exists(): | ||||||
| @@ -144,11 +150,6 @@ class WEIDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): | |||||||
|             my_registration = None |             my_registration = None | ||||||
|         context["my_registration"] = my_registration |         context["my_registration"] = my_registration | ||||||
|  |  | ||||||
|         buses = Bus.objects.filter(PermissionBackend.filter_queryset(self.request, Bus, "view")) \ |  | ||||||
|             .filter(wei=self.object).annotate(count=Count("memberships")).order_by("name") |  | ||||||
|         bus_table = BusTable(data=buses, prefix="bus-") |  | ||||||
|         context['buses'] = bus_table |  | ||||||
|  |  | ||||||
|         random_user = User.objects.filter(~Q(wei__wei__in=[club])).first() |         random_user = User.objects.filter(~Q(wei__wei__in=[club])).first() | ||||||
|  |  | ||||||
|         if random_user is None: |         if random_user is None: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user