Skip to content

Commit e551623

Browse files
authored
fix: Improvements to registration admin views (#9185)
* fix: add tickets to Registration admin * fix: more improvements to registration admin views * fix: add ignore for mypy * fix: remove unused import * fix: add new admin templates to TEST_TEMPLATE_IGNORE * fix: use full path for TEST_TEMPLATE_IGNORE
1 parent b766eaf commit e551623

File tree

4 files changed

+70
-8
lines changed

4 files changed

+70
-8
lines changed

ietf/meeting/admin.py

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33

44

55
from django.contrib import admin
6+
from django.db.models import Count
67

78
from ietf.meeting.models import (Attended, Meeting, Room, Session, TimeSlot, Constraint, Schedule,
89
SchedTimeSessAssignment, ResourceAssociation, FloorPlan, UrlResource,
910
SessionPresentation, ImportantDate, SlideSubmission, SchedulingEvent, BusinessConstraint,
10-
ProceedingsMaterial, MeetingHost, Registration, RegistrationTicket)
11+
ProceedingsMaterial, MeetingHost, Registration, RegistrationTicket,
12+
AttendanceTypeName)
1113

1214

1315
class UrlResourceAdmin(admin.ModelAdmin):
@@ -219,32 +221,70 @@ class MeetingFilter(admin.SimpleListFilter):
219221
parameter_name = 'meeting_id'
220222

221223
def lookups(self, request, model_admin):
222-
# Your queryset to limit choices
223-
choices = Meeting.objects.filter(type='ietf').values_list('id', 'number')
224+
# only include meetings with registration records
225+
meetings = Meeting.objects.filter(type='ietf').annotate(reg_count=Count('registration')).filter(reg_count__gt=0).order_by('-date')
226+
choices = meetings.values_list('id', 'number')
224227
return choices
225228

226229
def queryset(self, request, queryset):
227230
if self.value():
228231
return queryset.filter(meeting__id=self.value())
229232
return queryset
230233

234+
class AttendanceFilter(admin.SimpleListFilter):
235+
title = 'Attendance Type'
236+
parameter_name = 'attendance_type'
237+
238+
def lookups(self, request, model_admin):
239+
choices = AttendanceTypeName.objects.all().values_list('slug', 'name')
240+
return choices
241+
242+
def queryset(self, request, queryset):
243+
if self.value():
244+
return queryset.filter(tickets__attendance_type__slug=self.value()).distinct()
245+
return queryset
246+
231247
class RegistrationTicketInline(admin.TabularInline):
232248
model = RegistrationTicket
233249

234250
class RegistrationAdmin(admin.ModelAdmin):
235251
model = Registration
236-
# list_filter = [('meeting', Meeting.objects.filter(type='ietf')), ]
237-
list_filter = [MeetingFilter, ]
238-
list_display = ['meeting', 'first_name', 'last_name', 'affiliation', 'country_code', 'person', 'email', ]
239-
search_fields = ['meeting__number', 'first_name', 'last_name', 'affiliation', 'country_code', 'email', ]
252+
list_filter = [AttendanceFilter, MeetingFilter]
253+
list_display = ['meeting', 'first_name', 'last_name', 'display_attendance', 'affiliation', 'country_code', 'email', ]
254+
search_fields = ['first_name', 'last_name', 'affiliation', 'country_code', 'email', ]
240255
raw_id_fields = ['person']
241256
inlines = [RegistrationTicketInline, ]
257+
ordering = ['-meeting__date', 'last_name']
258+
259+
def display_attendance(self, instance):
260+
'''Only display the most significant ticket in the list.
261+
To see all the tickets inspect the individual instance
262+
'''
263+
if instance.tickets.filter(attendance_type__slug='onsite').exists():
264+
return 'onsite'
265+
elif instance.tickets.filter(attendance_type__slug='remote').exists():
266+
return 'remote'
267+
elif instance.tickets.filter(attendance_type__slug='hackathon_onsite').exists():
268+
return 'hackathon onsite'
269+
elif instance.tickets.filter(attendance_type__slug='hackathon_remote').exists():
270+
return 'hackathon remote'
271+
display_attendance.short_description = "Attendance" # type: ignore # https://github.com/python/mypy/issues/2087
272+
242273
admin.site.register(Registration, RegistrationAdmin)
243274

244275
class RegistrationTicketAdmin(admin.ModelAdmin):
245276
model = RegistrationTicket
246277
list_filter = ['attendance_type', ]
247-
list_display = ['registration', 'attendance_type', 'ticket_type']
278+
# not available until Django 5.2, the name of a related field, using the __ notation
279+
# list_display = ['registration__meeting', 'registration', 'attendance_type', 'ticket_type', 'registration__email']
280+
# list_select_related = ('registration',)
281+
list_display = ['registration', 'attendance_type', 'ticket_type', 'display_meeting']
248282
search_fields = ['registration__first_name', 'registration__last_name', 'registration__email']
249283
raw_id_fields = ['registration']
284+
ordering = ['-registration__meeting__date', 'registration__last_name']
285+
286+
def display_meeting(self, instance):
287+
return instance.registration.meeting.number
288+
display_meeting.short_description = "Meeting" # type: ignore # https://github.com/python/mypy/issues/2087
289+
250290
admin.site.register(RegistrationTicket, RegistrationTicketAdmin)

ietf/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,8 @@ def skip_unreadable_post(record):
729729
"*~", # tilde temp-files
730730
"#*", # files beginning with a hashmark
731731
"500.html", # isn't loaded by regular loader, but checked by test_500_page()
732+
"ietf/templates/admin/meeting/RegistrationTicket/change_list.html",
733+
"ietf/templates/admin/meeting/Registration/change_list.html",
732734
]
733735

734736
TEST_COVERAGE_MAIN_FILE = os.path.join(BASE_DIR, "../release-coverage.json")
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{% extends "admin/change_list.html" %}
2+
3+
{% block search %}
4+
{{ block.super }} {# This includes the original search form #}
5+
{% if cl.search_fields %} {# Only show if search is enabled for the model #}
6+
<p class="search-help-text" style="font-size: 0.85em; color: #666; margin-top: 5px;">
7+
Hint: Search by: {{ cl.search_fields|join:", "|capfirst }}.
8+
</p>
9+
{% endif %}
10+
{% endblock %}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{% extends "admin/change_list.html" %}
2+
3+
{% block search %}
4+
{{ block.super }} {# This includes the original search form #}
5+
{% if cl.search_fields %} {# Only show if search is enabled for the model #}
6+
<p class="search-help-text" style="font-size: 0.85em; color: #666; margin-top: 5px;">
7+
Hint: Search by: {{ cl.search_fields|join:", "|capfirst }}.
8+
</p>
9+
{% endif %}
10+
{% endblock %}

0 commit comments

Comments
 (0)