Skip to content

Commit

Permalink
Add actions for contest locking; #595
Browse files Browse the repository at this point in the history
  • Loading branch information
WallE256 authored and Xyene committed May 21, 2020
1 parent a866c4b commit be2e744
Showing 1 changed file with 36 additions and 2 deletions.
38 changes: 36 additions & 2 deletions judge/admin/contest.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from reversion.admin import VersionAdmin

from django_ace import AceWidget
from judge.models import Contest, ContestProblem, ContestSubmission, Profile, Rating
from judge.models import Contest, ContestProblem, ContestSubmission, Profile, Rating, Submission
from judge.ratings import rate_contest
from judge.utils.views import NoBatchDeleteMixin
from judge.widgets import AdminHeavySelect2MultipleWidget, AdminHeavySelect2Widget, AdminMartorWidget, \
Expand Down Expand Up @@ -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):
Expand All @@ -149,9 +153,11 @@ def get_queryset(self, request):
return queryset.filter(organizers__id=request.profile.id)

def get_readonly_fields(self, request, obj=None):
readonly = ['is_locked']
readonly = []
if not request.user.has_perm('judge.contest_rating'):
readonly += ['is_rated', 'rate_all', 'rate_exclude']
if not request.user.has_perm('judge.contest_lock'):
readonly += ['is_locked']
if not request.user.has_perm('judge.contest_access_code'):
readonly += ['access_code']
if not request.user.has_perm('judge.create_private_contest'):
Expand All @@ -177,6 +183,9 @@ def save_model(self, request, obj, form, change):
self._rescore(obj.key)
self._rescored = True

if form.changed_data and 'is_locked' in form.changed_data:
self.set_is_locked(obj, form.cleaned_data['is_locked'])

def save_related(self, request, form, formsets, change):
super().save_related(request, form, formsets, change)
# Only rescored if we did not already do so in `save_model`
Expand Down Expand Up @@ -212,6 +221,31 @@ 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()
Submission.objects.filter(contest_object=contest,
contest__participation__virtual=0).update(is_locked=is_locked)

def get_urls(self):
return [
url(r'^rate/all/$', self.rate_all_view, name='judge_contest_rate_all'),
Expand Down

0 comments on commit be2e744

Please sign in to comment.