from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils import timezone from la_chariotte.settings import AUTH_USER_MODEL class GroupedOrder(models.Model): name = models.CharField( max_length=100, null=True, verbose_name="Titre de la commande" ) orga = models.ForeignKey( AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Organisateur·ice" ) delivery_date = models.DateField("Date de livraison") deadline = models.DateTimeField("Date limite de commande") place = models.CharField( max_length=100, null=True, blank=True, verbose_name="Lieu de livraison" ) description = models.TextField("Description", null=True, blank=True) class Meta: unique_together = ["delivery_date", "name", "orga"] def is_ongoing(self): """Returns True if the grouped order is open for new Orders - False if it's too late""" return self.deadline >= timezone.now() def is_to_be_delivered(self): """Returns True if the grouped order has not been delivered yet - False if it's old""" return self.delivery_date >= timezone.now().date() def get_absolute_url(self): return reverse("order:manage_items", kwargs={"pk": self.pk}) def clean_fields(self, exclude=None): super().clean_fields(exclude=exclude) if self.delivery_date < timezone.now().date(): raise ValidationError("La date de livraison ne doit pas être dans le passé") if self.delivery_date < self.deadline.date(): raise ValidationError( "La date limite de commande doit être avant la date de livraison" ) def validate_unique(self, exclude=None): super(GroupedOrder, self).validate_unique(exclude=exclude) def __str__(self): # pragma: no cover return ( self.name if self.name else f"Commande groupée {self.pk} du {self.date} organisée par {self.orga}" ) class OrderAuthor(models.Model): """Created when a user orders without having an account - or when a user creates an account""" # TODO faire le lien avec CustomUser (CustomUser hérite de OrderAuthor), pour ensuite préremplir quand on est connecté·e first_name = models.CharField(verbose_name="Prénom") last_name = models.CharField(verbose_name="Nom") phone = models.CharField( verbose_name="Numéro de téléphone", help_text="Pour vous que l'organisateur·ice vous contacte en cas de besoin", ) email = models.CharField( verbose_name="Pour vous que l'organisateur·ice vous contacte en cas de besoin" ) def __str__(self): # pragma: no cover return f"{self.first_name} {self.last_name}" class Order(models.Model): grouped_order = models.ForeignKey( GroupedOrder, on_delete=models.CASCADE, related_name="order_set" ) author = models.ForeignKey(OrderAuthor, on_delete=models.CASCADE) articles_nb = models.PositiveIntegerField(default=0) price = models.DecimalField(max_digits=10, decimal_places=2, default=0) def __str__(self): # pragma: no cover return f"Commande de {self.author} pour la commande groupée {self.grouped_order.pk}" class Item(models.Model): name = models.CharField(max_length=100) grouped_order = models.ForeignKey( GroupedOrder, on_delete=models.CASCADE ) # à transformer en manytomany quand il y aura un catalogue price = models.DecimalField(max_digits=10, decimal_places=2) max_limit = models.PositiveSmallIntegerField(null=True, blank=True) ordered_nb = models.IntegerField(default=0) def get_absolute_url(self): return reverse("order:manage_items", kwargs={"pk": self.grouped_order.pk}) def __str__(self): # pragma: no cover return f"{self.name} ({self.price} €)" class OrderedItem(models.Model): """Item in one specific Order, and the number of articles""" nb = models.PositiveSmallIntegerField(default=0) # works up to 32767 order = models.ForeignKey( Order, on_delete=models.CASCADE, related_name="ordered_items" ) item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name="orders") def get_price(self): return self.nb * self.item.price def __str__(self): # pragma: no cover return f"{self.nb} {self.item}, dans la commande {self.order.pk}"