1
0
mirror of https://gitlab.com/animath/si/plateforme-corres2math.git synced 2024-12-26 05:02:21 +00:00
plateforme-corres2math/apps/participation/forms.py

102 lines
3.2 KiB
Python
Raw Normal View History

2020-09-23 21:20:44 +00:00
import re
2020-10-20 11:14:02 +00:00
from bootstrap_datepicker_plus import DateTimePickerInput
2020-09-22 18:41:42 +00:00
from django import forms
from django.core.exceptions import ValidationError
2020-09-23 21:20:44 +00:00
from django.utils.translation import gettext_lazy as _
2020-09-22 18:41:42 +00:00
2020-10-20 11:14:02 +00:00
from .models import Participation, Phase, Team, Video
2020-09-22 18:41:42 +00:00
class TeamForm(forms.ModelForm):
2020-09-23 21:20:44 +00:00
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
2020-09-22 18:41:42 +00:00
class Meta:
model = Team
fields = ('name', 'trigram', 'grant_animath_access_videos',)
class JoinTeamForm(forms.ModelForm):
def clean_access_code(self):
access_code = self.cleaned_data["access_code"]
if not Team.objects.filter(access_code=access_code).exists():
2020-09-23 21:20:44 +00:00
raise ValidationError(_("No team was found with this access code."))
2020-09-22 18:41:42 +00:00
return access_code
def clean(self):
cleaned_data = super().clean()
if "access_code" in cleaned_data:
2020-09-23 21:20:44 +00:00
team = Team.objects.get(access_code=cleaned_data["access_code"])
self.instance = team
2020-09-22 18:41:42 +00:00
return cleaned_data
class Meta:
model = Team
fields = ('access_code',)
2020-09-24 09:15:54 +00:00
class ParticipationForm(forms.ModelForm):
class Meta:
model = Participation
fields = ('problem',)
2020-09-27 12:32:05 +00:00
2020-10-11 16:44:42 +00:00
class RequestValidationForm(forms.Form):
_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_type = forms.CharField(
initial="ValidateParticipationForm",
widget=forms.HiddenInput(),
)
message = forms.CharField(
label=_("Message to address to the team:"),
widget=forms.Textarea(),
)
2020-09-27 12:32:05 +00:00
class UploadVideoForm(forms.ModelForm):
class Meta:
model = Video
fields = ('link',)
2020-10-20 11:14:02 +00:00
2020-10-20 12:51:09 +00:00
def clean(self):
if Phase.current_phase().phase_number != 1 and self.instance.link:
self.add_error("link", _("You can't upload your video after the deadline."))
return super().clean()
2020-10-20 11:14:02 +00:00
class PhaseForm(forms.ModelForm):
class Meta:
model = Phase
fields = ('start', 'end',)
widgets = {
2020-10-20 12:21:16 +00:00
'start': DateTimePickerInput(format='%d/%m/%Y %H:%M'),
'end': DateTimePickerInput(format='%d/%m/%Y %H:%M'),
2020-10-20 11:14:02 +00:00
}
2020-10-20 12:21:16 +00:00
def clean(self):
# Ensure that dates are in a right order
cleaned_data = super().clean()
if cleaned_data["end"] <= cleaned_data["start"]:
self.add_error("end", _("Start date must be before the end date."))
if Phase.objects.filter(phase_number__lt=self.instance.phase_number, end__gt=cleaned_data["start"]).exists():
self.add_error("start", _("This phase must start after the previous phases."))
if Phase.objects.filter(phase_number__gt=self.instance.phase_number, start__lt=cleaned_data["end"]).exists():
self.add_error("end", _("This phase must end after the next phases."))
return cleaned_data