Рефакторинг блока доставки: объединение с датой/временем, упрощение структуры адреса, вынос получателя, авто-выбор склада по умолчанию

This commit is contained in:
2025-12-24 22:51:14 +03:00
parent 61ce3f550d
commit 98470c83af
2 changed files with 522 additions and 294 deletions

View File

@@ -282,8 +282,23 @@ class OrderForm(forms.ModelForm):
self.fields['recipient_from_history'].queryset = Recipient.objects.none()
# Инициализируем queryset для pickup_warehouse
# Фильтруем только активные склады, доступные для самовывоза
# Сортируем: сначала склад по умолчанию, потом по названию
from inventory.models import Warehouse
self.fields['pickup_warehouse'].queryset = Warehouse.objects.filter(is_active=True).order_by('name')
self.fields['pickup_warehouse'].queryset = Warehouse.objects.filter(
is_active=True,
is_pickup_point=True
).order_by('-is_default', 'name')
# Если это новый заказ и еще не выбран склад, выбираем склад по умолчанию
if not self.instance.pk:
default_warehouse = Warehouse.objects.filter(
is_active=True,
is_pickup_point=True,
is_default=True
).first()
if default_warehouse:
self.fields['pickup_warehouse'].initial = default_warehouse
# Инициализируем поля доставки из существующей Delivery
if self.instance.pk and hasattr(self.instance, 'delivery'):
@@ -294,6 +309,51 @@ class OrderForm(forms.ModelForm):
self.fields['time_to'].initial = delivery.time_to
self.fields['pickup_warehouse'].initial = delivery.pickup_warehouse
self.fields['delivery_cost'].initial = delivery.cost
# Если выбран самовывоз, но склад не указан - выбираем склад по умолчанию
if delivery.delivery_type == Delivery.DELIVERY_TYPE_PICKUP and not delivery.pickup_warehouse:
default_warehouse = Warehouse.objects.filter(
is_active=True,
is_pickup_point=True,
is_default=True
).first()
if default_warehouse:
self.fields['pickup_warehouse'].initial = default_warehouse
# Инициализируем поля адреса, если есть адрес доставки
if delivery.address:
# Проверяем, есть ли этот адрес в истории клиента
if self.instance.customer:
customer_addresses = Address.objects.filter(
deliveries__order__customer=self.instance.customer
).distinct()
if delivery.address in customer_addresses:
# Адрес есть в истории - используем режим "история"
self.fields['address_mode'].initial = 'history'
self.fields['address_from_history'].queryset = customer_addresses
self.fields['address_from_history'].initial = delivery.address.pk
else:
# Адреса нет в истории - используем режим "новый" и заполняем поля
self.fields['address_mode'].initial = 'new'
self.fields['address_street'].initial = delivery.address.street
self.fields['address_building_number'].initial = delivery.address.building_number
self.fields['address_apartment_number'].initial = delivery.address.apartment_number
self.fields['address_entrance'].initial = delivery.address.entrance
self.fields['address_floor'].initial = delivery.address.floor
self.fields['address_intercom_code'].initial = delivery.address.intercom_code
self.fields['address_delivery_instructions'].initial = delivery.address.delivery_instructions
self.fields['address_confirm_with_recipient'].initial = delivery.address.confirm_address_with_recipient
else:
# Нет клиента - просто заполняем поля
self.fields['address_mode'].initial = 'new'
self.fields['address_street'].initial = delivery.address.street
self.fields['address_building_number'].initial = delivery.address.building_number
self.fields['address_apartment_number'].initial = delivery.address.apartment_number
self.fields['address_entrance'].initial = delivery.address.entrance
self.fields['address_floor'].initial = delivery.address.floor
self.fields['address_intercom_code'].initial = delivery.address.intercom_code
self.fields['address_delivery_instructions'].initial = delivery.address.delivery_instructions
self.fields['address_confirm_with_recipient'].initial = delivery.address.confirm_address_with_recipient
def clean(self):
"""Валидация формы заказа, включая обязательные поля доставки"""