from django.contrib.auth.models import User
from django.urls import reverse
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from oioioi.balloons.models import (
BalloonsDeliveryAccessData,
BalloonsDisplay,
ProblemBalloonsConfig,
)
from oioioi.base import admin
from oioioi.base.admin import system_admin_menu_registry
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 Contest, ProblemInstance
from oioioi.contests.utils import is_contest_admin
[docs]class ProblemBalloonsConfigAdmin(admin.ModelAdmin):
[docs] list_display = ['problem_instance', 'color_display']
[docs] list_display_links = ['problem_instance']
[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 get_readonly_fields(self, request, obj=None):
if obj:
return self.readonly_fields + ('problem_instance',)
return self.readonly_fields
[docs] def color_display(self, instance):
return format_html(
u'<span class="balloons_admin" style="background: {}">' '{}</span>',
instance.color,
instance.color,
)
[docs] color_display.short_description = _("Color")
[docs] def get_queryset(self, request):
qs = super(ProblemBalloonsConfigAdmin, self).get_queryset(request)
return qs.filter(problem_instance__contest=request.contest)
contest_site.contest_register(ProblemBalloonsConfig, ProblemBalloonsConfigAdmin)
contest_admin_menu_registry.register(
'problemballoonsconfig_admin',
_("Balloon colors"),
lambda request: reverse('oioioiadmin:balloons_problemballoonsconfig_changelist'),
is_contest_admin,
order=60,
)
[docs]class BalloonsDisplayAdmin(admin.ModelAdmin):
[docs] list_display = ['ip_addr', 'user']
[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 get_readonly_fields(self, request, obj=None):
if obj:
return self.readonly_fields + ('contest',)
return self.readonly_fields
[docs] def get_queryset(self, request):
qs = super(BalloonsDisplayAdmin, self).get_queryset(request)
if request.contest is None:
return qs
return qs.filter(contest=request.contest)
admin.site.register(BalloonsDisplay, BalloonsDisplayAdmin)
system_admin_menu_registry.register(
'balloonsdisplay_admin',
_("Balloon displays"),
lambda request: reverse('oioioiadmin:balloons_balloonsdisplay_changelist'),
order=60,
)
[docs]class BalloonsDeliveryAccessDataInline(admin.TabularInline):
[docs] model = BalloonsDeliveryAccessData
[docs] fields = ('access_link', 'valid_until', 'regeneration_link')
[docs] readonly_fields = ('access_link', 'valid_until', 'regeneration_link')
[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] def access_link(self, instance):
if instance.access_key:
url = reverse(
'balloons_access_set_cookie',
kwargs={
'contest_id': instance.contest.id,
'access_key': instance.access_key,
},
)
return make_html_link(url, url)
else:
return _("Not yet generated")
[docs] access_link.short_description = _("Access link")
[docs] def regeneration_link(self, instance):
return make_html_link(
reverse(
'balloons_access_regenerate', kwargs={'contest_id': instance.contest.id}
),
_("Regenerate key"),
'POST',
)
regeneration_link.short_description = _("Regeneration link")
[docs]class BalloonsDeliveryAccessDataAdminMixin(object):
"""Adds :class:`~oioioi.balloons.BalloonsDeliveryAccessData` fields to an
admin panel.
"""
def __init__(self, *args, **kwargs):
super(BalloonsDeliveryAccessDataAdminMixin, self).__init__(*args, **kwargs)
self.inlines = tuple(self.inlines) + (BalloonsDeliveryAccessDataInline,)
ContestAdmin.mix_in(BalloonsDeliveryAccessDataAdminMixin)