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_display_links = ['id', 'title', 'guilty_text']
[docs] list_filter = ['guilty']
[docs] search_fields = ['title', 'user__username', 'user__last_name']
[docs] raw_id_fields = ['submission']
[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 submission_link(self, instance):
if instance.submission is None:
return ''
reverse_kwargs = {
'contest_id': instance.submission.problem_instance.contest_id,
'submission_id': instance.submission_id,
}
return make_html_link(
reverse('submission', kwargs=reverse_kwargs),
'%d (%s)'
% (
instance.submission_id,
force_str(instance.submission.problem_instance),
),
)
[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] 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)