from oioioi.base import admin from oioioi.statistics.models import StatisticsConfig from oioioi.contests.admin import ContestAdmin class StatisticsConfigInline(admin.TabularInline): model = StatisticsConfig class StatisticsAdminMixin(object): def __init__(self, *args, **kwargs): super(StatisticsAdminMixin, self) \ .__init__(*args, **kwargs) self.inlines = self.inlines + [StatisticsConfigInline] ContestAdmin.mix_in(StatisticsAdminMixin)
if not first_future_date[1]: msg = _("Exclusiveness configs usually cover entire rounds," " but currently round \"%s\" is not exclusive from" " %s! Please verify that your exclusiveness" " configs are correct.") % (round.name, first_future_date[0]) else: msg = _("Exclusiveness configs usually cover entire rounds," " but currently round \"%s\" is not exclusive from" " %s to %s! Please verify that your exclusiveness" " configs are correct.") % (round.name, first_future_date[0], first_future_date[1]) messages.warning(request, msg) def save_formset(self, request, form, formset, change): instances = formset.save() ex_confs = [] for obj in instances: if isinstance(obj, ExclusivenessConfig) and obj.enabled: ex_confs.append(obj) if ex_confs: self._warn_on_contestexcl_overlap(request, ex_confs) self._warn_on_not_exclusive_rounds(request, ex_confs) ContestAdmin.mix_in(ContestAdminWithExclusivenessInlineMixin)
from oioioi.base import admin from oioioi.contestlogo.models import ContestLogo from oioioi.contests.admin import ContestAdmin class ContestLogoInline(admin.TabularInline): model = ContestLogo class ContestLogoAdminMixin(object): def __init__(self, *args, **kwargs): super(ContestLogoAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [ContestLogoInline] ContestAdmin.mix_in(ContestLogoAdminMixin)
kwargs['queryset'] = User.objects.filter(id__in=admin_ids) \ .order_by('username') return super(MessageNotifierConfigInline, self) \ .formfield_for_foreignkey(db_field, request, **kwargs) class MessageNotifierContestAdminMixin(object): """Adds :class:`~oioioi.questions.models.MessageNotifierConfig` to an admin panel. """ def __init__(self, *args, **kwargs): super(MessageNotifierContestAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [MessageNotifierConfigInline] ContestAdmin.mix_in(MessageNotifierContestAdminMixin) class ReplyTemplateAdmin(admin.ModelAdmin): def get_list_display(self, request): if is_superuser(request): return ['visible_name', 'content', 'contest', 'usage_count'] return ['visible_name', 'content', 'usage_count'] def get_list_filter(self, request): if is_superuser(request): return ['contest'] return [] def get_readonly_fields(self, request, obj=None):
logger = logging.getLogger(__name__) class StatementConfigInline(admin.TabularInline): model = ProblemStatementConfig extra = 1 form = ProblemStatementConfigForm class StatementConfigAdminMixin(object): def __init__(self, *args, **kwargs): super(StatementConfigAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [StatementConfigInline] ContestAdmin.mix_in(StatementConfigAdminMixin) class StatementInline(admin.TabularInline): model = ProblemStatement can_delete = False readonly_fields = ['language', 'content_link'] fields = readonly_fields def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): return True def has_delete_permission(self, request, obj=None):
return super(PrizeInline, self) \ .formfield_for_foreignkey(db_field, request, **kwargs) class PrizesAdminMixin(object): """Adds :class:`~oioioi.prizes.models.PrizeGiving` and :class:`~oioioi.prizes.models.Prize` to an admin panel and prize giving scheduling on save. """ def __init__(self, *args, **kwargs): super(PrizesAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [PrizeGivingInline, PrizeInline] def save_related(self, request, *args, **kwargs): super(PrizesAdminMixin, self).save_related(request, *args, **kwargs) if not request.contest: return pgs_for_scheduling = request.contest.prizegiving_set \ .select_for_update() \ .filter(state='NOT_SCHEDULED', date__isnull=False) for pg in pgs_for_scheduling: pg.schedule() ContestAdmin.mix_in(PrizesAdminMixin) contest_site.contest_register(PrizeForUser)
'access_key': instance.access_key }) return make_html_link(url, url) else: return _("Not yet generated") access_link.allow_tags = True access_link.short_description = _("Access link") def regeneration_link(self, instance): return make_html_link( reverse('balloons_access_regenerate', kwargs={'contest_id': instance.contest.id}), _("Regenerate key"), 'POST') regeneration_link.allow_tags = True regeneration_link.short_description = _("Regeneration link") 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 = self.inlines + [BalloonsDeliveryAccessDataInline] ContestAdmin.mix_in(BalloonsDeliveryAccessDataAdminMixin)
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") access_link.short_description = _("Access link") 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") 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 = self.inlines + [BalloonsDeliveryAccessDataInline] ContestAdmin.mix_in(BalloonsDeliveryAccessDataAdminMixin)
from oioioi.base import admin from oioioi.complaints.models import ComplaintsConfig from oioioi.contests.admin import ContestAdmin class ComplaintsConfigInline(admin.TabularInline): model = ComplaintsConfig class ComplaintsAdminMixin(object): def __init__(self, *args, **kwargs): super(ComplaintsAdminMixin, self) \ .__init__(*args, **kwargs) self.inlines = self.inlines + [ComplaintsConfigInline] ContestAdmin.mix_in(ComplaintsAdminMixin)
self.formfield_for_dbfield, request=request)) def response_add(self, request, obj, post_url_continue=None): if request.user.is_superuser or \ not request.user.has_perm('teachers.teacher'): return super(ContestAdminMixin, self).response_add(request, obj, post_url_continue) self.message_user(request, _("Contest added successfully.")) return redirect('show_members', contest_id=obj.id, member_type='pupil') def __init__(self, *args, **kwargs): super(ContestAdminMixin, self).__init__(*args, **kwargs) ContestAdmin.mix_in(ContestAdminMixin) if 'oioioi.simpleui' not in settings.INSTALLED_APPS: personal_menu_registry.register( 'create_contest', _("New contest"), lambda request: reverse('oioioiadmin:contests_contest_add'), lambda request: request.user.has_perm('teachers.teacher'), order=10) else: personal_menu_registry.register( 'teacher_dashboard', _("Contests"), lambda request: reverse('teacher_dashboard'), lambda request: request.user.has_perm('teachers.teacher'), order=5)
class DisqualificationsConfigInline(admin.TabularInline): model = DisqualificationsConfig category = _("Advanced") formfield_overrides = { models.TextField: { 'widget': Textarea(attrs={'rows': 2}) }, } def has_add_permission(self, request): return is_contest_admin(request) def has_change_permission(self, request, obj=None): return is_contest_admin(request) def has_delete_permission(self, request, obj=None): return is_contest_admin(request) 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 = self.inlines + [DisqualificationsConfigInline] ContestAdmin.mix_in(DisqualificationsAdminMixin)
if obj or not use_usercontest_admin_form(request): return super(UserContestAdminMixin, self).get_form(request, obj, **kwargs) return modelform_factory( self.model, form=UserContestForm, formfield_callback=partial(self.formfield_for_dbfield, request=request), ) def get_inline_instances(self, request, obj=None): if not use_usercontest_admin_form(request): return super(UserContestAdminMixin, self).get_inline_instances(request, obj) _inlines = super(UserContestAdminMixin, self).get_inline_instances(request, obj) custom_inline = UserRoundInline(self.model, self.admin_site) modified_inlines = [] for inline in _inlines: if isinstance(inline, RoundInline): modified_inlines.append(custom_inline) else: modified_inlines.append(inline) return modified_inlines ContestAdmin.mix_in(UserContestAdminMixin)
from oioioi.base import admin from oioioi.complaints.models import ComplaintsConfig from oioioi.contests.admin import ContestAdmin class ComplaintsConfigInline(admin.TabularInline): model = ComplaintsConfig class ComplaintsAdminMixin(object): """Adds :class:`~oioioi.complaints.models.ComplaintConfig` to an admin panel. """ def __init__(self, *args, **kwargs): super(ComplaintsAdminMixin, self) \ .__init__(*args, **kwargs) self.inlines = self.inlines + [ComplaintsConfigInline] ContestAdmin.mix_in(ComplaintsAdminMixin)
def has_delete_permission(self, request, obj=None): return request.user.is_superuser class ContestAdminWithExclusivenessInlineMixin(object): def __init__(self, *args, **kwargs): super(ContestAdminWithExclusivenessInlineMixin, self) \ .__init__(*args, **kwargs) self.inlines = self.inlines + [ExclusivenessConfigInline] def save_formset(self, request, form, formset, change): instances = formset.save() for obj in instances: if not (isinstance(obj, ExclusivenessConfig) and obj.enabled): continue qs = ExclusivenessConfig.objects.get_active_between( obj.start_date, obj.end_date).select_related('contest') qs = [ ex_conf for ex_conf in qs if ex_conf.contest != request.contest ] if qs: contest_names = ', '.join( [ex_conf.contest.name for ex_conf in qs]) msg = _("The following contests' exclusion times" " overlap with the current one: %s. Watch out, because" " it may cause conflicts!") % contest_names messages.warning(request, msg) ContestAdmin.mix_in(ContestAdminWithExclusivenessInlineMixin)
def get_queryset(self, request): qs = super(TeamsAdmin, self).get_queryset(request) qs = qs.filter(contest=request.contest) return qs def save_form(self, request, *args, **kwargs): obj = super(TeamsAdmin, self).save_form(request, *args, **kwargs) obj.contest = request.contest return obj contest_site.contest_register(Team, TeamsAdmin) contest_admin_menu_registry.register('teams', _("Teams"), lambda request: reverse('oioioiadmin:teams_team_changelist'), condition=teams_enabled, order=30) class TeamsConfigInline(admin.TabularInline): model = TeamsConfig class TeamsAdminMixin(object): """Adds :class:`~oioioi.teams.models.TeamsConfig` to an admin panel. """ def __init__(self, *args, **kwargs): super(TeamsAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [TeamsConfigInline] ContestAdmin.mix_in(TeamsAdminMixin)
def has_add_permission(self, request): return request.user.is_superuser def has_change_permission(self, request, obj=None): return request.user.is_superuser def has_delete_permission(self, request, obj=None): return request.user.is_superuser class MailSubmissionConfigAdminMixin(object): def __init__(self, *args, **kwargs): super(MailSubmissionConfigAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [MailSubmissionConfigInline] ContestAdmin.mix_in(MailSubmissionConfigAdminMixin) class MailSubmissionAdmin(admin.ModelAdmin): list_display = ['id', 'user_login', 'user_full_name', 'date', 'problem_instance', 'related_submission', 'accepted_by'] list_display_links = None list_filter = [ProblemNameListFilter] date_hierarchy = 'date' actions = ['accept_action'] search_fields = ['user__username', 'user__last_name'] def get_list_select_related(self): return super(MailSubmissionAdmin, self).get_list_select_related() \ + ['user', 'accepted_by', 'problem_instance__problem', 'submission',
return request.user.is_superuser def has_change_permission(self, request, obj=None): return request.user.is_superuser def has_delete_permission(self, request, obj=None): return request.user.is_superuser class MailSubmissionConfigAdminMixin(object): def __init__(self, *args, **kwargs): super(MailSubmissionConfigAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [MailSubmissionConfigInline] ContestAdmin.mix_in(MailSubmissionConfigAdminMixin) class MailSubmissionAdmin(admin.ModelAdmin): list_display = [ 'id', 'user_login', 'user_full_name', 'date', 'problem_instance', 'related_submission', 'accepted_by' ] list_display_links = None list_filter = [ProblemNameListFilter] date_hierarchy = 'date' actions = ['accept_action'] search_fields = ['user__username', 'user__last_name'] def get_list_select_related(self): return super(MailSubmissionAdmin, self).get_list_select_related() \
return True def has_delete_permission(self, request, obj=None): return False class ProgramsConfigAdminMixin(object): """Adds :class:`~oioioi.programs.models.ProgramsConfig` to an admin panel. """ def __init__(self, *args, **kwargs): super(ProgramsConfigAdminMixin, self) \ .__init__(*args, **kwargs) self.inlines = self.inlines + [ProgramsConfigInline] ContestAdmin.mix_in(ProgramsConfigAdminMixin) class LibraryProblemDataAdminMixin(object): """Adds :class:`~oioioi.programs.models.LibraryProblemData` to an admin panel. """ def __init__(self, *args, **kwargs): super(LibraryProblemDataAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [LibraryProblemDataInline] class ProgrammingProblemAdminMixin(object): """Adds :class:`~oioioi.programs.models.ReportActionsConfig`, :class:`~oioioi.programs.models.OutputChecker` and
'teams', _("Teams"), lambda request: reverse('oioioiadmin:teams_team_changelist'), condition=teams_enabled & is_contest_admin, order=30) class TeamsConfigInline(admin.TabularInline): model = TeamsConfig category = _("Advanced") def has_add_permission(self, request): return is_contest_admin(request) def has_change_permission(self, request, obj=None): return is_contest_admin(request) def has_delete_permission(self, request, obj=None): return self.has_change_permission(request, obj) class TeamsAdminMixin(object): """Adds :class:`~oioioi.teams.models.TeamsConfig` to an admin panel. """ def __init__(self, *args, **kwargs): super(TeamsAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [TeamsConfigInline] ContestAdmin.mix_in(TeamsAdminMixin)
class ProgramsContestAdminMixin(object): """Adds :class:`~oioioi.programs.models.ProgramsConfig` and :class:`~oioioi.programs.models.ContestCompiler` to an admin panel. """ def __init__(self, *args, **kwargs): super(ProgramsContestAdminMixin, self) \ .__init__(*args, **kwargs) self.inlines = self.inlines + [ ProgramsConfigInline, ContestCompilerInline ] ContestAdmin.mix_in(ProgramsContestAdminMixin) class LibraryProblemDataAdminMixin(object): """Adds :class:`~oioioi.programs.models.LibraryProblemData` to an admin panel. """ def __init__(self, *args, **kwargs): super(LibraryProblemDataAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [LibraryProblemDataInline] class ProgrammingProblemAdminMixin(object): """Adds :class:`~oioioi.programs.models.ReportActionsConfig`, :class:`~oioioi.programs.models.OutputChecker`, :class:`~oioioi.programs.models.LibraryProblemData` and
return is_contest_admin(request) def has_delete_permission(self, request, obj=None): return is_contest_admin(request) class StatementConfigAdminMixin(object): """Adds :class:`~oioioi.contests.models.ProblemStatementConfig` to an admin panel. """ def __init__(self, *args, **kwargs): super(StatementConfigAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [StatementConfigInline] ContestAdmin.mix_in(StatementConfigAdminMixin) class StatementInline(admin.TabularInline): model = ProblemStatement can_delete = False readonly_fields = ['language', 'content_link'] fields = readonly_fields def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): return True def has_delete_permission(self, request, obj=None):
return is_contest_admin(request) def has_delete_permission(self, request, obj=None): return is_contest_admin(request) class StatementConfigAdminMixin(object): """Adds :class:`~oioioi.contests.models.ProblemStatementConfig` to an admin panel. """ def __init__(self, *args, **kwargs): super(StatementConfigAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [StatementConfigInline] ContestAdmin.mix_in(StatementConfigAdminMixin) class RankingVisibilityConfigInline(admin.TabularInline): model = RankingVisibilityConfig extra = 1 form = RankingVisibilityConfigForm category = _("Advanced") def has_add_permission(self, request): return is_contest_admin(request) def has_change_permission(self, request, obj=None): return is_contest_admin(request) def has_delete_permission(self, request, obj=None):
) return make_html_link(href, instance.filename) return None logo_link.short_description = _("Filename") class ContestLogoAdminMixin(object): """Adds :class:`~oioioi.contestlogo.models.ContestLogo` to an admin panel.""" def __init__(self, *args, **kwargs): super(ContestLogoAdminMixin, self).__init__(*args, **kwargs) self.inlines = self.inlines + [ContestLogoInline] ContestAdmin.mix_in(ContestLogoAdminMixin) class ContestIconInline(admin.TabularInline): model = ContestIcon extra = 0 readonly_fields = ['icon_link'] exclude = ['updated_at'] category = _("Advanced") def icon_link(self, instance): if instance.id is not None: href = reverse( 'icon_image_view', kwargs={ 'icon_id': str(instance.id),