From 223fb5226bee7bd9f01d8a379561a725e882dff3 Mon Sep 17 00:00:00 2001 From: Radu Pogonariu Date: Thu, 14 May 2020 00:56:46 +0300 Subject: [PATCH] Add actions for contest locking; #595 --- judge/admin/contest.py | 39 +++++++++++++++++++ .../admin/judge/contest/change_form.html | 7 ++++ 2 files changed, 46 insertions(+) diff --git a/judge/admin/contest.py b/judge/admin/contest.py index f72a93524b..7bcde88758 100644 --- a/judge/admin/contest.py +++ b/judge/admin/contest.py @@ -139,6 +139,10 @@ def get_actions(self, request): for action in ('make_visible', 'make_hidden'): actions[action] = self.get_action(action) + if request.user.has_perm('judge.contest_lock'): + for action in ('set_locked', 'set_unlocked'): + actions[action] = self.get_action(action) + return actions def get_queryset(self, request): @@ -212,13 +216,48 @@ def make_hidden(self, request, queryset): count) % count) make_hidden.short_description = _('Mark contests as hidden') + def set_locked(self, request, queryset): + for row in queryset: + self.set_is_locked(row, True) + count = queryset.count() + self.message_user(request, ungettext('%d contest successfully locked.', + '%d contests successfully locked.', + count) % count) + set_locked.short_description = _('Lock contest submissions') + + def set_unlocked(self, request, queryset): + for row in queryset: + self.set_is_locked(row, False) + count = queryset.count() + self.message_user(request, ungettext('%d contest successfully unlocked.', + '%d contests successfully unlocked.', + count) % count) + set_unlocked.short_description = _('Unlock contest submissions') + + def set_is_locked(self, contest, is_locked): + with transaction.atomic(): + contest.is_locked = is_locked + contest.save() + for row in ContestSubmission.objects.filter(participation__contest=contest): + submission = row.submission + submission.is_locked = is_locked + submission.save() + def get_urls(self): return [ url(r'^rate/all/$', self.rate_all_view, name='judge_contest_rate_all'), url(r'^(\d+)/rate/$', self.rate_view, name='judge_contest_rate'), url(r'^(\d+)/judge/(\d+)/$', self.rejudge_view, name='judge_contest_rejudge'), + url(r'^(\d+)/lock/$', self.lock_view, name='judge_contest_lock'), ] + super(ContestAdmin, self).get_urls() + def lock_view(self, request, id): + if not request.user.has_perm('judge.contest_lock'): + raise PermissionDenied() + contest = get_object_or_404(Contest, id=id) + self.set_is_locked(contest, not contest.is_locked) + return HttpResponseRedirect(reverse('admin:judge_contest_change', args=(id,))) + def rejudge_view(self, request, contest_id, problem_id): queryset = ContestSubmission.objects.filter(problem_id=problem_id).select_related('submission') for model in queryset: diff --git a/templates/admin/judge/contest/change_form.html b/templates/admin/judge/contest/change_form.html index beb2122db9..4d71654909 100644 --- a/templates/admin/judge/contest/change_form.html +++ b/templates/admin/judge/contest/change_form.html @@ -20,4 +20,11 @@ {% trans "Rate" %} {% endif %} + {% if original and perms.judge.contest_lock %} + + {% endif %} {% endblock %}