This commit is contained in:
A'zamov Samandar
2025-12-06 21:50:28 +05:00
parent 3aa20fdaa1
commit f5766aa319
140 changed files with 2376 additions and 1582 deletions

View File

@@ -1 +1 @@
from .order import * # noqa
from .order import *

View File

@@ -4,33 +4,82 @@ from django.utils.translation import gettext_lazy as _
from django.contrib.auth import get_user_model
from core.apps.api.choices import OrderStatus
from core.apps.accounts.models import Address
from core.apps.api.models import AdModel
class Order(AbstractBaseModel):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, verbose_name=_("User"))
status = models.CharField(max_length=255, choices=OrderStatus)
address = models.ForeignKey(Address, on_delete=models.CASCADE, verbose_name=_("Address"))
class OrderModel(AbstractBaseModel):
user = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE,
verbose_name=_("User"),
related_name="orders"
)
status = models.CharField(
_("Status"),
max_length=255,
choices=OrderStatus,
db_index=True
)
address = models.ForeignKey(
Address,
on_delete=models.PROTECT,
verbose_name=_("Address")
)
total_amount = models.DecimalField(
_("Total Amount"),
max_digits=10,
decimal_places=2,
default=0
)
def __str__(self):
return str(self.pk)
return f"Order #{self.pk} - {self.user.username}"
def calculate_total(self):
"""Calculate total from order items"""
total = sum(item.subtotal for item in self.items.all())
self.total_amount = total
return total
class Meta:
db_table = "order"
verbose_name = _("Order")
verbose_name_plural = _("Orders")
ordering = ["-created_at"]
indexes = [
models.Index(fields=["user", "-created_at"]),
models.Index(fields=["status"]),
]
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE, verbose_name=_("Order"))
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name=_("Price"))
ad = models.ForeignKey(AdModel, on_delete=models.CASCADE, verbose_name=_("Ad"))
count = models.PositiveIntegerField(default=0, verbose_name=_("Count"))
class OrderItemModel(AbstractBaseModel):
order = models.ForeignKey(
OrderModel,
on_delete=models.CASCADE,
verbose_name=_("Order"),
related_name="items"
)
ad = models.ForeignKey(
"api.AdModel",
on_delete=models.PROTECT,
verbose_name=_("Ad")
)
price = models.DecimalField(
_("Price"),
max_digits=10,
decimal_places=2
)
quantity = models.PositiveIntegerField(_("Quantity"), default=1)
def __str__(self):
return str(self.pk)
return f"{self.ad.name} x {self.quantity}"
@property
def subtotal(self):
"""Calculate item subtotal"""
return self.price * self.quantity
class Meta:
db_table = "order_item"
verbose_name = _("Order Item")
verbose_name_plural = _("Order Items")
unique_together = [["order", "ad"]]