Coverage for website/activemembers/views.py: 56.34%
69 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1import datetime
3from django.db.models import QuerySet
4from django.http import HttpResponse
5from django.shortcuts import get_object_or_404
6from django.views.generic import DetailView, ListView
8from utils.media.services import fetch_thumbnails
9from utils.snippets import datetime_to_lectureyear
11from .models import Board, Committee, MemberGroupMembership, Society
14class _MemberGroupDetailView(DetailView):
15 """Base view for membergroup details."""
17 context_object_name = "membergroup"
19 def _get_memberships(self, group):
20 return MemberGroupMembership.active_objects.filter(group=group)
22 def get_context_data(self, **kwargs) -> dict:
23 context = super().get_context_data(**kwargs)
25 memberships = (
26 self._get_memberships(context["membergroup"])
27 .select_related("member__profile")
28 .prefetch_related("member__membergroupmembership_set")
29 )
30 members = [
31 {
32 "member": x.member,
33 "chair": x.chair,
34 "role": x.role,
35 "since": x.initial_connected_membership.since,
36 "until": (
37 None
38 if x.latest_connected_membership.until
39 == context["membergroup"].until
40 else x.latest_connected_membership.until
41 ),
42 "is_board": hasattr(x.group, "board"),
43 }
44 for x in memberships
45 ]
47 members.sort(key=lambda x: x["since"])
49 context.update({"members": members})
50 fetch_thumbnails([m["member"].profile.photo for m in members])
51 return context
54class CommitteeIndexView(ListView):
55 """View that renders the committee overview page."""
57 template_name = "activemembers/committee_index.html"
58 context_object_name = "committees"
60 def get_queryset(self) -> QuerySet:
61 committees = Committee.active_objects.all()
62 fetch_thumbnails([c.photo for c in committees])
63 return committees
65 def get_ordering(self) -> str:
66 return "name"
69class CommitteeDetailView(_MemberGroupDetailView):
70 """View that renders the page of one selected committee."""
72 template_name = "activemembers/committee_detail.html"
73 model = Committee
76class SocietyIndexView(ListView):
77 """View that renders the societies overview page."""
79 template_name = "activemembers/society_index.html"
80 context_object_name = "societies"
82 def get_queryset(self) -> QuerySet:
83 societies = Society.active_objects.all()
84 fetch_thumbnails([s.photo for s in societies])
85 return societies
87 def get_ordering(self) -> str:
88 return "name"
91class SocietyDetailView(_MemberGroupDetailView):
92 """View that renders the page of one selected society."""
94 template_name = "activemembers/society_detail.html"
95 model = Society
98class BoardIndexView(ListView):
99 """View that renders the board overview page."""
101 template_name = "activemembers/board_index.html"
102 context_object_name = "old_boards"
103 current_board = None
105 def get_queryset(self) -> QuerySet:
106 if self.current_board:
107 boards = Board.objects.exclude(pk=self.current_board.pk)
108 else:
109 boards = Board.objects.all()
110 fetch_thumbnails([b.photo for b in boards])
111 return boards
113 def get_context_data(self, **kwargs) -> dict:
114 context = super().get_context_data(**kwargs)
115 context.update({"current_board": self.current_board})
116 return context
118 def dispatch(self, request, *args, **kwargs) -> HttpResponse:
119 lecture_year = datetime_to_lectureyear(datetime.date.today())
120 self.current_board = Board.objects.filter(
121 since__year=lecture_year, until__year=lecture_year + 1
122 ).first()
123 return super().dispatch(request, *args, **kwargs)
126class BoardDetailView(_MemberGroupDetailView):
127 """View that renders the page of one selected board."""
129 template_name = "activemembers/board_detail.html"
130 context_object_name = "membergroup"
132 def _get_memberships(self, group):
133 return MemberGroupMembership.objects.filter(group=group)
135 def get_object(self, queryset=None) -> Board:
136 return get_object_or_404(
137 Board,
138 since__year=self.kwargs.get("since"),
139 until__year=self.kwargs.get("until"),
140 )