Fix contest rescore bug
This commit is contained in:
parent
3d67fb274e
commit
18d23c771a
9 changed files with 42 additions and 58 deletions
|
@ -32,6 +32,7 @@ from judge.widgets import (
|
|||
HeavyPreviewAdminPageDownWidget,
|
||||
)
|
||||
from judge.views.contests import recalculate_contest_summary_result
|
||||
from judge.utils.contest import maybe_trigger_contest_rescore
|
||||
|
||||
|
||||
class AdminHeavySelect2Widget(AdminHeavySelect2Widget):
|
||||
|
@ -310,39 +311,14 @@ class ContestAdmin(CompareVersionAdmin):
|
|||
|
||||
super().save_model(request, obj, form, change)
|
||||
|
||||
# We need this flag because `save_related` deals with the inlines, but does not know if we have already rescored
|
||||
self._rescored = False
|
||||
if form.changed_data and any(
|
||||
f in form.changed_data
|
||||
for f in (
|
||||
"start_time",
|
||||
"end_time",
|
||||
"time_limit",
|
||||
"format_config",
|
||||
"format_name",
|
||||
"freeze_after",
|
||||
)
|
||||
):
|
||||
self._rescore(obj.key)
|
||||
self._rescored = True
|
||||
|
||||
if form.changed_data and any(
|
||||
f in form.changed_data
|
||||
for f in (
|
||||
"authors",
|
||||
"curators",
|
||||
"testers",
|
||||
)
|
||||
):
|
||||
Contest._author_ids.dirty(obj)
|
||||
Contest._curator_ids.dirty(obj)
|
||||
Contest._tester_ids.dirty(obj)
|
||||
|
||||
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`
|
||||
if not self._rescored and any(formset.has_changed() for formset in formsets):
|
||||
self._rescore(form.cleaned_data["key"])
|
||||
formset_changed = False
|
||||
if any(formset.has_changed() for formset in formsets):
|
||||
formset_changed = True
|
||||
|
||||
maybe_trigger_contest_rescore(form, form.instance, formset_changed)
|
||||
|
||||
def has_change_permission(self, request, obj=None):
|
||||
if not request.user.has_perm("judge.edit_own_contest"):
|
||||
|
@ -351,11 +327,6 @@ class ContestAdmin(CompareVersionAdmin):
|
|||
return True
|
||||
return obj.is_editable_by(request.user)
|
||||
|
||||
def _rescore(self, contest_key):
|
||||
from judge.tasks import rescore_contest
|
||||
|
||||
transaction.on_commit(rescore_contest.s(contest_key).delay)
|
||||
|
||||
def make_visible(self, request, queryset):
|
||||
if not request.user.has_perm("judge.change_contest_visibility"):
|
||||
queryset = queryset.filter(
|
||||
|
|
|
@ -5,17 +5,20 @@ from judge.models import (
|
|||
)
|
||||
|
||||
|
||||
def maybe_trigger_contest_rescore(form, contest):
|
||||
if any(
|
||||
f in form.changed_data
|
||||
for f in (
|
||||
"start_time",
|
||||
"end_time",
|
||||
"time_limit",
|
||||
"format_config",
|
||||
"format_name",
|
||||
"freeze_after",
|
||||
def maybe_trigger_contest_rescore(form, contest, force_rescore=False):
|
||||
if (
|
||||
any(
|
||||
f in form.changed_data
|
||||
for f in (
|
||||
"start_time",
|
||||
"end_time",
|
||||
"time_limit",
|
||||
"format_config",
|
||||
"format_name",
|
||||
"freeze_after",
|
||||
)
|
||||
)
|
||||
or force_rescore
|
||||
):
|
||||
transaction.on_commit(rescore_contest.s(contest.key).delay)
|
||||
|
||||
|
|
|
@ -715,7 +715,10 @@ class EditCourseContest(CourseEditableMixin, FormView):
|
|||
def post(self, request, *args, **kwargs):
|
||||
problem_formset = self.get_problem_formset(True)
|
||||
if problem_formset.is_valid():
|
||||
self.problem_form_changes = False
|
||||
for problem_form in problem_formset:
|
||||
if problem_form.has_changed():
|
||||
self.problem_form_changes = True
|
||||
if problem_form.cleaned_data.get("DELETE") and problem_form.instance.pk:
|
||||
problem_form.instance.delete()
|
||||
|
||||
|
@ -741,7 +744,8 @@ class EditCourseContest(CourseEditableMixin, FormView):
|
|||
revisions.set_comment(_("Edited from course") + " " + self.course.name)
|
||||
revisions.set_user(self.request.user)
|
||||
|
||||
maybe_trigger_contest_rescore(form, self.contest)
|
||||
if self.problem_form_changes:
|
||||
maybe_trigger_contest_rescore(form, self.contest, True)
|
||||
|
||||
form.save()
|
||||
|
||||
|
|
|
@ -1039,7 +1039,7 @@ class EditOrganizationContest(
|
|||
self.object.is_organization_private = True
|
||||
self.object.save()
|
||||
|
||||
maybe_trigger_contest_rescore(form, self.object)
|
||||
maybe_trigger_contest_rescore(form, self.object, True)
|
||||
|
||||
return res
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue