mirror of
https://gitlab.com/animath/si/plateforme-corres2math.git
synced 2025-02-06 12:53:03 +00:00
Create and join teams forms
This commit is contained in:
parent
369c9e2fa2
commit
cce3a0a7df
@ -1,10 +1,19 @@
|
|||||||
|
import re
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from .models import Team
|
from .models import Team
|
||||||
|
|
||||||
|
|
||||||
class TeamForm(forms.ModelForm):
|
class TeamForm(forms.ModelForm):
|
||||||
|
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:
|
class Meta:
|
||||||
model = Team
|
model = Team
|
||||||
fields = ('name', 'trigram', 'grant_animath_access_videos',)
|
fields = ('name', 'trigram', 'grant_animath_access_videos',)
|
||||||
@ -14,13 +23,14 @@ class JoinTeamForm(forms.ModelForm):
|
|||||||
def clean_access_code(self):
|
def clean_access_code(self):
|
||||||
access_code = self.cleaned_data["access_code"]
|
access_code = self.cleaned_data["access_code"]
|
||||||
if not Team.objects.filter(access_code=access_code).exists():
|
if not Team.objects.filter(access_code=access_code).exists():
|
||||||
raise ValidationError("No team was found with this access code.")
|
raise ValidationError(_("No team was found with this access code."))
|
||||||
return access_code
|
return access_code
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
cleaned_data = super().clean()
|
cleaned_data = super().clean()
|
||||||
if "access_code" in cleaned_data:
|
if "access_code" in cleaned_data:
|
||||||
self.instance = Team.objects.get(access_code=cleaned_data["access_code"])
|
team = Team.objects.get(access_code=cleaned_data["access_code"])
|
||||||
|
self.instance = team
|
||||||
return cleaned_data
|
return cleaned_data
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -29,7 +29,7 @@ class Migration(migrations.Migration):
|
|||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('name', models.CharField(max_length=255, unique=True, verbose_name='name')),
|
('name', models.CharField(max_length=255, unique=True, verbose_name='name')),
|
||||||
('trigram', models.CharField(help_text='The trigram must be composed of 3 uppercase letters.', max_length=3, unique=True, validators=[django.core.validators.RegexValidator('[A-Z]{3}')], verbose_name='trigram')),
|
('trigram', models.CharField(help_text='The trigram must be composed of three uppercase letters.', max_length=3, unique=True, validators=[django.core.validators.RegexValidator('[A-Z]{3}')], verbose_name='trigram')),
|
||||||
('access_code', models.CharField(help_text='The access code let other people to join the team.', max_length=6, verbose_name='access code')),
|
('access_code', models.CharField(help_text='The access code let other people to join the team.', max_length=6, verbose_name='access code')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
from django.core.validators import RegexValidator
|
from django.core.validators import RegexValidator
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models import Index
|
from django.db.models import Index
|
||||||
|
from django.utils.crypto import get_random_string
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
@ -14,7 +15,7 @@ class Team(models.Model):
|
|||||||
trigram = models.CharField(
|
trigram = models.CharField(
|
||||||
max_length=3,
|
max_length=3,
|
||||||
verbose_name=_("trigram"),
|
verbose_name=_("trigram"),
|
||||||
help_text=_("The trigram must be composed of 3 uppercase letters."),
|
help_text=_("The trigram must be composed of three uppercase letters."),
|
||||||
unique=True,
|
unique=True,
|
||||||
validators=[RegexValidator("[A-Z]{3}")],
|
validators=[RegexValidator("[A-Z]{3}")],
|
||||||
)
|
)
|
||||||
@ -31,6 +32,11 @@ class Team(models.Model):
|
|||||||
default=False,
|
default=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
if not self.access_code:
|
||||||
|
self.access_code = get_random_string(6)
|
||||||
|
return super().save(*args, **kwargs)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return _("Team {name} ({trigram})").format(name=self.name, trigram=self.trigram)
|
return _("Team {name} ({trigram})").format(name=self.name, trigram=self.trigram)
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
from django.db import transaction
|
||||||
|
from django.urls import reverse_lazy
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.views.generic import CreateView, FormView
|
from django.views.generic import CreateView, FormView
|
||||||
|
|
||||||
@ -12,9 +14,47 @@ class CreateTeamView(LoginRequiredMixin, CreateView):
|
|||||||
extra_context = dict(title=_("Create team"))
|
extra_context = dict(title=_("Create team"))
|
||||||
template_name = "participation/create_team.html"
|
template_name = "participation/create_team.html"
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
def form_valid(self, form):
|
||||||
|
user = self.request.user
|
||||||
|
registration = user.registration
|
||||||
|
if not registration.participates:
|
||||||
|
form.add_error(None, _("You don't participate, so you can't create a team."))
|
||||||
|
return self.form_invalid(form)
|
||||||
|
elif registration.team:
|
||||||
|
form.add_error(None, _("You are already in a team."))
|
||||||
|
return self.form_invalid(form)
|
||||||
|
|
||||||
|
ret = super().form_valid(form)
|
||||||
|
registration.team = form.instance
|
||||||
|
registration.save()
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
return reverse_lazy("index")
|
||||||
|
|
||||||
|
|
||||||
class JoinTeamView(LoginRequiredMixin, FormView):
|
class JoinTeamView(LoginRequiredMixin, FormView):
|
||||||
model = Team
|
model = Team
|
||||||
form_class = JoinTeamForm
|
form_class = JoinTeamForm
|
||||||
extra_context = dict(title=_("Join team"))
|
extra_context = dict(title=_("Join team"))
|
||||||
template_name = "participation/create_team.html"
|
template_name = "participation/create_team.html"
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
def form_valid(self, form):
|
||||||
|
user = self.request.user
|
||||||
|
registration = user.registration
|
||||||
|
if not registration.participates:
|
||||||
|
form.add_error(None, _("You don't participate, so you can't create a team."))
|
||||||
|
return self.form_invalid(form)
|
||||||
|
elif registration.team:
|
||||||
|
form.add_error(None, _("You are already in a team."))
|
||||||
|
return self.form_invalid(form)
|
||||||
|
|
||||||
|
ret = super().form_valid(form)
|
||||||
|
registration.team = form.instance
|
||||||
|
registration.save()
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
return reverse_lazy("index")
|
||||||
|
@ -26,10 +26,6 @@ class Registration(PolymorphicModel):
|
|||||||
verbose_name=_("email confirmed"),
|
verbose_name=_("email confirmed"),
|
||||||
)
|
)
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
|
||||||
self.send_email_validation_link()
|
|
||||||
return super().save(*args, **kwargs)
|
|
||||||
|
|
||||||
def send_email_validation_link(self):
|
def send_email_validation_link(self):
|
||||||
subject = "[Corres2math] " + str(_("Activate your Correspondances account"))
|
subject = "[Corres2math] " + str(_("Activate your Correspondances account"))
|
||||||
token = email_validation_token.make_token(self.user)
|
token = email_validation_token.make_token(self.user)
|
||||||
|
@ -50,8 +50,8 @@ class SessionMiddleware(object):
|
|||||||
request.user = User.objects.get(pk=request.session["_fake_user_id"])
|
request.user = User.objects.get(pk=request.session["_fake_user_id"])
|
||||||
|
|
||||||
user = request.user
|
user = request.user
|
||||||
if 'HTTP_X_FORWARDED_FOR' in request.META:
|
if 'HTTP_X_REAL_IP' in request.META:
|
||||||
ip = request.META.get('HTTP_X_FORWARDED_FOR')
|
ip = request.META.get('HTTP_X_REAL_IP')
|
||||||
else:
|
else:
|
||||||
ip = request.META.get('REMOTE_ADDR')
|
ip = request.META.get('REMOTE_ADDR')
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Corres2math\n"
|
"Project-Id-Version: Corres2math\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2020-09-22 21:19+0200\n"
|
"POT-Creation-Date: 2020-09-22 21:26+0200\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: Yohann D'ANELLO <yohann.danello@animath.fr>\n"
|
"Last-Translator: Yohann D'ANELLO <yohann.danello@animath.fr>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
@ -101,6 +101,10 @@ msgstr "changelogs"
|
|||||||
msgid "Changelog of type \"{action}\" for model {model} at {timestamp}"
|
msgid "Changelog of type \"{action}\" for model {model} at {timestamp}"
|
||||||
msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}"
|
msgstr "Changelog de type \"{action}\" pour le modèle {model} le {timestamp}"
|
||||||
|
|
||||||
|
#: apps/participation/forms.py:26
|
||||||
|
msgid "No team was found with this access code."
|
||||||
|
msgstr "Aucune équipe n'a été trouvée avec ce code d'accès."
|
||||||
|
|
||||||
#: apps/participation/models.py:10
|
#: apps/participation/models.py:10
|
||||||
msgid "name"
|
msgid "name"
|
||||||
msgstr "nom"
|
msgstr "nom"
|
||||||
@ -110,8 +114,8 @@ msgid "trigram"
|
|||||||
msgstr "trigramme"
|
msgstr "trigramme"
|
||||||
|
|
||||||
#: apps/participation/models.py:17
|
#: apps/participation/models.py:17
|
||||||
msgid "The trigram must be composed of 3 uppercase letters."
|
msgid "The trigram must be composed of three uppercase letters."
|
||||||
msgstr "Le trigramme doit être composé de 3 lettres majuscules."
|
msgstr "Le trigramme doit être composé de trois lettres majuscules."
|
||||||
|
|
||||||
#: apps/participation/models.py:24
|
#: apps/participation/models.py:24
|
||||||
msgid "access code"
|
msgid "access code"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user