2020-04-29 02:06:02 +00:00
|
|
|
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")),
|
|
|
|
],
|
2020-04-29 02:26:26 +00:00
|
|
|
verbose_name=_("address"),
|
2020-04-29 02:06:02 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
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")
|