def get_custom_list_select_related(self): return super(SubmissionsSimilarityEntryAdmin, self) \ .get_custom_list_select_related() + [ 'submission', 'submission__user', 'submission__problem_instance' ] def get_queryset(self, request): queryset = super(SubmissionsSimilarityEntryAdmin, self) \ .get_queryset(request) queryset = queryset.filter( submission__problem_instance__contest=request.contest) queryset = queryset.order_by('-id') return queryset contest_site.contest_register(SubmissionsSimilarityEntry, SubmissionsSimilarityEntryAdmin) contest_admin_menu_registry.register('submissions_similarity', _("Similar submits"), lambda request: reverse( 'oioioiadmin:similarsubmits_submissionssimilarityentry_changelist'), order=100) class SubmisionsSimilarityEntryInline(admin.TabularInline): model = SubmissionsSimilarityEntry extra = 0 raw_id_fields = ['submission'] def has_add_permission(self, request): return True
qs = super(PostAdmin, self).get_queryset(request) qs = qs.filter(thread__category__forum=request.contest.forum) return qs class BanAdmin(admin.ModelAdmin): list_display = ['user', 'admin', 'created_at'] fields = ['user', 'admin', 'created_at', 'reason'] readonly_fields = ['user', 'admin', 'created_at'] def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): return get_permission(self, request) def has_delete_permission(self, request, obj=None): return get_permission(self, request) def get_queryset(self, request): qs = super(BanAdmin, self).get_queryset(request) qs = qs.filter(forum=request.contest.forum) return qs contest_site.contest_register(Ban, BanAdmin) contest_site.contest_register(Forum, ForumAdmin) contest_site.contest_register(Category, CategoryAdmin) contest_site.contest_register(Thread, ThreadAdmin) contest_site.contest_register(Post, PostAdmin)
class ContestQueuedJob(QueuedJob): class Meta(object): proxy = True verbose_name = _("Contest Queued Jobs") class ContestJobsQueueAdmin(SystemJobsQueueAdmin): def __init__(self, *args, **kwargs): super(ContestJobsQueueAdmin, self).__init__(*args, **kwargs) self.list_display = [x for x in self.list_display if x not in ('contest', 'celery_task_id_link')] self.list_display_links = None self.list_filter = self.list_filter + [UserListFilter] def has_change_permission(self, request, obj=None): if obj: return False return is_contest_admin(request) def get_queryset(self, request): qs = super(ContestJobsQueueAdmin, self).get_queryset(request) return qs.filter(submission__problem_instance__contest=request.contest) contest_site.contest_register(ContestQueuedJob, ContestJobsQueueAdmin) contest_admin_menu_registry.register('queuedjob_admin', _("Evaluation queue"), lambda request: reverse( 'oioioiadmin:evalmgr_contestqueuedjob_changelist'), condition=(lambda request: not request.user.is_superuser), order=60)
super(MessageAdmin, self).log_change(request, message, change_message) return redirect('contest_messages', contest_id=request.contest.id) else: form = ChangeContestMessageForm(message.kind, request, instance=message) return TemplateResponse(request, 'admin/questions/change_message.html', {'form': form, 'message': message}) def response_delete(self, request): super(MessageAdmin, self).response_delete(request) return redirect('contest_messages', contest_id=request.contest.id) contest_site.contest_register(Message, MessageAdmin) class MessageNotifierConfigInline(admin.TabularInline): model = MessageNotifierConfig can_delete = True extra = 0 def formfield_for_foreignkey(self, db_field, request, **kwargs): contest_admin_perm = ContestPermission.objects \ .filter(contest=request.contest) \ .filter(permission='contests.contest_admin') \ .select_related('user') admin_ids = [p.user.id for p in contest_admin_perm] if request.user.is_superuser:
def has_delete_permission(self, request, obj=None): return self.has_change_permission(request, obj) 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 & is_contest_admin, order=30) class TeamsConfigInline(admin.TabularInline): model = TeamsConfig category = _("Advanced") def has_add_permission(self, request): return is_contest_admin(request)
return is_contest_basicadmin(request) def has_delete_permission(self, request, obj=None): return False def came_from(self): return reverse('oioioiadmin:problems_contestproblempackage_changelist') def get_actions(self, request): actions = super(ContestProblemPackageAdmin, self).get_actions(request) if 'delete_selected' in actions: del actions['delete_selected'] return actions contest_site.contest_register(ContestProblemPackage, ContestProblemPackageAdmin) contest_admin_menu_registry.register( 'problempackage_change', _("Problem packages"), lambda request: reverse( 'oioioiadmin:problems_contestproblempackage_changelist'), condition=((~is_superuser) & pending_contest_packages), order=70) class MainProblemInstanceAdmin(admin.ModelAdmin): fields = ('problem', 'short_name') readonly_fields = ('problem', ) def has_add_permission(self, request): return False
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)
related_submission.short_description = _("Related submission") 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") 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 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)
search_fields = [] 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) def get_queryset(self, request): qs = super(PhaseAdmin, self).get_queryset(request) return qs.filter(round__contest=request.contest) def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'round': kwargs['queryset'] = Round.objects.filter(contest=request.contest) return super(PhaseAdmin, self) \ .formfield_for_foreignkey(db_field, request, **kwargs) def get_list_select_related(self): return super(PhaseAdmin, self).get_list_select_related() \ + ['round__contest'] contest_site.contest_register(Phase, PhaseAdmin) contest_admin_menu_registry.register('phase_change', _("Phases"), lambda request: reverse('oioioiadmin:phase_phase_changelist'), order=50)
default_participant_admin = NoParticipantAdmin def _find_model_admin(self, request, object_id): rcontroller = request.contest.controller.registration_controller() if has_participants_admin(request): participant_admin = rcontroller.participant_admin(self.model, self.admin_site) else: participant_admin = self.default_participant_admin(self.model, self.admin_site) return participant_admin def _model_admin_for_instance(self, request, instance=None): raise NotImplementedError contest_site.contest_register(Participant, ContestDependentParticipantAdmin) contest_admin_menu_registry.register('participants', _("Participants"), lambda request: reverse('oioioiadmin:participants_participant_changelist'), condition=has_participants_admin, order=30) class ParticipantInline(admin.TabularInline): model = Participant extra = 0 readonly_fields = ('contest', 'status') def has_add_permission(self, request): return False def has_change_permission(self, request, obj=None): # Protected by parent ModelAdmin
verbose_name = _("Contest Queued Submit") class ContestSubmitsQueueAdmin(SystemSubmitsQueueAdmin): def __init__(self, *args, **kwargs): super(ContestSubmitsQueueAdmin, self).__init__(*args, **kwargs) self.list_display = [ x for x in self.list_display if x not in ('contest', 'celery_task_id_link') ] self.list_filter = self.list_filter + [UserListFilter] def has_change_permission(self, request, obj=None): if obj: return False return is_contest_admin(request) def get_queryset(self, request): qs = super(ContestSubmitsQueueAdmin, self).get_queryset(request) return qs.filter(submission__problem_instance__contest=request.contest) contest_site.contest_register(ContestQueuedSubmit, ContestSubmitsQueueAdmin) contest_admin_menu_registry.register( 'queuedsubmit_admin', _("Evaluation queue"), lambda request: reverse( 'oioioiadmin:submitsqueue_contestqueuedsubmit_changelist'), condition=(lambda request: not request.user.is_superuser), order=60)
class ContestQueuedSubmit(QueuedSubmit): class Meta(object): proxy = True verbose_name = _("Contest Queued Submit") class ContestSubmitsQueueAdmin(SystemSubmitsQueueAdmin): def __init__(self, *args, **kwargs): super(ContestSubmitsQueueAdmin, self).__init__(*args, **kwargs) self.list_display = [x for x in self.list_display if x not in ('contest', 'celery_task_id_link')] self.list_filter = self.list_filter + [UserListFilter] def has_change_permission(self, request, obj=None): if obj: return False return is_contest_admin(request) def get_queryset(self, request): qs = super(ContestSubmitsQueueAdmin, self).get_queryset(request) return qs.filter(submission__problem_instance__contest=request.contest) contest_site.contest_register(ContestQueuedSubmit, ContestSubmitsQueueAdmin) contest_admin_menu_registry.register('queuedsubmit_admin', _("Evaluation queue"), lambda request: reverse( 'oioioiadmin:submitsqueue_contestqueuedsubmit_changelist'), condition=(lambda request: not request.user.is_superuser), order=60)
return '' contest = instance.submission.problem_instance.contest href = reverse('submission', kwargs={'contest_id': contest.id, 'submission_id': instance.submission.id}) return make_html_link(href, instance.submission.id) related_submission.short_description = _("Related submission") 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") def queryset(self, request): queryset = super(MailSubmissionAdmin, self).queryset(request) queryset = queryset.filter(problem_instance__contest=request.contest) queryset = queryset.order_by('-id') return queryset 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)
def user_full_name(self, instance): return instance.user.get_full_name() user_full_name.short_description = _("User name") user_full_name.admin_order_field = 'user__last_name' def guilty_text(self, instance): return _("Yes") if instance.guilty else _("No") guilty_text.short_description = _("Guilty") guilty_text.admin_order_field = 'guilty' def get_custom_list_select_related(self): return super(DisqualificationAdmin, self)\ .get_custom_list_select_related() \ + ['submission', 'user', 'submission__problem_instance'] 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'), order=100)
color_display.short_description = _("Color") def get_queryset(self, request): qs = super(ProblemBalloonsConfigAdmin, self).get_queryset(request) return qs.filter(problem_instance__contest=request.contest) 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'), order=60) class BalloonsDisplayAdmin(admin.ModelAdmin): list_display = ['ip_addr', 'user'] 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 get_queryset(self, request): qs = super(ProblemBalloonsConfigAdmin, self).get_queryset(request) return qs.filter(problem_instance__contest=request.contest) 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', _("Balloons colors"), lambda request: reverse( 'oioioiadmin:balloons_problemballoonsconfig_changelist'), order=60) class BalloonsDisplayAdmin(admin.ModelAdmin): list_display = ['ip_addr', 'user'] def has_add_permission(self, request): return is_contest_admin(request) def has_change_permission(self, request, obj=None):
def has_delete_permission(self, request, obj=None): return self.has_change_permission(request, obj) 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)
super(MessageAdmin, self).log_change(request, message, change_message) return redirect('contest_messages', contest_id=request.contest.id) else: form = ChangeContestMessageForm(message.kind, request, instance=message) return TemplateResponse(request, 'admin/questions/change_message.html', {'form': form, 'message': message}) def response_delete(self, request): super(MessageAdmin, self).response_delete(request) return redirect('contest_messages', contest_id=request.contest.id) contest_site.contest_register(Message, MessageAdmin) class MessageNotifierConfigInline(admin.TabularInline): model = MessageNotifierConfig can_delete = True extra = 0 def has_add_permission(self, request): return True def has_change_permission(self, request, obj=None): return True def has_delete_permission(self, request, obj=None): return True
verbose_name = _("Contest Queued Jobs") class ContestJobsQueueAdmin(SystemJobsQueueAdmin): def __init__(self, *args, **kwargs): super(ContestJobsQueueAdmin, self).__init__(*args, **kwargs) self.list_display = [ x for x in self.list_display if x not in ('contest', 'celery_task_id_link') ] self.list_display_links = None self.list_filter = self.list_filter + [UserListFilter] def has_change_permission(self, request, obj=None): if obj: return False return is_contest_admin(request) def get_queryset(self, request): qs = super(ContestJobsQueueAdmin, self).get_queryset(request) return qs.filter(submission__problem_instance__contest=request.contest) contest_site.contest_register(ContestQueuedJob, ContestJobsQueueAdmin) contest_admin_menu_registry.register( 'queuedjob_admin', _("Evaluation queue"), lambda request: reverse('oioioiadmin:evalmgr_contestqueuedjob_changelist'), condition=(lambda request: not request.user.is_superuser), order=60)
return False return is_contest_admin(request) def has_delete_permission(self, request, obj=None): return False def came_from(self): return reverse('oioioiadmin:problems_contestproblempackage_changelist') def get_actions(self, request): actions = super(ContestProblemPackageAdmin, self).get_actions(request) if 'delete_selected' in actions: del actions['delete_selected'] return actions contest_site.contest_register(ContestProblemPackage, ContestProblemPackageAdmin) contest_admin_menu_registry.register('problempackage_change', _("Problem packages"), lambda request: reverse('oioioiadmin:problems_contestproblempackage_changelist'), condition=((~is_superuser) & pending_contest_packages), order=70) class MainProblemInstanceAdmin(admin.ModelAdmin): fields = ('problem', 'short_name') readonly_fields = ('problem',) def has_add_permission(self, request): return False
def _find_model_admin(self, request, object_id): rcontroller = request.contest.controller.registration_controller() if has_participants_admin(request): participant_admin = rcontroller.participant_admin( self.model, self.admin_site) else: participant_admin = self.default_participant_admin( self.model, self.admin_site) return participant_admin def _model_admin_for_instance(self, request, instance=None): raise NotImplementedError contest_site.contest_register(Participant, ContestDependentParticipantAdmin) contest_admin_menu_registry.register( 'participants', _("Participants"), lambda request: reverse('oioioiadmin:participants_participant_changelist'), condition=has_participants_admin, order=30) class ParticipantInline(admin.TabularInline): model = Participant extra = 0 readonly_fields = ('contest', 'status') def has_add_permission(self, request): return False
def get_list_select_related(self): return super(SubmissionsSimilarityEntryAdmin, self) \ .get_list_select_related() + [ 'submission', 'submission__user', 'submission__problem_instance' ] def queryset(self, request): queryset = super(SubmissionsSimilarityEntryAdmin, self) \ .queryset(request) queryset = queryset.filter( submission__problem_instance__contest=request.contest) queryset = queryset.order_by('-id') return queryset contest_site.contest_register(SubmissionsSimilarityEntry, SubmissionsSimilarityEntryAdmin) contest_admin_menu_registry.register('submissions_similarity', _("Similar submits"), lambda request: reverse( 'oioioiadmin:similarsubmits_submissionssimilarityentry_changelist'), order=100) class SubmisionsSimilarityEntryInline(admin.TabularInline): model = SubmissionsSimilarityEntry extra = 0 raw_id_fields = ['submission'] def has_add_permission(self, request): return True
force_text(instance.submission.problem_instance)) ) submission_link.short_description = _("Submission") def user_full_name(self, instance): return instance.user.get_full_name() user_full_name.short_description = _("User name") user_full_name.admin_order_field = 'user__last_name' def guilty_text(self, instance): return _("Yes") if instance.guilty else _("No") guilty_text.short_description = _("Guilty") guilty_text.admin_order_field = 'guilty' def get_custom_list_select_related(self): return super(DisqualificationAdmin, self)\ .get_custom_list_select_related() \ + ['submission', 'user', 'submission__problem_instance'] 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'), order=100)