104 lines
2.9 KiB
Python
104 lines
2.9 KiB
Python
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}"
|