init
This commit is contained in:
113
backend/commerce/models.py
Normal file
113
backend/commerce/models.py
Normal file
@@ -0,0 +1,113 @@
|
||||
import uuid
|
||||
|
||||
from django.db import models
|
||||
from django.conf import settings
|
||||
from django.core.validators import MinValueValidator
|
||||
from django.core.exceptions import ValidationError
|
||||
|
||||
from trznice.models import SoftDeleteModel
|
||||
from booking.models import Reservation
|
||||
from account.models import CustomUser
|
||||
|
||||
class Order(SoftDeleteModel):
|
||||
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="orders", null=False, blank=False)
|
||||
reservation = models.OneToOneField(Reservation, on_delete=models.CASCADE, related_name="order", null=False, blank=False)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
STATUS_CHOICES = [
|
||||
("payed", "Zaplaceno"),
|
||||
("pending", "Čeká na zaplacení"),
|
||||
("cancelled", "Stornovano"),
|
||||
]
|
||||
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default="pending")
|
||||
|
||||
note = models.TextField(blank=True, null=True)
|
||||
|
||||
price_to_pay = models.DecimalField(blank=True,
|
||||
default=0,
|
||||
max_digits=8,
|
||||
decimal_places=2,
|
||||
validators=[MinValueValidator(0)],
|
||||
help_text="Cena k zaplacení. Počítá se automaticky z Rezervace.",
|
||||
)
|
||||
|
||||
payed_at = models.DateTimeField(null=True, blank=True)
|
||||
|
||||
|
||||
def __str__(self):
|
||||
return f"Objednávka {self.id} od uživatele {self.user}"
|
||||
|
||||
def clean(self):
|
||||
|
||||
if not self.user_id:
|
||||
raise ValidationError("Zadejte ID Uživatele.")
|
||||
|
||||
if not self.reservation_id:
|
||||
raise ValidationError("Zadejte ID Rezervace.")
|
||||
|
||||
# Safely get product and event objects for error messages and validation
|
||||
try:
|
||||
reservation_obj = Reservation.objects.get(pk=self.reservation_id)
|
||||
except Reservation.DoesNotExist:
|
||||
raise ValidationError("Neplatné ID Rezervace.")
|
||||
|
||||
"""try:
|
||||
user_obj = CustomUser.objects.get(pk=self.user_id)
|
||||
if reservation_obj.user != user_obj:
|
||||
raise ValidationError("Tato rezervace naleží jinému Uživatelovi.")
|
||||
except CustomUser.DoesNotExist:
|
||||
raise ValidationError("Neplatné ID Uživatele.")"""
|
||||
|
||||
# Overlapping sales window check
|
||||
overlapping = Order.objects.exclude(id=self.id).filter(
|
||||
reservation_id=self.reservation_id,
|
||||
)
|
||||
if overlapping.exists():
|
||||
raise ValidationError("Tato Rezervace už je zaplacena.")
|
||||
|
||||
errors = {}
|
||||
|
||||
# If order is marked as payed, it must have a payed_at timestamp
|
||||
if self.status == "payed" and not self.payed_at:
|
||||
errors["payed_at"] = "Musíte zadat datum a čas zaplacení, pokud je objednávka zaplacena."
|
||||
|
||||
# If order is not payed, payed_at must be null
|
||||
if self.status != "payed" and self.payed_at:
|
||||
errors["payed_at"] = "Datum zaplacení může být uvedeno pouze u zaplacených objednávek."
|
||||
|
||||
if self.reservation.final_price:
|
||||
self.price_to_pay = self.reservation.final_price
|
||||
else:
|
||||
errors["price_to_pay"] = "Chyba v Rezervaci, neplatná cena."
|
||||
|
||||
# Price must be greater than zero
|
||||
if self.price_to_pay:
|
||||
if self.price_to_pay < 0:
|
||||
errors["price_to_pay"] = "Cena musí být větší než 0."
|
||||
# if self.price_to_pay == 0 and self.reservation:
|
||||
else:
|
||||
errors["price_to_pay"] = "Nemůže být prázdné."
|
||||
|
||||
if errors:
|
||||
raise ValidationError(errors)
|
||||
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.full_clean()
|
||||
|
||||
if self.status == "cancelled":
|
||||
self.reservation.status = "cancelled"
|
||||
else:
|
||||
self.reservation.status = "reserved"
|
||||
self.reservation.save()
|
||||
|
||||
# if self.reservation:
|
||||
# self.price_to_pay = self.reservation.final_price
|
||||
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
self.reservation.status = "cancelled"
|
||||
self.reservation.save()
|
||||
|
||||
return super().delete(*args, **kwargs)
|
||||
Reference in New Issue
Block a user