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

1import datetime 

2 

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 

7 

8from utils.media.services import fetch_thumbnails 

9from utils.snippets import datetime_to_lectureyear 

10 

11from .models import Board, Committee, MemberGroupMembership, Society 

12 

13 

14class _MemberGroupDetailView(DetailView): 

15 """Base view for membergroup details.""" 

16 

17 context_object_name = "membergroup" 

18 

19 def _get_memberships(self, group): 

20 return MemberGroupMembership.active_objects.filter(group=group) 

21 

22 def get_context_data(self, **kwargs) -> dict: 

23 context = super().get_context_data(**kwargs) 

24 

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 ] 

46 

47 members.sort(key=lambda x: x["since"]) 

48 

49 context.update({"members": members}) 

50 fetch_thumbnails([m["member"].profile.photo for m in members]) 

51 return context 

52 

53 

54class CommitteeIndexView(ListView): 

55 """View that renders the committee overview page.""" 

56 

57 template_name = "activemembers/committee_index.html" 

58 context_object_name = "committees" 

59 

60 def get_queryset(self) -> QuerySet: 

61 committees = Committee.active_objects.all() 

62 fetch_thumbnails([c.photo for c in committees]) 

63 return committees 

64 

65 def get_ordering(self) -> str: 

66 return "name" 

67 

68 

69class CommitteeDetailView(_MemberGroupDetailView): 

70 """View that renders the page of one selected committee.""" 

71 

72 template_name = "activemembers/committee_detail.html" 

73 model = Committee 

74 

75 

76class SocietyIndexView(ListView): 

77 """View that renders the societies overview page.""" 

78 

79 template_name = "activemembers/society_index.html" 

80 context_object_name = "societies" 

81 

82 def get_queryset(self) -> QuerySet: 

83 societies = Society.active_objects.all() 

84 fetch_thumbnails([s.photo for s in societies]) 

85 return societies 

86 

87 def get_ordering(self) -> str: 

88 return "name" 

89 

90 

91class SocietyDetailView(_MemberGroupDetailView): 

92 """View that renders the page of one selected society.""" 

93 

94 template_name = "activemembers/society_detail.html" 

95 model = Society 

96 

97 

98class BoardIndexView(ListView): 

99 """View that renders the board overview page.""" 

100 

101 template_name = "activemembers/board_index.html" 

102 context_object_name = "old_boards" 

103 current_board = None 

104 

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 

112 

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 

117 

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) 

124 

125 

126class BoardDetailView(_MemberGroupDetailView): 

127 """View that renders the page of one selected board.""" 

128 

129 template_name = "activemembers/board_detail.html" 

130 context_object_name = "membergroup" 

131 

132 def _get_memberships(self, group): 

133 return MemberGroupMembership.objects.filter(group=group) 

134 

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 )