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
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1import csv
3from django import forms
4from django.contrib import admin
5from django.http import HttpResponse
6from django.utils import timezone
8from queryable_properties.admin import QueryablePropertiesAdmin
10from thabloid.models.thabloid import Thabloid
11from thabloid.models.thabloid_user import ThabloidUser
12from utils.snippets import datetime_to_lectureyear
15def association_year_choices():
16 """Return the academic years Thalia existed."""
17 current_year = datetime_to_lectureyear(timezone.now())
19 choices = []
20 for year in range(1990, current_year + 2):
21 choices.append((year, f"{year}-{year + 1}"))
22 choices.reverse()
24 return choices
27class ThabloidAdminForm(forms.ModelForm):
28 """Admin form for Thabloid objects."""
30 def __init__(self, *args, **kwargs):
31 """Initialize form and set the year choices."""
32 super().__init__(*args, **kwargs)
34 self.initial["year"] = datetime_to_lectureyear(timezone.now())
35 self.fields["year"] = forms.ChoiceField(
36 label="Academic year", choices=association_year_choices()
37 )
40@admin.register(Thabloid)
41class ThabloidAdmin(admin.ModelAdmin):
42 """Admin class for Thabloid objects."""
44 form = ThabloidAdminForm
45 list_filter = ("year",)
48@admin.register(ThabloidUser)
49class ThabloidUserAdmin(QueryablePropertiesAdmin):
50 """Admin that shows only current members that want to receive the Thabloid."""
52 list_display = ("first_name", "last_name", "address")
54 fields = (
55 "first_name",
56 "last_name",
57 "street",
58 "street2",
59 "postal_code",
60 "city",
61 "country",
62 )
63 readonly_fields = fields
65 actions = ["address_csv_export"]
67 def get_queryset(self, request):
68 qs = ThabloidUser.current_members.filter(blacklistedthabloiduser__isnull=True)
70 ordering = self.get_ordering(request)
71 if ordering:
72 qs = qs.order_by(*ordering)
74 return qs
76 @admin.display(description="Address")
77 def street(self, obj):
78 return obj.profile.address_street
80 @admin.display(description="Address line 2")
81 def street2(self, obj):
82 return obj.profile.address_street
84 @admin.display(description="Postal code")
85 def postal_code(self, obj):
86 return obj.profile.address_postal_code
88 @admin.display(description="City")
89 def city(self, obj):
90 return obj.profile.address_city
92 @admin.display(description="Country")
93 def country(self, obj):
94 return obj.profile.get_address_country_display()
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}"
100 def has_change_permission(self, request, obj=None):
101 return False
103 def has_add_permission(self, request):
104 return False
106 def has_delete_permission(self, request, obj=None):
107 return False
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
138 address_csv_export.short_description = "Download addresses for selected users"