Skip to content

Commit 960894d

Browse files
Improve Django admin site user experience
* This covers all model admin pages. * Avoid filters and select dropdowns that list all records from the database and thereby load very slowly. * Add useful columns to the list pages. * Add useful filters (in the right-hand side box) to the list pages. * Add useful fields to the search.
1 parent 0c60dc2 commit 960894d

File tree

10 files changed

+444
-69
lines changed

10 files changed

+444
-69
lines changed

course/admin.py

+79-27
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
UserTag,
1313
UserTagging,
1414
)
15-
from userprofile.models import UserProfile
15+
from lib.admin_helpers import RecentCourseInstanceListFilter
1616

1717

1818
def instance_url(instance):
@@ -28,26 +28,18 @@ class CourseAdmin(admin.ModelAdmin):
2828
search_fields = (
2929
'name',
3030
'code',
31+
'url',
32+
)
33+
list_display_links = (
34+
'id',
35+
'name',
3136
)
32-
list_display_links = ('id',)
3337
list_display = (
3438
'id',
3539
'name',
3640
'code',
3741
'url',
3842
)
39-
# list_editable = (
40-
# 'name',
41-
# 'code',
42-
# )
43-
44-
def get_queryset(self,
45-
request):
46-
if not request.user.is_superuser:
47-
profile = UserProfile.get_by_request(request)
48-
return CourseInstance.objects.get_teaching(profile)
49-
else:
50-
return self.model.objects.filter()
5143

5244

5345
class CourseInstanceAdmin(admin.ModelAdmin):
@@ -71,14 +63,12 @@ class CourseInstanceAdmin(admin.ModelAdmin):
7163
'starting_time',
7264
'ending_time',
7365
)
66+
raw_id_fields = ('course',)
7467

75-
def get_queryset(self,
76-
request):
77-
if not request.user.is_superuser:
78-
profile = UserProfile.get_by_request(request)
79-
return self.model.objects.where_staff_includes(profile)
80-
else:
81-
return self.model.objects.all()
68+
def get_queryset(self, request):
69+
if request.user.is_superuser:
70+
return super().get_queryset(request)
71+
return CourseInstance.objects.get_teaching(request.user.userprofile)
8272

8373

8474
class EnrollmentAdmin(admin.ModelAdmin):
@@ -100,8 +90,14 @@ class EnrollmentAdmin(admin.ModelAdmin):
10090
'status',
10191
'timestamp',
10292
)
103-
list_filter = ('course_instance',)
104-
raw_id_fields = ('user_profile',)
93+
list_filter = (
94+
RecentCourseInstanceListFilter,
95+
)
96+
raw_id_fields = (
97+
'course_instance',
98+
'selected_group',
99+
'user_profile',
100+
)
105101
readonly_fields = ('timestamp',)
106102

107103

@@ -121,10 +117,11 @@ class CourseModuleAdmin(admin.ModelAdmin):
121117
instance_url,
122118
)
123119
list_filter = (
124-
'course_instance',
120+
RecentCourseInstanceListFilter,
125121
'opening_time',
126122
'closing_time',
127123
)
124+
raw_id_fields = ('course_instance',)
128125

129126

130127
class LearningObjectCategoryAdmin(admin.ModelAdmin):
@@ -139,11 +136,14 @@ class LearningObjectCategoryAdmin(admin.ModelAdmin):
139136
'course_instance',
140137
'name',
141138
)
142-
list_filter = ('course_instance',)
139+
list_filter = (
140+
RecentCourseInstanceListFilter,
141+
)
143142
ordering = (
144143
'course_instance',
145144
'id',
146145
)
146+
raw_id_fields = ('course_instance',)
147147

148148

149149
class StudentGroupAdmin(admin.ModelAdmin):
@@ -157,7 +157,26 @@ class StudentGroupAdmin(admin.ModelAdmin):
157157
'members__user__last_name',
158158
'members__user__email',
159159
)
160-
raw_id_fields = ('members',)
160+
list_display = (
161+
'course_instance',
162+
'members_string',
163+
'timestamp',
164+
)
165+
list_display_links = ('members_string',)
166+
list_filter = (
167+
RecentCourseInstanceListFilter,
168+
)
169+
raw_id_fields = (
170+
'course_instance',
171+
'members',
172+
)
173+
readonly_fields = ('timestamp',)
174+
175+
@admin.display(description=_('LABEL_MEMBERS'))
176+
def members_string(self, obj):
177+
return ", ".join(
178+
str(p) for p in obj.members.all()
179+
)
161180

162181

