Source code for oioioi.balloons.admin

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] 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)
[docs] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'problem_instance': qs = ProblemInstance.objects if request.contest: qs = qs.filter(contest=request.contest) kwargs['queryset'] = qs return super(ProblemBalloonsConfigAdmin, self).formfield_for_foreignkey( db_field, request, **kwargs )
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)
[docs] def formfield_for_foreignkey(self, db_field, request, **kwargs): if request.contest is not None: if db_field.name == 'contest': qs = Contest.objects.filter(id=request.contest.id) kwargs['initial'] = request.contest kwargs['queryset'] = qs elif db_field.name == 'user': qs = User.objects.filter(participant__contest=request.contest) if qs or not request.user.is_superuser: kwargs['queryset'] = qs return super(BalloonsDisplayAdmin, self).formfield_for_foreignkey( db_field, request, **kwargs )
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] access_link.short_description = _("Access link")
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)