la-chariotte/la_chariotte/order/models.py
2023-05-24 13:58:34 +02:00

114 lines
4.2 KiB
Python

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)
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 __str__(self): # pragma: no cover
return f"{self.nb} {self.item}, dans la commande {self.order.pk}"