diff --git a/myproject/orders/models/delivery.py b/myproject/orders/models/delivery.py
index 8aa0d55..35f3af9 100644
--- a/myproject/orders/models/delivery.py
+++ b/myproject/orders/models/delivery.py
@@ -132,35 +132,10 @@ class Delivery(models.Model):
})
return
- # Для не-черновиков полная валидация
-
- # Проверка: дата доставки обязательна
- if not self.delivery_date:
- raise ValidationError({
- 'delivery_date': 'Для не-черновиков дата доставки обязательна'
- })
-
- # Проверка: для курьерской доставки должен быть адрес
- if self.delivery_type == self.DELIVERY_TYPE_COURIER:
- if not self.address:
- raise ValidationError({
- 'address': 'Для курьерской доставки необходимо указать адрес'
- })
- if self.pickup_warehouse:
- raise ValidationError({
- 'pickup_warehouse': 'Для курьерской доставки склад не указывается'
- })
-
- # Проверка: для самовывоза должен быть склад
- if self.delivery_type == self.DELIVERY_TYPE_PICKUP:
- if not self.pickup_warehouse:
- raise ValidationError({
- 'pickup_warehouse': 'Для самовывоза необходимо указать склад'
- })
- if self.address:
- raise ValidationError({
- 'address': 'Для самовывоза адрес не указывается'
- })
+ # Для не-черновиков ранее действовала строгая валидация даты и адреса.
+ # В рамках новой логики разрешаем сохранять заказы в любом статусе без адреса
+ # и без обязательной даты доставки. Сохраняем только базовые проверки
+ # непротиворечивости данных.
# Проверка: время "до" не может быть раньше времени "от" (равные времена разрешены для POS)
if self.time_from and self.time_to and self.time_from > self.time_to:
diff --git a/myproject/orders/templates/orders/order_form.html b/myproject/orders/templates/orders/order_form.html
index 01509e0..22185b0 100644
--- a/myproject/orders/templates/orders/order_form.html
+++ b/myproject/orders/templates/orders/order_form.html
@@ -581,7 +581,7 @@
{{ form.address_building_number }}
{% if form.address_building_number.errors %}
diff --git a/myproject/orders/views.py b/myproject/orders/views.py
index 729e0ea..a469cef 100644
--- a/myproject/orders/views.py
+++ b/myproject/orders/views.py
@@ -232,7 +232,8 @@ def order_create(request):
address.save()
# Создаем или обновляем Delivery
- # Для черновиков создаем Delivery без обязательных проверок, чтобы сохранить адрес
+ # Ранее для не-черновиков адрес курьерской доставки был обязателен.
+ # Теперь разрешаем сохранять заказ в любом статусе без адреса.
if is_draft:
# Для черновиков создаем Delivery, если есть хотя бы адрес или данные доставки
if address or delivery_type or pickup_warehouse or delivery_date:
@@ -249,34 +250,23 @@ def order_create(request):
}
)
else:
- # Для не-черновиков проверяем обязательные поля
- if not delivery_type or not delivery_date:
- raise ValidationError('Необходимо указать способ доставки и дату доставки')
-
- if delivery_type == Delivery.DELIVERY_TYPE_COURIER:
- # Для курьерской доставки нужен адрес
- if not address:
- raise ValidationError('Для курьерской доставки необходимо указать адрес')
- elif delivery_type == Delivery.DELIVERY_TYPE_PICKUP:
- # Для самовывоза нужен склад
- if not pickup_warehouse:
- raise ValidationError('Для самовывоза необходимо выбрать склад')
-
- # Создаем Delivery
- delivery = Delivery.objects.create(
- order=order,
- delivery_type=delivery_type,
- delivery_date=delivery_date,
- time_from=time_from,
- time_to=time_to,
- address=address,
- pickup_warehouse=pickup_warehouse,
- cost=delivery_cost if delivery_cost else Decimal('0')
- )
-
- # Пересчитываем стоимость доставки если она не установлена вручную
- if not delivery.cost or delivery.cost <= 0:
- order.reset_delivery_cost()
+ # Для не-черновиков больше не требуем обязательного адреса.
+ # Если пользователь вообще не указал тип доставки и дату, просто не создаём Delivery.
+ if address or delivery_type or pickup_warehouse or delivery_date:
+ delivery = Delivery.objects.create(
+ order=order,
+ delivery_type=delivery_type or Delivery.DELIVERY_TYPE_COURIER,
+ delivery_date=delivery_date,
+ time_from=time_from,
+ time_to=time_to,
+ address=address,
+ pickup_warehouse=pickup_warehouse,
+ cost=delivery_cost if delivery_cost else Decimal('0')
+ )
+
+ # Пересчитываем стоимость доставки если она не установлена вручную
+ if not delivery.cost or delivery.cost <= 0:
+ order.reset_delivery_cost()
# Пересчитываем итоговую стоимость
order.calculate_total()
@@ -465,7 +455,8 @@ def order_update(request, order_number):
address.save()
# Создаем или обновляем Delivery
- # Для черновиков создаем Delivery без обязательных проверок, чтобы сохранить адрес
+ # Ранее для не-черновиков адрес курьерской доставки был обязателен.
+ # Теперь разрешаем сохранять заказ в любом статусе без адреса.
if is_draft:
# Для черновиков создаем Delivery, если есть хотя бы адрес или данные доставки
if address or delivery_type or pickup_warehouse or delivery_date:
@@ -481,39 +472,29 @@ def order_update(request, order_number):
'cost': delivery_cost if delivery_cost else Decimal('0')
}
)
-
-
elif hasattr(order, 'delivery'):
+ # Если все данные доставки очищены, удаляем существующую Delivery
order.delivery.delete()
else:
- # Для не-черновиков проверяем обязательные поля
- if not delivery_type or not delivery_date:
- raise ValidationError('Необходимо указать способ доставки и дату доставки')
-
- if delivery_type == Delivery.DELIVERY_TYPE_COURIER:
- # Для курьерской доставки нужен адрес
- if not address:
- raise ValidationError('Для курьерской доставки необходимо указать адрес')
- elif delivery_type == Delivery.DELIVERY_TYPE_PICKUP:
- # Для самовывоза нужен склад
- if not pickup_warehouse:
- raise ValidationError('Для самовывоза необходимо выбрать склад')
-
- # Создаем или обновляем Delivery
- delivery, created = Delivery.objects.update_or_create(
- order=order,
- defaults={
- 'delivery_type': delivery_type,
- 'delivery_date': delivery_date,
- 'time_from': time_from,
- 'time_to': time_to,
- 'address': address,
- 'pickup_warehouse': pickup_warehouse,
- 'cost': delivery_cost if delivery_cost else Decimal('0')
- }
- )
-
-
+ # Для не-черновиков больше не требуем обязательного адреса.
+ # Если пользователь вообще не указал данные доставки, удаляем Delivery (если она была).
+ if not (address or delivery_type or pickup_warehouse or delivery_date):
+ if hasattr(order, 'delivery'):
+ order.delivery.delete()
+ else:
+ # Создаем или обновляем Delivery с теми данными, что есть.
+ delivery, created = Delivery.objects.update_or_create(
+ order=order,
+ defaults={
+ 'delivery_type': delivery_type or Delivery.DELIVERY_TYPE_COURIER,
+ 'delivery_date': delivery_date,
+ 'time_from': time_from,
+ 'time_to': time_to,
+ 'address': address,
+ 'pickup_warehouse': pickup_warehouse,
+ 'cost': delivery_cost if delivery_cost else Decimal('0')
+ }
+ )
# Пересчитываем итоговую стоимость
order.calculate_total()
order.update_payment_status()