from datetime import datetime, time from django.db import models import pendulum from jarvis.tools.models import ( Markdownizable, Temporizable, get_number_of_weeks_between, ) from jarvis.people.models import Gymnast from jarvis.location.models import Place class EventType(models.Model): """ Classe représentant les types d'évènements. C'est un dictionnaire fini : - compétiton qualificative, - compétition finale, - démonstration, - … """ COLOR_CHOICES = ( (0, "default"), (1, "azure"), (2, "green"), (3, "orange"), (4, "red"), ) class Meta: verbose_name = "Event Type" verbose_name_plural = "Event Types" name = models.CharField(max_length=255, verbose_name="Nom") acronym = models.CharField(max_length=15, verbose_name="Acronyme") color = models.PositiveSmallIntegerField(choices=COLOR_CHOICES) def __str__(self): return f"{self.name} ({self.acronym})" class Event(Markdownizable, Temporizable): """Classe représentant les évènements. Un évènement est caractérisé par : - un nom, - un lieu (place), - un type (compétition, démonstration, …), - des gymnastes (participation prévue). """ class Meta: verbose_name = "Event" verbose_name_plural = "Event" place = models.ForeignKey(Place, on_delete=models.CASCADE, default=None) event_type = models.ForeignKey( EventType, verbose_name="Type", on_delete=models.CASCADE, default=None ) name = models.CharField(max_length=255, verbose_name="Nom") gymnasts = models.ManyToManyField( Gymnast, through="EventParticipation", related_name="participate_to", verbose_name="Participants", ) def __str__(self): return f"{self.name} (à {self.place})" def save(self, *args, **kwargs): self.checkdates() super().save(*args, **kwargs) def checkdates(self): """ Fonction assignant la date de fin d'un évènement à la date de début, si la date de fin n'est pas définie, l'heure de fin est par défaut 18h00. """ if self.date_end is None and self.date_begin is not None: self.date_end = datetime.combine(self.date_begin.date(), time(18, 0)) @property def number_of_week_from_today(self): today = pendulum.now().date() return get_number_of_weeks_between(today, self.date_begin.date()) class EventParticipation(models.Model): """ """ class Meta: verbose_name = "Event Participation" event = models.ForeignKey(Event, on_delete=models.CASCADE) gymnast = models.ForeignKey(Gymnast, on_delete=models.CASCADE) rank = models.PositiveSmallIntegerField(default=0) def __str__(self): return f"{self.gymnast} to {self.event}"