163182
class UserTagAdmin(admin.ModelAdmin):
@@ -167,6 +186,22 @@ class UserTagAdmin(admin.ModelAdmin):
167186
'course_instance__course__name',
168187
'course_instance__course__code'
169188
)
189+
list_display = (
190+
'course_instance',
191+
'name',
192+
'slug',
193+
'visible_to_students',
194+
)
195+
list_display_links = (
196+
'name',
197+
'slug',
198+
)
199+
list_filter = (
200+
RecentCourseInstanceListFilter,
201+
)
202+
raw_id_fields = (
203+
'course_instance',
204+
)
170205

171206

172207
class UserTaggingAdmin(admin.ModelAdmin):
@@ -181,7 +216,23 @@ class UserTaggingAdmin(admin.ModelAdmin):
181216
'user__user__last_name',
182217
'user__user__email',
183218
)
184-
raw_id_fields = ('user',)
219+
list_display = (
220+
'course_instance',
221+
'tag',
222+
'user',
223+
)
224+
list_display_links = (
225+
'tag',
226+
'user',
227+
)
228+
list_filter = (
229+
RecentCourseInstanceListFilter,
230+
)
231+
raw_id_fields = (
232+
'course_instance',
233+
'tag',
234+
'user',
235+
)
185236

186237

187238
class CourseHookAdmin(admin.ModelAdmin):
@@ -191,6 +242,7 @@ class CourseHookAdmin(admin.ModelAdmin):
191242
'course_instance__course__name',
192243
'course_instance__course__code',
193244
)
245+
raw_id_fields = ('course_instance',)
194246

195247

196248
admin.site.register(Course, CourseAdmin)

deviations/admin.py

+21-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
from django.contrib import admin
22

33
from deviations.models import DeadlineRuleDeviation, MaxSubmissionsRuleDeviation
4+
from lib.admin_helpers import RecentCourseInstanceListFilter
5+
6+
7+
class DeviationRecentCourseInstanceListFilter(RecentCourseInstanceListFilter):
8+
course_instance_query = 'exercise__course_module__course_instance'
49

510

611
class DeadlineRuleDeviationAdmin(admin.ModelAdmin):
@@ -19,8 +24,14 @@ class DeadlineRuleDeviationAdmin(admin.ModelAdmin):
1924
'granter',
2025
'grant_time',
2126
)
22-
list_filter = ('exercise__course_module__course_instance',)
23-
raw_id_fields = ('submitter','granter')
27+
list_filter = (
28+
DeviationRecentCourseInstanceListFilter,
29+
)
30+
raw_id_fields = (
31+
'exercise',
32+
'submitter',
33+
'granter',
34+
)
2435
readonly_fields = ('grant_time',)
2536

2637

@@ -40,7 +51,14 @@ class MaxSubmissionsRuleDeviationAdmin(admin.ModelAdmin):
4051
'granter',
4152
'grant_time',
4253
)
43-
raw_id_fields = ('submitter','granter')
54+
list_filter = (
55+
DeviationRecentCourseInstanceListFilter,
56+
)
57+
raw_id_fields = (
58+
'exercise',
59+
'submitter',
60+
'granter',
61+
)
4462
readonly_fields = ('grant_time',)
4563

4664

diploma/admin.py

+40-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,27 @@
44

55

66
class CourseDiplomaDesignAdmin(admin.ModelAdmin):
7-
search_fields = ('course__instance__name',)
7+
search_fields = (
8+
'course__instance_name',
9+
'course__course__code',
10+
'course__course__name',
11+
'title',
12+
)
13+
list_display = (
14+
'course',
15+
'availability',
16+
'title',
17+
'date',
18+
)
19+
list_display_links = (
20+
'course',
21+
'title',
22+
)
23+
list_filter = (
24+
('course', admin.RelatedOnlyFieldListFilter),
25+
)
826
raw_id_fields = (
27+
'course',
928
'exercises_to_pass',
1029
'modules_to_pass',
1130
)
@@ -19,8 +38,27 @@ class StudentDiplomaAdmin(admin.ModelAdmin):
1938
'profile__user__first_name',
2039
'profile__user__last_name',
2140
'profile__user__email',
41+
'design__course__instance_name',
42+
'design__course__course__code',
43+
'design__course__course__name',
44+
)
45+
list_display = (
46+
'design',
47+
'profile',
48+
'created',
49+
'grade',
50+
)
51+
list_display_links = (
52+
'profile',
53+
)
54+
list_filter = (
55+
('design__course', admin.RelatedOnlyFieldListFilter),
56+
)
57+
raw_id_fields = (
58+
'design',
59+
'profile',
2260
)
23-
raw_id_fields = ('profile',)
61+
readonly_fields = ('created',)
2462

2563

2664
admin.site.register(CourseDiplomaDesign, CourseDiplomaDesignAdmin)

0 commit comments

Comments
 (0)