from operator import attrgetter from django.contrib import admin from django.utils.html import format_html from django.urls import reverse from django.utils.translation import gettext, gettext_lazy as _, ungettext from django.forms import ModelForm from judge.models import VolunteerProblemVote from judge.widgets import AdminSelect2MultipleWidget class VolunteerProblemVoteForm(ModelForm): class Meta: widgets = { "types": AdminSelect2MultipleWidget, } class VolunteerProblemVoteAdmin(admin.ModelAdmin): form = VolunteerProblemVoteForm fields = ( "voter", "problem_link", "time", "thinking_points", "knowledge_points", "types", "feedback", ) readonly_fields = ("time", "problem_link", "voter") list_display = ( "voter", "problem_link", "thinking_points", "knowledge_points", "show_types", "feedback", ) search_fields = ( "voter__user__username", "problem__code", "problem__name", ) date_hierarchy = "time" def problem_link(self, obj): if self.request.user.is_superuser: url = reverse("admin:judge_problem_change", args=(obj.problem.id,)) else: url = reverse("problem_detail", args=(obj.problem.code,)) return format_html(f"{obj.problem}") problem_link.short_description = _("Problem") problem_link.admin_order_field = "problem__code" def show_types(self, obj): return ", ".join(map(attrgetter("name"), obj.types.all())) show_types.short_description = _("Types") def get_queryset(self, request): self.request = request if request.user.is_superuser: return super().get_queryset(request) queryset = VolunteerProblemVote.objects.prefetch_related("voter") return queryset.filter(voter=request.profile).distinct()