from django.conf import settings from django.db import models class Room(models.Model): class Meta: verbose_name = "salle" verbose_name_plural = "salles" name = models.CharField("nom", max_length=300) latitude = models.DecimalField( "latitude", max_digits=11, decimal_places=8, blank=True, null=True ) longitude = models.DecimalField( "longitude", max_digits=11, decimal_places=8, blank=True, null=True ) notes = models.TextField("notes", blank=True) def __str__(self): return self.name class Unit(models.Model): class Meta: verbose_name = "unité" verbose_name_plural = "unités" name = models.CharField("nom", max_length=50) def __str__(self): return self.name class WorkForm(models.Model): class Meta: verbose_name = "forme de travail" verbose_name_plural = "formes de travail" name = models.CharField("nom", max_length=300) def __str__(self): return self.name class Equipment(models.Model): class Meta: verbose_name = "machine" verbose_name_plural = "machines" name = models.CharField("nom", max_length=300) room = models.ForeignKey( verbose_name="salle", to=Room, on_delete=models.SET_NULL, related_name="equipments", null=True, ) unit = models.ForeignKey( verbose_name="unité", to=Unit, on_delete=models.PROTECT, null=True ) default_work_form = models.ForeignKey( verbose_name="forme de travail par défaut", to=WorkForm, on_delete=models.SET_NULL, null=True, ) default_repetition_number = models.PositiveIntegerField( "nombre de répétitions par défaut", default=12 ) @property def last_theoretical_max(self): return self.theoretical_maxs.order_by("-date", "-pk").first() def __str__(self): return f"{self.name} ({self.room.name})" class Setting(models.Model): class Meta: verbose_name = "réglage" verbose_name_plural = "réglages" equipment = models.ForeignKey( verbose_name="machine", to=Equipment, on_delete=models.CASCADE, related_name="settings", ) name = models.CharField("nom", max_length=200) value = models.CharField("valeur", max_length=200) def __str__(self): return f"{self.name}={self.value}" class TheoreticalMax(models.Model): class Meta: verbose_name = "maximum théorique" verbose_name_plural = "maximums théoriques" equipment = models.ForeignKey( verbose_name="machine", to=Equipment, on_delete=models.CASCADE, related_name="theoretical_maxs", ) date = models.DateField("date") value = models.FloatField("valeur") def __str__(self): return f"{self.value} {self.equipment.unit.name} le {self.date:%d/%m/%Y}" class Session(models.Model): class Meta: verbose_name = "séance" verbose_name_plural = "séances" start = models.DateTimeField("date et heure de début") room = models.ForeignKey( verbose_name="salle", to=Room, on_delete=models.SET_NULL, related_name="sessions", null=True, ) default_theoretical_max_percentage = models.PositiveIntegerField( "pourcentage par défaut", default=65 ) notes = models.TextField("notes", blank=True) def __str__(self): import pytz server_timezone = pytz.timezone(settings.TIME_ZONE) server = server_timezone.normalize(self.start.astimezone(server_timezone)) return f"{self.room} {server:%d/%m/%Y %H:%M} ({settings.TIME_ZONE})" class Round(models.Model): class Meta: verbose_name = "série" verbose_name_plural = "séries" repetition_number = models.PositiveIntegerField("nombre de répétitions") equipment = models.ForeignKey( verbose_name="machine", to=Equipment, on_delete=models.CASCADE, related_name="rounds", ) theoretical_max_percentage = models.PositiveIntegerField("pourcentage") chosen_weight = models.FloatField("charge choisie") session = models.ForeignKey( verbose_name="séance", to=Session, on_delete=models.CASCADE, related_name="rounds", ) work_form = models.ForeignKey( verbose_name="forme de travail", to=WorkForm, on_delete=models.PROTECT, null=True, ) notes = models.TextField("notes", blank=True) @property def real_percentage(self): theoretical_max = ( self.equipment.theoretical_maxs.filter(date__lte=self.session.start) .order_by("-date") .first() ) return int(self.chosen_weight / theoretical_max.value * 1000) / 10