We can only register during the first phase

This commit is contained in:
Yohann D'ANELLO 2020-11-15 01:40:20 +01:00
parent ece1e800ab
commit d3e18a8fbb
4 changed files with 31 additions and 7 deletions

View File

@ -65,7 +65,7 @@ class Team(models.Model):
"education", "education",
raise_error=False, raise_error=False,
) )
if self.pk and self.participation.valid: if self.pk and self.participation.valid: # pragma: no cover
get_sympa_client().subscribe(self.email, "equipes", False, f"Equipe {self.name}") get_sympa_client().subscribe(self.email, "equipes", False, f"Equipe {self.name}")
get_sympa_client().subscribe(self.email, f"probleme-{self.participation.problem}", False, get_sympa_client().subscribe(self.email, f"probleme-{self.participation.problem}", False,
f"Equipe {self.name}") f"Equipe {self.name}")
@ -76,7 +76,7 @@ class Team(models.Model):
""" """
Drop the Sympa mailing list, if the team is empty or if the trigram changed. Drop the Sympa mailing list, if the team is empty or if the trigram changed.
""" """
if self.participation.valid: if self.participation.valid: # pragma: no cover
get_sympa_client().unsubscribe(self.email, "equipes", False) get_sympa_client().unsubscribe(self.email, "equipes", False)
get_sympa_client().unsubscribe(self.email, f"probleme-{self.participation.problem}", False) get_sympa_client().unsubscribe(self.email, f"probleme-{self.participation.problem}", False)
else: else:
@ -292,10 +292,8 @@ class Phase(models.Model):
qs = Phase.objects.filter(start__lte=timezone.now(), end__gte=timezone.now()) qs = Phase.objects.filter(start__lte=timezone.now(), end__gte=timezone.now())
if qs.exists(): if qs.exists():
return qs.get() return qs.get()
qs = Phase.objects.order_by("phase_number").all() qs = Phase.objects.filter(start__lte=timezone.now()).order_by("phase_number").all()
if timezone.now() < qs.first().start: return qs.last() if qs.exists() else None
return qs.first()
return qs.last()
def __str__(self): def __str__(self):
return _("Phase {phase_number:d} starts on {start:%Y-%m-%d %H:%M} and ends on {end:%Y-%m-%d %H:%M}")\ return _("Phase {phase_number:d} starts on {start:%Y-%m-%d %H:%M} and ends on {end:%Y-%m-%d %H:%M}")\

View File

@ -575,7 +575,7 @@ class TestStudentParticipation(TestCase):
for i in range(1, 5): for i in range(1, 5):
Phase.objects.filter(phase_number=i).update(start=timezone.now() + timedelta(days=2 * i), Phase.objects.filter(phase_number=i).update(start=timezone.now() + timedelta(days=2 * i),
end=timezone.now() + timedelta(days=2 * i + 1)) end=timezone.now() + timedelta(days=2 * i + 1))
self.assertEqual(Phase.current_phase().phase_number, 1) self.assertEqual(Phase.current_phase(), None)
# We are after the end # We are after the end
for i in range(1, 5): for i in range(1, 5):

View File

@ -4,6 +4,7 @@ from django.contrib.auth.models import User
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.forms import FileInput from django.forms import FileInput
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from participation.models import Phase
from .models import AdminRegistration, CoachRegistration, StudentRegistration from .models import AdminRegistration, CoachRegistration, StudentRegistration
@ -28,6 +29,11 @@ class SignupForm(UserCreationForm):
self.fields["last_name"].required = True self.fields["last_name"].required = True
self.fields["email"].required = True self.fields["email"].required = True
def clean(self):
if Phase.current_phase() is None or Phase.current_phase().phase_number >= 2:
self.add_error(None, _("You can't register now."))
return super().clean()
class Meta: class Meta:
model = User model = User
fields = ('first_name', 'last_name', 'email', 'password1', 'password2', 'role',) fields = ('first_name', 'last_name', 'email', 'password1', 'password2', 'role',)

View File

@ -1,3 +1,4 @@
from datetime import timedelta
import os import os
from corres2math.tokens import email_validation_token from corres2math.tokens import email_validation_token
@ -7,8 +8,10 @@ from django.contrib.sites.models import Site
from django.core.management import call_command from django.core.management import call_command
from django.test import TestCase from django.test import TestCase
from django.urls import reverse from django.urls import reverse
from django.utils import timezone
from django.utils.encoding import force_bytes from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode from django.utils.http import urlsafe_base64_encode
from participation.models import Phase
from .models import AdminRegistration, CoachRegistration, StudentRegistration from .models import AdminRegistration, CoachRegistration, StudentRegistration
@ -84,6 +87,23 @@ class TestRegistration(TestCase):
response = self.client.get(reverse("registration:signup")) response = self.client.get(reverse("registration:signup"))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
# After first phase
response = self.client.post(reverse("registration:signup"), data=dict(
last_name="Toto",
first_name="Toto",
email="toto@example.com",
password1="azertyuiopazertyuiop",
password2="azertyuiopazertyuiop",
role="participant",
student_class=12,
school="God",
give_contact_to_animath=False,
))
self.assertEqual(response.status_code, 200)
Phase.objects.filter(phase_number__gte=2).update(start=timezone.now() + timedelta(days=1),
end=timezone.now() + timedelta(days=2))
# Incomplete form # Incomplete form
response = self.client.post(reverse("registration:signup"), data=dict( response = self.client.post(reverse("registration:signup"), data=dict(
last_name="Toto", last_name="Toto",