Source code for oioioi.disqualification.admin

from django.contrib.auth.models import User
from django.db import models
from django.forms import Textarea
from django.urls import reverse
from django.utils.encoding import force_str
from django.utils.translation import gettext_lazy as _

from oioioi.base import admin
from oioioi.base.utils import make_html_link
from oioioi.contests.admin import ContestAdmin, contest_site
from oioioi.contests.menu import contest_admin_menu_registry
from oioioi.contests.models import Submission
from oioioi.contests.utils import is_contest_admin
from oioioi.disqualification.models import Disqualification, DisqualificationsConfig


[docs]class DisqualificationAdmin(admin.ModelAdmin):
[docs] list_display = ['id', 'title', 'submission_link', 'user_full_name', 'guilty_text']
[docs] list_filter = ['guilty']
[docs] search_fields = ['title', 'user__username', 'user__last_name']
[docs] raw_id_fields = ['submission']
[docs] exclude = ['contest']
[docs] def has_add_permission(self, request): return is_contest_admin(request)
[docs] def has_change_permission(self, request, obj=None): return is_contest_admin(request)
[docs] def has_delete_permission(self, request, obj=None): return self.has_change_permission(request, obj)
[docs] def save_model(self, request, obj, form, change): # It's hard in django to autofill the 'user' field, when only # 'submission' is selected. This is because django.forms.models.py # calls _post_clean() even if there were errors in clean() obj.contest = request.contest obj.save()
[docs] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'submission': qs = Submission.objects.filter(user__isnull=False) if request.contest: qs = qs.filter(problem_instance__contest=request.contest) kwargs['queryset'] = qs if db_field.name == 'user': qs = User.objects.all() if request.contest: qs = request.contest.controller.registration_controller().filter_participants( qs ) kwargs['queryset'] = qs return super(DisqualificationAdmin, self).formfield_for_foreignkey( db_field, request, **kwargs )
[docs] submission_link.short_description = _("Submission")
[docs] def user_full_name(self, instance): return instance.user.get_full_name()
user_full_name.short_description = _("User name")
[docs] user_full_name.admin_order_field = 'user__last_name'
[docs] def guilty_text(self, instance): return _("Yes") if instance.guilty else _("No")
guilty_text.short_description = _("Guilty") guilty_text.admin_order_field = 'guilty'
[docs] def get_queryset(self, request): return ( super(DisqualificationAdmin, self) .get_queryset(request) .filter(contest=request.contest) .order_by('-id') )
contest_site.contest_register(Disqualification, DisqualificationAdmin) contest_admin_menu_registry.register( 'disqualification_admin', _("Custom disqualification"), lambda request: reverse('oioioiadmin:disqualification_disqualification_changelist'), is_contest_admin, order=100, )
[docs]class DisqualificationsConfigInline(admin.TabularInline):
[docs] model = DisqualificationsConfig
[docs] category = _("Advanced")
[docs] formfield_overrides = { models.TextField: {'widget': Textarea(attrs={'rows': 2})}, }
[docs] def has_add_permission(self, request, obj=None): return is_contest_admin(request)
[docs] def has_change_permission(self, request, obj=None): return is_contest_admin(request)
[docs] def has_delete_permission(self, request, obj=None): return is_contest_admin(request)
[docs]class DisqualificationsAdminMixin(object): """Adds :class:`~oioioi.disqualification.models.DisqualificationsConfigInline` to an admin panel.""" def __init__(self, *args, **kwargs): super(DisqualificationsAdminMixin, self).__init__(*args, **kwargs) self.inlines = tuple(self.inlines) + (DisqualificationsConfigInline,)
ContestAdmin.mix_in(DisqualificationsAdminMixin)