135 lines
4.0 KiB
Python
135 lines
4.0 KiB
Python
from django.contrib.sites.models import Site
|
|
from django.db import models
|
|
from django.template import loader
|
|
from django.utils.encoding import force_bytes
|
|
from django.utils.http import urlsafe_base64_encode
|
|
from django.utils.translation import gettext_lazy as _
|
|
from polymorphic.models import PolymorphicModel
|
|
|
|
from corres2math.tokens import email_validation_token
|
|
|
|
|
|
class Registration(PolymorphicModel):
|
|
user = models.OneToOneField(
|
|
"auth.User",
|
|
on_delete=models.CASCADE,
|
|
verbose_name=_("user"),
|
|
)
|
|
|
|
give_contact_to_animath = models.BooleanField(
|
|
default=False,
|
|
verbose_name=_("Grant Animath to contact me in the future about other actions"),
|
|
)
|
|
|
|
email_confirmed = models.BooleanField(
|
|
default=False,
|
|
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):
|
|
subject = "[Corres2math] " + str(_("Activate your Correspondances account"))
|
|
token = email_validation_token.make_token(self.user)
|
|
uid = urlsafe_base64_encode(force_bytes(self.user.pk))
|
|
site = Site.objects.first()
|
|
message = loader.render_to_string('registration/mails/email_validation_email.txt',
|
|
{
|
|
'user': self.user,
|
|
'domain': site.domain,
|
|
'token': token,
|
|
'uid': uid,
|
|
})
|
|
html = loader.render_to_string('registration/mails/email_validation_email.html',
|
|
{
|
|
'user': self.user,
|
|
'domain': site.domain,
|
|
'token': token,
|
|
'uid': uid,
|
|
})
|
|
self.user.email_user(subject, message, html_message=html)
|
|
|
|
@property
|
|
def type(self):
|
|
raise NotImplementedError
|
|
|
|
def __str__(self):
|
|
return _("registration of {first_name} {last_name}")\
|
|
.format(first_name=self.user.first_name, last_name=self.user.last_name)
|
|
|
|
class Meta:
|
|
verbose_name = _("registration")
|
|
verbose_name_plural = _("registrations")
|
|
|
|
|
|
class StudentRegistration(Registration):
|
|
team = models.ForeignKey(
|
|
"participation.Team",
|
|
related_name="students",
|
|
on_delete=models.PROTECT,
|
|
null=True,
|
|
default=None,
|
|
verbose_name=_("team"),
|
|
)
|
|
|
|
student_class = models.IntegerField(
|
|
choices=[
|
|
(12, _("12th grade")),
|
|
(11, _("11th grade")),
|
|
(10, _("10th grade or lower")),
|
|
],
|
|
verbose_name=_("student class"),
|
|
)
|
|
|
|
school = models.CharField(
|
|
max_length=255,
|
|
verbose_name=_("school"),
|
|
)
|
|
|
|
@property
|
|
def type(self):
|
|
return _("student")
|
|
|
|
class Meta:
|
|
verbose_name = _("student registration")
|
|
verbose_name_plural = _("student registrations")
|
|
|
|
|
|
class CoachRegistration(Registration):
|
|
team = models.ForeignKey(
|
|
"participation.Team",
|
|
related_name="coachs",
|
|
on_delete=models.PROTECT,
|
|
null=True,
|
|
default=None,
|
|
verbose_name=_("team"),
|
|
)
|
|
|
|
professional_activity = models.TextField(
|
|
verbose_name=_("professional activity"),
|
|
)
|
|
|
|
@property
|
|
def type(self):
|
|
return _("coach")
|
|
|
|
class Meta:
|
|
verbose_name = _("coach registration")
|
|
verbose_name_plural = _("coach registrations")
|
|
|
|
|
|
class AdminRegistration(Registration):
|
|
role = models.TextField(
|
|
verbose_name=_("role of the administrator"),
|
|
)
|
|
|
|
@property
|
|
def type(self):
|
|
return _("admin")
|
|
|
|
class Meta:
|
|
verbose_name = _("admin registration")
|
|
verbose_name_plural = _("admin registrations")
|