Coverage for website/education/admin.py: 71.67%
58 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.contrib import admin
4from django.contrib.admin import ModelAdmin
5from django.http import HttpResponse
6from django.utils.translation import gettext_lazy as _
8from . import models
9from .forms import SummaryAdminForm
11admin.site.register(models.Category)
14@admin.register(models.Course)
15class CourseAdmin(ModelAdmin):
16 fields = (
17 "name",
18 "course_code",
19 "ec",
20 "since",
21 "until",
22 "categories",
23 "old_courses",
24 )
25 list_filter = ("categories", "ec")
26 search_fields = ("name", "course_code")
29class WithDownloadCsv:
30 def download_csv(self, request, queryset):
31 opts = queryset.model._meta
32 response = HttpResponse(content_type="text/csv")
33 # force download.
34 response["Content-Disposition"] = "attachment;filename=export.csv"
35 # the csv writer
36 writer = csv.writer(response)
37 field_names = [field.name for field in opts.fields]
38 # Write a first row with header information
39 writer.writerow(field_names)
40 # Write data rows
41 for obj in queryset:
42 writer.writerow([getattr(obj, field) for field in field_names])
43 return response
45 download_csv.short_description = _("Download marked as csv")
48@admin.register(models.Exam)
49class ExamAdmin(ModelAdmin, WithDownloadCsv):
50 list_display = (
51 "type",
52 "course",
53 "exam_date",
54 "uploader",
55 "accepted",
56 "language",
57 "download_count",
58 )
59 readonly_fields = ("download_count",)
60 list_filter = ("accepted", "exam_date", "type", "language")
61 search_fields = (
62 "name",
63 "uploader__first_name",
64 "uploader__last_name",
65 "course__name",
66 )
67 actions = ["accept", "reject", "reset_download_count", "download_csv"]
69 def accept(self, request, queryset):
70 queryset.update(accepted=True)
72 accept.short_description = _("Mark exams as accepted")
74 def reject(self, request, queryset):
75 queryset.update(accepted=False)
77 reject.short_description = _("Mark exams as rejected")
79 def reset_download_count(self, request, queryset):
80 queryset.update(download_count=0)
82 reset_download_count.short_description = _("Reset the marked exams download count")
85@admin.register(models.Summary)
86class SummaryAdmin(ModelAdmin, WithDownloadCsv):
87 list_display = (
88 "name",
89 "course",
90 "uploader",
91 "accepted",
92 "language",
93 "download_count",
94 )
95 readonly_fields = ("download_count",)
96 list_filter = ("accepted", "language")
97 search_fields = (
98 "name",
99 "uploader__first_name",
100 "uploader__last_name",
101 "course__name",
102 )
103 actions = ["accept", "reject", "reset_download_count", "download_csv"]
104 form = SummaryAdminForm
106 def accept(self, request, queryset):
107 queryset.update(accepted=True)
109 accept.short_description = _("Mark summaries as accepted")
111 def reject(self, request, queryset):
112 queryset.update(accepted=False)
114 reject.short_description = _("Mark summaries as rejected")
116 def reset_download_count(self, request, queryset):
117 queryset.update(download_count=0)
119 reset_download_count.short_description = _(
120 "Reset the marked summaries download count"
121 )