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")