from django.urls import reverse
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,
ContestsProblemNameListFilter,
contest_site,
)
from oioioi.contests.menu import contest_admin_menu_registry
from oioioi.contests.utils import is_contest_admin
from oioioi.mailsubmit.models import MailSubmission, MailSubmissionConfig
from oioioi.mailsubmit.utils import accept_mail_submission, is_mailsubmit_used
[docs]class MailSubmissionConfigInline(admin.TabularInline):
[docs] model = MailSubmissionConfig
[docs] category = _("Advanced")
# We require superuser privileges, because it is unsafe to allow anyone
# to edit printout_text. One can execute arbitrary shell command from
# there.
[docs] def has_add_permission(self, request, obj=None):
return request.user.is_superuser
[docs] def has_change_permission(self, request, obj=None):
return request.user.is_superuser
[docs] def has_delete_permission(self, request, obj=None):
return request.user.is_superuser
[docs]class MailSubmissionConfigAdminMixin(object):
"""Adds :class:`~oioioi.mailsubmit.models.MailSubmissionConfig` to an admin
panel.
"""
def __init__(self, *args, **kwargs):
super(MailSubmissionConfigAdminMixin, self).__init__(*args, **kwargs)
self.inlines = tuple(self.inlines) + (MailSubmissionConfigInline,)
ContestAdmin.mix_in(MailSubmissionConfigAdminMixin)
[docs]class MailSubmissionAdmin(admin.ModelAdmin):
[docs] list_display = [
'id',
'user_login',
'user_full_name',
'date',
'problem_instance',
'related_submission',
'accepted_by',
]
[docs] list_display_links = None
[docs] list_filter = [ContestsProblemNameListFilter]
[docs] date_hierarchy = 'date'
[docs] actions = ['accept_action']
[docs] search_fields = ['user__username', 'user__last_name']
[docs] def has_add_permission(self, request):
return False
[docs] def has_change_permission(self, request, obj=None):
if obj:
return False
return is_contest_admin(request)
[docs] def has_delete_permission(self, request, obj=None):
return is_contest_admin(request)
[docs] def user_login(self, instance):
if not instance.user:
return ''
return instance.user.username
[docs] user_login.short_description = _("Login")
[docs] user_login.admin_order_field = 'user__username'
[docs] def user_full_name(self, instance):
if not instance.user:
return ''
return instance.user.get_full_name()
user_full_name.short_description = _("User name")
user_full_name.admin_order_field = 'user__last_name'
related_submission.short_description = _("Related submission")
[docs] def accept_action(self, request, queryset):
queryset = queryset.order_by('id')
for mailsubmission in queryset:
accept_mail_submission(request, mailsubmission)
accept_action.short_description = _("Accept selected submissions")
[docs] def get_queryset(self, request):
queryset = super(MailSubmissionAdmin, self).get_queryset(request)
queryset = queryset.filter(problem_instance__contest=request.contest)
queryset = queryset.order_by('-id')
return queryset
[docs] def changelist_view(self, request, extra_context=None):
return super(MailSubmissionAdmin, self).changelist_view(
request, extra_context=extra_context
)
contest_site.contest_register(MailSubmission, MailSubmissionAdmin)
contest_admin_menu_registry.register(
'mail_submissions_admin',
_("Postal submissions"),
lambda request: reverse('oioioiadmin:mailsubmit_mailsubmission_changelist'),
order=40,
condition=is_mailsubmit_used,
)