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

1import csv 

2 

3from django.contrib import admin 

4from django.contrib.admin import ModelAdmin 

5from django.http import HttpResponse 

6from django.utils.translation import gettext_lazy as _ 

7 

8from . import models 

9from .forms import SummaryAdminForm 

10 

11admin.site.register(models.Category) 

12 

13 

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") 

27 

28 

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 

44 

45 download_csv.short_description = _("Download marked as csv") 

46 

47 

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"] 

68 

69 def accept(self, request, queryset): 

70 queryset.update(accepted=True) 

71 

72 accept.short_description = _("Mark exams as accepted") 

73 

74 def reject(self, request, queryset): 

75 queryset.update(accepted=False) 

76 

77 reject.short_description = _("Mark exams as rejected") 

78 

79 def reset_download_count(self, request, queryset): 

80 queryset.update(download_count=0) 

81 

82 reset_download_count.short_description = _("Reset the marked exams download count") 

83 

84 

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 

105 

106 def accept(self, request, queryset): 

107 queryset.update(accepted=True) 

108 

109 accept.short_description = _("Mark summaries as accepted") 

110 

111 def reject(self, request, queryset): 

112 queryset.update(accepted=False) 

113 

114 reject.short_description = _("Mark summaries as rejected") 

115 

116 def reset_download_count(self, request, queryset): 

117 queryset.update(download_count=0) 

118 

119 reset_download_count.short_description = _( 

120 "Reset the marked summaries download count" 

121 )