Ultron/ultron/planning/models.py

101 lines
2.8 KiB
Python

from datetime import datetime, time
from django.contrib.auth import get_user_model
from django.db import models
import pendulum
from ultron.tools.models import (
Markdownizable,
Temporizable,
get_number_of_weeks_between,
)
from ultron.people.models import Gymnast
from ultron.location.models import Place
# User = get_user_model()
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,
- …
"""
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")
def __str__(self):
return "%s (%s)" % (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)
eventtype = 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="Event_Participation",
related_name="participate_to",
verbose_name="Participants",
)
def __str__(self):
return "%s%s)" % (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.dateend is None and self.datebegin is not None:
self.dateend = datetime.combine(self.datebegin.date(), time(18, 0))
@property
def number_of_week_from_today(self):
today = pendulum.now().date()
return get_number_of_weeks_between(today, self.datebegin.date())
class Event_Participation(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 "%s to %s" % (self.gymnast, self.event)