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_street }} {% if form.address_street.errors %} @@ -590,7 +590,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()