diff --git a/marietje/songs/admin.py b/marietje/songs/admin.py index 79f456a..aa8f36f 100644 --- a/marietje/songs/admin.py +++ b/marietje/songs/admin.py @@ -1,4 +1,5 @@ from django.contrib import admin +from django.db.models import Count from .models import ReportNote, Song @@ -7,15 +8,37 @@ class ReportNoteInline(admin.StackedInline): model = ReportNote extra = 0 +class SongHasReportNoteFilter(admin.SimpleListFilter): + title = 'report notes' + parameter_name = 'reportnotes' + + def lookups(self, request, model_admin): + return ( + ('yes', 'yes'), + ('no', 'no'), + ) + + def queryset(self, request, queryset): + queryset = queryset.annotate(num_reports=Count('reportnote')) + if self.value() == 'yes': + return queryset.exclude(num_reports=0) + if self.value() == 'no': + return queryset.filter(num_reports=0) + return queryset + + @admin.register(Song) class SongAdmin(admin.ModelAdmin): list_display = ('artist', 'title', 'user_name', 'reports') + list_display_links = ('artist', 'title') + list_filter = (SongHasReportNoteFilter,) search_fields = ('artist', 'title', 'user__name') inlines = [ReportNoteInline] @staticmethod def reports(song): - return ReportNote.objects.filter(song=song).count() + # num_reports is annotated by SongHasReportNoteFilter + return song.num_reports @staticmethod def user_name(song):