from django.contrib import admin from django.db.models import Count from django.urls import reverse from django.utils.html import format_html from .models import ReportNote, Song class ReportNoteInline(admin.StackedInline): model = ReportNote extra = 0 autocomplete_fields = ("user",) 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] autocomplete_fields = ("user",) @staticmethod def reports(song): # num_reports is annotated by SongHasReportNoteFilter return song.num_reports @staticmethod def user_name(song): try: return song.user.name except AttributeError: return "" @staticmethod def get_readonly_fields(request, obj=None): return [] if request.user.is_superuser else ["hash"] @admin.register(ReportNote) class ReportNoteAdmin(admin.ModelAdmin): exclude = ("song",) list_display = ("song", "note", "user") search_fields = ("song__artist", "song__title", "user__name") autocomplete_fields = ("user",) readonly_fields = ("song_link",) @staticmethod def song_link(note): url = reverse("admin:songs_song_change", args=(note.song.id,)) return format_html("{song}", url=url, song=note.song) song_link.short_description = "Song link"