Добавлена поддержка флага is_from_showcase в форму заказа

- orders/forms.py: добавлено поле is_from_showcase в OrderItemForm
  * HiddenInput widget
  * Устанавливается через JavaScript для showcase_kit
- orders/templates/orders/order_form.html: JavaScript логика
  * Автоматическое определение showcase_kit при загрузке черновика
  * Установка is_from_showcase=true для витринных комплектов
  * Консольное логирование для отладки
- Флаг используется backend для вызова reserve_for_order()
This commit is contained in:
2026-01-05 01:38:44 +03:00
parent dd37931f5e
commit d148df2149
2 changed files with 22 additions and 2 deletions

View File

@@ -456,7 +456,7 @@ class OrderItemForm(forms.ModelForm):
class Meta: class Meta:
model = OrderItem model = OrderItem
fields = ['product', 'product_kit', 'sales_unit', 'quantity', 'price', 'is_custom_price'] fields = ['product', 'product_kit', 'sales_unit', 'quantity', 'price', 'is_custom_price', 'is_from_showcase']
# ВАЖНО: НЕ включаем 'id' в fields - это предотвращает ошибку валидации # ВАЖНО: НЕ включаем 'id' в fields - это предотвращает ошибку валидации
widgets = { widgets = {
'quantity': forms.NumberInput(attrs={'min': 1, 'value': 1}), 'quantity': forms.NumberInput(attrs={'min': 1, 'value': 1}),
@@ -465,6 +465,7 @@ class OrderItemForm(forms.ModelForm):
'product_kit': forms.HiddenInput(), 'product_kit': forms.HiddenInput(),
'sales_unit': forms.HiddenInput(), # Управляется через JS 'sales_unit': forms.HiddenInput(), # Управляется через JS
'is_custom_price': forms.HiddenInput(), 'is_custom_price': forms.HiddenInput(),
'is_from_showcase': forms.HiddenInput(), # Устанавливается через JS для showcase_kit
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -491,6 +492,9 @@ class OrderItemForm(forms.ModelForm):
# Поле is_custom_price устанавливается через JS # Поле is_custom_price устанавливается через JS
self.fields['is_custom_price'].required = False self.fields['is_custom_price'].required = False
# Поле is_from_showcase устанавливается через JS для showcase_kit
self.fields['is_from_showcase'].required = False
def clean_price(self): def clean_price(self):
"""Парсим цену с запятой или точкой и округляем до 2 знаков""" """Парсим цену с запятой или точкой и округляем до 2 знаков"""

View File

@@ -2088,6 +2088,7 @@ document.addEventListener('DOMContentLoaded', function() {
const salesUnitField = document.querySelector(`[name="items-${index}-sales_unit"]`); const salesUnitField = document.querySelector(`[name="items-${index}-sales_unit"]`);
const quantityField = document.querySelector(`[name="items-${index}-quantity"]`); const quantityField = document.querySelector(`[name="items-${index}-quantity"]`);
const priceField = document.querySelector(`[name="items-${index}-price"]`); const priceField = document.querySelector(`[name="items-${index}-price"]`);
const isFromShowcaseField = document.querySelector(`[name="items-${index}-is_from_showcase"]`);
if (!productField || !kitField) { if (!productField || !kitField) {
console.warn(`[Draft Items] ⚠️ Форма ${index} не найдена`); console.warn(`[Draft Items] ⚠️ Форма ${index} не найдена`);
@@ -2098,11 +2099,15 @@ document.addEventListener('DOMContentLoaded', function() {
console.log(` - productField:`, productField); console.log(` - productField:`, productField);
console.log(` - kitField:`, kitField); console.log(` - kitField:`, kitField);
console.log(` - salesUnitField:`, salesUnitField); console.log(` - salesUnitField:`, salesUnitField);
console.log(` - isFromShowcaseField:`, isFromShowcaseField);
// Устанавливаем значения // Устанавливаем значения
if (item.type === 'product') { if (item.type === 'product') {
productField.value = item.id; productField.value = item.id;
kitField.value = ''; kitField.value = '';
if (isFromShowcaseField) {
isFromShowcaseField.value = 'false';
}
console.log(`[Draft Items] ✅ Установлен product ID: ${item.id}`); console.log(`[Draft Items] ✅ Установлен product ID: ${item.id}`);
// Устанавливаем sales_unit если есть // Устанавливаем sales_unit если есть
@@ -2118,7 +2123,18 @@ document.addEventListener('DOMContentLoaded', function() {
if (salesUnitField) { if (salesUnitField) {
salesUnitField.value = ''; salesUnitField.value = '';
} }
console.log(`[Draft Items] ✅ Установлен kit ID: ${item.id}`);
// КРИТИЧНО: Для showcase_kit устанавливаем is_from_showcase=true
if (isFromShowcaseField) {
if (item.type === 'showcase_kit') {
isFromShowcaseField.value = 'true';
console.log(`[Draft Items] 🌺 Установлен флаг is_from_showcase=true для витринного комплекта`);
} else {
isFromShowcaseField.value = 'false';
}
}
console.log(`[Draft Items] ✅ Установлен kit ID: ${item.id} (type: ${item.type})`);
} }
// Устанавливаем количество и цену // Устанавливаем количество и цену