from django.contrib.auth.models import AbstractUser from django.db import models from django.utils.translation import gettext_lazy as _ from polymorphic.models import PolymorphicModel from tournament.models import Team, Tournament class TFJMUser(AbstractUser): USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] email = models.EmailField( unique=True, verbose_name=_("email"), ) team = models.ForeignKey( Team, null=True, on_delete=models.SET_NULL, related_name="users", verbose_name=_("team"), ) birth_date = models.DateField( null=True, default=None, verbose_name=_("birth date"), ) gender = models.CharField( max_length=16, null=True, default=None, choices=[ ("male", _("Male")), ("female", _("Female")), ("non-binary", _("Non binary")), ], verbose_name=_("address"), ) address = models.CharField( max_length=255, null=True, default=None, verbose_name=_("address"), ) postal_code = models.PositiveSmallIntegerField( null=True, default=None, verbose_name=_("postal code"), ) city = models.CharField( max_length=255, null=True, default=None, verbose_name=_("city"), ) country = models.CharField( max_length=255, default="France", null=True, verbose_name=_("country"), ) phone_number = models.CharField( max_length=20, null=True, blank=True, default=None, verbose_name=_("phone number"), ) school = models.CharField( max_length=255, null=True, default=None, verbose_name=_("school"), ) student_class = models.CharField( max_length=16, choices=[ ('seconde', _("Seconde or less")), ('première', _("Première")), ('terminale', _("Terminale")), ], null=True, default=None, verbose_name="class", ) responsible_name = models.CharField( max_length=255, null=True, default=None, verbose_name=_("responsible name"), ) responsible_phone = models.CharField( max_length=20, null=True, default=None, verbose_name=_("responsible phone"), ) responsible_email = models.EmailField( null=True, default=None, verbose_name=_("responsible email"), ) description = models.TextField( null=True, default=None, verbose_name=_("description"), ) role = models.CharField( max_length=16, choices=[ ("admin", _("admin")), ("organizer", _("organizer")), ("encadrant", _("encadrant")), ("participant", _("participant")), ] ) year = models.PositiveIntegerField( verbose_name=_("year"), ) class Meta: verbose_name = _("user") verbose_name_plural = _("users") class AbstractDocument(PolymorphicModel): file = models.FileField( unique=True, upload_to="files/", verbose_name=_("file"), ) team = models.ForeignKey( Team, on_delete=models.CASCADE, related_name="documents", verbose_name=_("team"), ) tournament = models.ForeignKey( Tournament, on_delete=models.CASCADE, related_name="documents", verbose_name=_("tournament"), ) type = models.CharField( max_length=32, choices=[ ("parental_consent", _("Parental consent")), ("photo_consent", _("Photo consent")), ("sanitary_plug", _("Sanitary plug")), ("motivation_letter", _("Motivation letter")), ("scholarship", _("Scholarship")), ("solution", _("Solution")), ("synthesis", _("Synthesis")), ], verbose_name=_("type"), ) uploaded_at = models.DateTimeField( auto_now_add=True, verbose_name=_("uploaded at"), ) class Meta: verbose_name = _("abstract document") verbose_name_plural = _("abstract documents") class Document(AbstractDocument): class Meta: verbose_name = _("document") verbose_name_plural = _("documents") class Solution(Document): problem = models.PositiveSmallIntegerField( verbose_name=_("problem"), ) def save(self, **kwargs): self.type = "solution" super().save(**kwargs) class Meta: verbose_name = _("solution") verbose_name_plural = _("solutions") class Synthesis(Document): problem = models.PositiveSmallIntegerField( verbose_name=_("problem"), ) def save(self, **kwargs): self.type = "synthesis" super().save(**kwargs) class Meta: verbose_name = _("synthesis") verbose_name_plural = _("syntheses")