Only allow group contest when cloning
This commit is contained in:
parent
8f42885482
commit
68e705404e
3 changed files with 56 additions and 5 deletions
|
@ -474,6 +474,15 @@ class ContestCloneForm(Form):
|
||||||
max_length=20,
|
max_length=20,
|
||||||
validators=[RegexValidator("^[a-z0-9]+$", _("Contest id must be ^[a-z0-9]+$"))],
|
validators=[RegexValidator("^[a-z0-9]+$", _("Contest id must be ^[a-z0-9]+$"))],
|
||||||
)
|
)
|
||||||
|
organization = ChoiceField(choices=(), required=True)
|
||||||
|
|
||||||
|
def __init__(self, *args, org_choices=(), profile=None, **kwargs):
|
||||||
|
super(ContestCloneForm, self).__init__(*args, **kwargs)
|
||||||
|
self.fields["organization"].widget = Select2Widget(
|
||||||
|
attrs={"style": "width: 100%", "data-placeholder": _("Group")},
|
||||||
|
)
|
||||||
|
self.fields["organization"].choices = org_choices
|
||||||
|
self.profile = profile
|
||||||
|
|
||||||
def clean_key(self):
|
def clean_key(self):
|
||||||
key = self.cleaned_data["key"]
|
key = self.cleaned_data["key"]
|
||||||
|
@ -481,6 +490,16 @@ class ContestCloneForm(Form):
|
||||||
raise ValidationError(_("Contest with key already exists."))
|
raise ValidationError(_("Contest with key already exists."))
|
||||||
return key
|
return key
|
||||||
|
|
||||||
|
def clean_organization(self):
|
||||||
|
organization_id = self.cleaned_data["organization"]
|
||||||
|
try:
|
||||||
|
organization = Organization.objects.get(id=organization_id)
|
||||||
|
except Exception:
|
||||||
|
raise ValidationError(_("Group doesn't exist."))
|
||||||
|
if not organization.admins.filter(id=self.profile.id).exists():
|
||||||
|
raise ValidationError(_("You don't have permission in this group."))
|
||||||
|
return organization
|
||||||
|
|
||||||
|
|
||||||
class ProblemPointsVoteForm(ModelForm):
|
class ProblemPointsVoteForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -453,9 +453,19 @@ class ContestClone(
|
||||||
form_class = ContestCloneForm
|
form_class = ContestCloneForm
|
||||||
permission_required = "judge.clone_contest"
|
permission_required = "judge.clone_contest"
|
||||||
|
|
||||||
|
def get_form_kwargs(self):
|
||||||
|
kwargs = super().get_form_kwargs()
|
||||||
|
kwargs["org_choices"] = tuple(
|
||||||
|
Organization.objects.filter(admins=self.request.profile).values_list(
|
||||||
|
"id", "name"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
kwargs["profile"] = self.request.profile
|
||||||
|
return kwargs
|
||||||
|
|
||||||
def form_valid(self, form):
|
def form_valid(self, form):
|
||||||
tags = self.object.tags.all()
|
tags = self.object.tags.all()
|
||||||
organizations = self.object.organizations.all()
|
organization = form.cleaned_data["organization"]
|
||||||
private_contestants = self.object.private_contestants.all()
|
private_contestants = self.object.private_contestants.all()
|
||||||
view_contest_scoreboard = self.object.view_contest_scoreboard.all()
|
view_contest_scoreboard = self.object.view_contest_scoreboard.all()
|
||||||
contest_problems = self.object.contest_problems.all()
|
contest_problems = self.object.contest_problems.all()
|
||||||
|
@ -469,7 +479,7 @@ class ContestClone(
|
||||||
contest.save()
|
contest.save()
|
||||||
|
|
||||||
contest.tags.set(tags)
|
contest.tags.set(tags)
|
||||||
contest.organizations.set(organizations)
|
contest.organizations.set([organization])
|
||||||
contest.private_contestants.set(private_contestants)
|
contest.private_contestants.set(private_contestants)
|
||||||
contest.view_contest_scoreboard.set(view_contest_scoreboard)
|
contest.view_contest_scoreboard.set(view_contest_scoreboard)
|
||||||
contest.authors.add(self.request.profile)
|
contest.authors.add(self.request.profile)
|
||||||
|
@ -480,7 +490,14 @@ class ContestClone(
|
||||||
ContestProblem.objects.bulk_create(contest_problems)
|
ContestProblem.objects.bulk_create(contest_problems)
|
||||||
|
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
reverse("admin:judge_contest_change", args=(contest.id,))
|
reverse(
|
||||||
|
"organization_contest_edit",
|
||||||
|
args=(
|
||||||
|
organization.id,
|
||||||
|
organization.slug,
|
||||||
|
contest.key,
|
||||||
|
),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,17 +25,32 @@
|
||||||
</style>
|
</style>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block js_media %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(function() {
|
||||||
|
$("#id_organization").select2();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
<form id="contest-clone-panel" action="" method="post" class="form-area">
|
<form id="contest-clone-panel" action="" method="post" class="form-area">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{% if form.errors %}
|
{% if form.key.errors %}
|
||||||
<div id="form-errors">
|
<div id="form-errors">
|
||||||
{{ form.key.errors }}
|
<div>{{ form.key.errors }}</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div><label class="inline-header grayed">{{ _('Enter a new key for the cloned contest:') }}</label></div>
|
<div><label class="inline-header grayed">{{ _('Enter a new key for the cloned contest:') }}</label></div>
|
||||||
<div id="contest-key-container"><span class="fullwidth">{{ form.key }}</span></div>
|
<div id="contest-key-container"><span class="fullwidth">{{ form.key }}</span></div>
|
||||||
|
<div><label class="inline-header grayed">{{ _('Group:') }}</label></div>
|
||||||
|
{{form.organization}}
|
||||||
|
{% if form.organization.errors %}
|
||||||
|
<div id="form-errors">
|
||||||
|
<div>{{ form.organization.errors }}</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
<hr>
|
<hr>
|
||||||
<button style="float: right;" type="submit">{{ _('Clone!') }}</button>
|
<button style="float: right;" type="submit">{{ _('Clone!') }}</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
Loading…
Reference in a new issue