2020-12-27 10:49:54 +00:00
|
|
|
# Copyright (C) 2020 by Animath
|
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
|
|
import re
|
|
|
|
|
2020-12-31 11:13:42 +00:00
|
|
|
from bootstrap_datepicker_plus import DatePickerInput, DateTimePickerInput
|
2020-12-27 10:49:54 +00:00
|
|
|
from django import forms
|
2020-12-28 17:52:50 +00:00
|
|
|
from django.core.exceptions import ValidationError
|
2020-12-31 11:13:42 +00:00
|
|
|
from django.utils import formats
|
2020-12-27 10:49:54 +00:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
2020-12-31 11:13:42 +00:00
|
|
|
from .models import Participation, Team, Tournament
|
2020-12-27 10:49:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
class TeamForm(forms.ModelForm):
|
|
|
|
"""
|
|
|
|
Form to create a team, with the name and the trigram,
|
|
|
|
and if the team accepts that Animath diffuse the videos.
|
|
|
|
"""
|
|
|
|
def clean_trigram(self):
|
|
|
|
trigram = self.cleaned_data["trigram"].upper()
|
|
|
|
if not re.match("[A-Z]{3}", trigram):
|
|
|
|
raise ValidationError(_("The trigram must be composed of three uppercase letters."))
|
|
|
|
return trigram
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Team
|
2020-12-28 17:52:50 +00:00
|
|
|
fields = ('name', 'trigram',)
|
2020-12-27 10:49:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
class JoinTeamForm(forms.ModelForm):
|
|
|
|
"""
|
|
|
|
Form to join a team by the access code.
|
|
|
|
"""
|
|
|
|
def clean_access_code(self):
|
|
|
|
access_code = self.cleaned_data["access_code"]
|
|
|
|
if not Team.objects.filter(access_code=access_code).exists():
|
|
|
|
raise ValidationError(_("No team was found with this access code."))
|
|
|
|
return access_code
|
|
|
|
|
|
|
|
def clean(self):
|
|
|
|
cleaned_data = super().clean()
|
|
|
|
if "access_code" in cleaned_data:
|
|
|
|
team = Team.objects.get(access_code=cleaned_data["access_code"])
|
|
|
|
self.instance = team
|
|
|
|
return cleaned_data
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Team
|
|
|
|
fields = ('access_code',)
|
|
|
|
|
|
|
|
|
|
|
|
class ParticipationForm(forms.ModelForm):
|
|
|
|
"""
|
|
|
|
Form to update the problem of a team participation.
|
|
|
|
"""
|
|
|
|
class Meta:
|
|
|
|
model = Participation
|
2020-12-28 17:52:50 +00:00
|
|
|
fields = ('tournament',)
|
2020-12-27 10:49:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
class RequestValidationForm(forms.Form):
|
|
|
|
"""
|
|
|
|
Form to ask about validation.
|
|
|
|
"""
|
|
|
|
_form_type = forms.CharField(
|
|
|
|
initial="RequestValidationForm",
|
|
|
|
widget=forms.HiddenInput(),
|
|
|
|
)
|
|
|
|
|
|
|
|
engagement = forms.BooleanField(
|
|
|
|
label=_("I engage myself to participate to the whole \"Correspondances\"."),
|
|
|
|
required=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class ValidateParticipationForm(forms.Form):
|
|
|
|
"""
|
|
|
|
Form to let administrators to accept or refuse a team.
|
|
|
|
"""
|
|
|
|
_form_type = forms.CharField(
|
|
|
|
initial="ValidateParticipationForm",
|
|
|
|
widget=forms.HiddenInput(),
|
|
|
|
)
|
|
|
|
|
|
|
|
message = forms.CharField(
|
|
|
|
label=_("Message to address to the team:"),
|
|
|
|
widget=forms.Textarea(),
|
|
|
|
)
|
2020-12-31 11:13:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
class TournamentForm(forms.ModelForm):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
self.fields["date_start"].widget = DatePickerInput(
|
|
|
|
format=formats.get_format_lazy(format_type="DATE_INPUT_FORMATS", use_l10n=True)[0])
|
|
|
|
self.fields["date_end"].widget = DatePickerInput(
|
|
|
|
format=formats.get_format_lazy(format_type="DATE_INPUT_FORMATS", use_l10n=True)[0])
|
|
|
|
self.fields["inscription_limit"].widget = DateTimePickerInput(
|
|
|
|
format=formats.get_format_lazy(format_type="DATETIME_INPUT_FORMATS", use_l10n=True)[0])
|
|
|
|
self.fields["solution_limit"].widget = DateTimePickerInput(
|
|
|
|
format=formats.get_format_lazy(format_type="DATETIME_INPUT_FORMATS", use_l10n=True)[0])
|
2021-01-01 11:11:09 +00:00
|
|
|
self.fields["solutions_draw"].widget = DateTimePickerInput(
|
|
|
|
format=formats.get_format_lazy(format_type="DATETIME_INPUT_FORMATS", use_l10n=True)[0])
|
2020-12-31 11:13:42 +00:00
|
|
|
self.fields["syntheses_first_phase_limit"].widget = DateTimePickerInput(
|
|
|
|
format=formats.get_format_lazy(format_type="DATETIME_INPUT_FORMATS", use_l10n=True)[0])
|
2021-01-01 11:11:09 +00:00
|
|
|
self.fields["solutions_available_second_phase"].widget = DateTimePickerInput(
|
|
|
|
format=formats.get_format_lazy(format_type="DATETIME_INPUT_FORMATS", use_l10n=True)[0])
|
2020-12-31 11:13:42 +00:00
|
|
|
self.fields["syntheses_second_phase_limit"].widget = DateTimePickerInput(
|
|
|
|
format=formats.get_format_lazy(format_type="DATETIME_INPUT_FORMATS", use_l10n=True)[0])
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
model = Tournament
|
|
|
|
fields = '__all__'
|