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"