from django.core.validators import RegexValidator from django.db import models from django.db.models import Index from django.utils.crypto import get_random_string from django.utils.functional import lazy from django.utils.text import format_lazy from django.utils.translation import gettext_lazy as _ class Team(models.Model): name = models.CharField( max_length=255, verbose_name=_("name"), unique=True, ) trigram = models.CharField( max_length=3, verbose_name=_("trigram"), help_text=_("The trigram must be composed of three uppercase letters."), unique=True, validators=[RegexValidator("[A-Z]{3}")], ) access_code = models.CharField( max_length=6, verbose_name=_("access code"), help_text=_("The access code let other people to join the team."), ) grant_animath_access_videos = models.BooleanField( verbose_name=_("Grant Animath to publish my video"), help_text=_("Give the authorisation to publish the video on the main website to promote the action."), 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): return _("Team {name} ({trigram})").format(name=self.name, trigram=self.trigram) class Meta: verbose_name = _("team") verbose_name_plural = _("teams") indexes = [ Index(fields=("trigram", )), ] class Participation(models.Model): team = models.OneToOneField( Team, on_delete=models.CASCADE, verbose_name=_("team"), ) problem = models.IntegerField( choices=[(i, format_lazy(_("Problem #{problem:d}"), problem=i)) for i in range(1, 5)], null=True, default=None, verbose_name=_("problem number"), ) solution = models.ForeignKey( "participation.Video", on_delete=models.SET_NULL, related_name="+", null=True, default=None, verbose_name=_("solution video"), ) received_participation = models.OneToOneField( "participation.Participation", on_delete=models.PROTECT, related_name="sent_participation", null=True, default=None, verbose_name=_("received participation"), ) synthesis = models.ForeignKey( "participation.Video", on_delete=models.SET_NULL, related_name="+", null=True, default=None, verbose_name=_("synthesis video"), ) def __str__(self): return _("Participation of the team {name} ({trigram})").format(name=self.team.name, trigram=self.team.trigram) class Meta: verbose_name = _("participation") verbose_name_plural = _("participations") class Video(models.Model): participation = models.ForeignKey( "participation.Participation", on_delete=models.CASCADE, verbose_name=_("participation"), ) link = models.URLField( verbose_name=_("link"), help_text=_("The full video link."), ) valid = models.BooleanField( null=True, default=None, verbose_name=_("valid"), help_text=_("The video got the validation of the administrators."), ) def __str__(self): return _("Video of team {name} ({trigram})")\ .format(name=self.participation.team.name, trigram = self.participation.team.trigram) class Meta: verbose_name = _("video") verbose_name_plural = _("videos")