Обновления и новые функции: изменение шаблона клиента, обновление сигналов инвентаря, добавление снимков наборов и элементов заказа, обновление моделей заказов и продуктов
This commit is contained in:
@@ -3,6 +3,7 @@ from django.core.exceptions import ValidationError
|
||||
from products.models import Product, ProductKit
|
||||
from simple_history.models import HistoricalRecords
|
||||
from .order import Order
|
||||
from .kit_snapshot import KitSnapshot
|
||||
|
||||
|
||||
class OrderItem(models.Model):
|
||||
@@ -36,6 +37,30 @@ class OrderItem(models.Model):
|
||||
verbose_name="Комплект товаров"
|
||||
)
|
||||
|
||||
# Снимок комплекта (для сохранения истории состава комплекта на момент заказа)
|
||||
kit_snapshot = models.ForeignKey(
|
||||
KitSnapshot,
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='order_items',
|
||||
verbose_name="Снимок комплекта",
|
||||
help_text="Хранит состав комплекта на момент оформления заказа"
|
||||
)
|
||||
|
||||
# Снапшот названия и артикула (для Product и Kit)
|
||||
item_name_snapshot = models.CharField(
|
||||
max_length=200,
|
||||
default='',
|
||||
verbose_name="Название на момент заказа"
|
||||
)
|
||||
|
||||
item_sku_snapshot = models.CharField(
|
||||
max_length=100,
|
||||
blank=True,
|
||||
verbose_name="Артикул на момент заказа"
|
||||
)
|
||||
|
||||
quantity = models.PositiveIntegerField(
|
||||
default=1,
|
||||
verbose_name="Количество"
|
||||
@@ -92,12 +117,7 @@ class OrderItem(models.Model):
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
item_name = ""
|
||||
if self.product:
|
||||
item_name = self.product.name
|
||||
elif self.product_kit:
|
||||
item_name = self.product_kit.name
|
||||
return f"{item_name} x{self.quantity} в заказе #{self.order.order_number}"
|
||||
return f"{self.item_name_snapshot} x{self.quantity} в заказе #{self.order.order_number}"
|
||||
|
||||
def clean(self):
|
||||
"""Валидация модели"""
|
||||
@@ -116,12 +136,34 @@ class OrderItem(models.Model):
|
||||
)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
is_new = not self.pk
|
||||
|
||||
# Определяем, изменился ли комплект (для существующих записей)
|
||||
kit_changed = False
|
||||
if self.pk and self.product_kit:
|
||||
old = OrderItem.objects.filter(pk=self.pk).values('product_kit_id').first()
|
||||
if old and old['product_kit_id'] != self.product_kit_id:
|
||||
kit_changed = True
|
||||
|
||||
# Создаем snapshot для комплекта (новый или при замене)
|
||||
if self.product_kit and (is_new or kit_changed):
|
||||
self.kit_snapshot = self.product_kit.create_snapshot()
|
||||
|
||||
# Сохраняем название и артикул
|
||||
if self.product:
|
||||
self.item_name_snapshot = self.product.name
|
||||
self.item_sku_snapshot = self.product.sku or ''
|
||||
elif self.kit_snapshot:
|
||||
self.item_name_snapshot = self.kit_snapshot.name
|
||||
self.item_sku_snapshot = self.kit_snapshot.sku or ''
|
||||
|
||||
# Автоматически фиксируем цену при создании, если она не указана
|
||||
if not self.price:
|
||||
if self.product:
|
||||
self.price = self.product.price
|
||||
elif self.product_kit:
|
||||
self.price = self.product_kit.price
|
||||
self.price = self.product.actual_price
|
||||
elif self.kit_snapshot:
|
||||
self.price = self.kit_snapshot.actual_price
|
||||
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
def get_total_price(self):
|
||||
@@ -130,21 +172,15 @@ class OrderItem(models.Model):
|
||||
|
||||
@property
|
||||
def item_name(self):
|
||||
"""Название товара/комплекта"""
|
||||
if self.product:
|
||||
return self.product.name
|
||||
elif self.product_kit:
|
||||
return self.product_kit.name
|
||||
return "Не указано"
|
||||
"""Название из snapshot"""
|
||||
return self.item_name_snapshot
|
||||
|
||||
@property
|
||||
def original_price(self):
|
||||
"""Оригинальная цена товара/комплекта из каталога"""
|
||||
if self.product:
|
||||
return self.product.actual_price
|
||||
elif self.product_kit:
|
||||
return self.product_kit.actual_price
|
||||
return None
|
||||
"""Оригинальная цена из snapshot"""
|
||||
if self.kit_snapshot:
|
||||
return self.kit_snapshot.actual_price
|
||||
return self.price
|
||||
|
||||
@property
|
||||
def price_difference(self):
|
||||
|
||||
Reference in New Issue
Block a user