Coverage for website/thabloid/admin.py: 56.58%

70 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1import csv 

2 

3from django import forms 

4from django.contrib import admin 

5from django.http import HttpResponse 

6from django.utils import timezone 

7 

8from queryable_properties.admin import QueryablePropertiesAdmin 

9 

10from thabloid.models.thabloid import Thabloid 

11from thabloid.models.thabloid_user import ThabloidUser 

12from utils.snippets import datetime_to_lectureyear 

13 

14 

15def association_year_choices(): 

16 """Return the academic years Thalia existed.""" 

17 current_year = datetime_to_lectureyear(timezone.now()) 

18 

19 choices = [] 

20 for year in range(1990, current_year + 2): 

21 choices.append((year, f"{year}-{year + 1}")) 

22 choices.reverse() 

23 

24 return choices 

25 

26 

27class ThabloidAdminForm(forms.ModelForm): 

28 """Admin form for Thabloid objects.""" 

29 

30 def __init__(self, *args, **kwargs): 

31 """Initialize form and set the year choices.""" 

32 super().__init__(*args, **kwargs) 

33 

34 self.initial["year"] = datetime_to_lectureyear(timezone.now()) 

35 self.fields["year"] = forms.ChoiceField( 

36 label="Academic year", choices=association_year_choices() 

37 ) 

38 

39 

40@admin.register(Thabloid) 

41class ThabloidAdmin(admin.ModelAdmin): 

42 """Admin class for Thabloid objects.""" 

43 

44 form = ThabloidAdminForm 

45 list_filter = ("year",) 

46 

47 

48@admin.register(ThabloidUser) 

49class ThabloidUserAdmin(QueryablePropertiesAdmin): 

50 """Admin that shows only current members that want to receive the Thabloid.""" 

51 

52 list_display = ("first_name", "last_name", "address") 

53 

54 fields = ( 

55 "first_name", 

56 "last_name", 

57 "street", 

58 "street2", 

59 "postal_code", 

60 "city", 

61 "country", 

62 ) 

63 readonly_fields = fields 

64 

65 actions = ["address_csv_export"] 

66 

67 def get_queryset(self, request): 

68 qs = ThabloidUser.current_members.filter(blacklistedthabloiduser__isnull=True) 

69 

70 ordering = self.get_ordering(request) 

71 if ordering: 

72 qs = qs.order_by(*ordering) 

73 

74 return qs 

75 

76 @admin.display(description="Address") 

77 def street(self, obj): 

78 return obj.profile.address_street 

79 

80 @admin.display(description="Address line 2") 

81 def street2(self, obj): 

82 return obj.profile.address_street 

83 

84 @admin.display(description="Postal code") 

85 def postal_code(self, obj): 

86 return obj.profile.address_postal_code 

87 

88 @admin.display(description="City") 

89 def city(self, obj): 

90 return obj.profile.address_city 

91 

92 @admin.display(description="Country") 

93 def country(self, obj): 

94 return obj.profile.get_address_country_display() 

95 

96 @admin.display(description="Address (short)") 

97 def address(self, obj): 

98 return f"{obj.profile.address_street}, {obj.profile.address_postal_code}, {obj.profile.address_city}" 

99 

100 def has_change_permission(self, request, obj=None): 

101 return False 

102 

103 def has_add_permission(self, request): 

104 return False 

105 

106 def has_delete_permission(self, request, obj=None): 

107 return False 

108 

109 def address_csv_export(self, request, queryset): 

110 response = HttpResponse(content_type="text/csv") 

111 response["Content-Disposition"] = 'attachment;filename="thabloid_addresses.csv"' 

112 writer = csv.writer(response) 

113 writer.writerow( 

114 [ 

115 "First name", 

116 "Last name", 

117 "Address", 

118 "Address line 2", 

119 "Postal code", 

120 "City", 

121 "Country", 

122 ] 

123 ) 

124 for user in queryset.exclude(profile=None): 

125 writer.writerow( 

126 [ 

127 user.first_name, 

128 user.last_name, 

129 user.profile.address_street, 

130 user.profile.address_street2, 

131 user.profile.address_postal_code, 

132 user.profile.address_city, 

133 user.profile.get_address_country_display(), 

134 ] 

135 ) 

136 return response 

137 

138 address_csv_export.short_description = "Download addresses for selected users"