Исправлена продажа нескольких экземпляров витринного букета
Проблема: При попытке продажи 2+ экземпляров одного витринного букета возникала ошибка IntegrityError, так как поле sold_order_item было OneToOneField. Это означало что к одному OrderItem мог быть привязан только один ShowcaseItem, что делало невозможной продажу нескольких экземпляров в одной позиции заказа. Решение: 1. Изменен тип поля sold_order_item с OneToOneField на ForeignKey - Теперь несколько ShowcaseItem могут относиться к одному OrderItem - related_name изменен с 'sold_showcase_item' на 'sold_showcase_items' 2. Обновлен метод mark_sold в модели ShowcaseItem - Добавлена явная проверка статуса 'sold' перед продажей - Генерируется ValidationError если экземпляр уже продан - Удален комментарий про OneToOneField защиту 3. Обновлена обработка ошибок в ShowcaseManager.sell_showcase_items - Убрана обработка IntegrityError - Добавлена обработка ValidationError от mark_sold 4. Создана миграция 0012_change_sold_order_item_to_fk Теперь можно успешно продавать 2 и более экземпляров одного витринного букета в рамках одной позиции заказа.
This commit is contained in:
@@ -199,15 +199,13 @@ class ShowcaseManager:
|
||||
'message': f'Продано {sold_count} экз.'
|
||||
}
|
||||
|
||||
except IntegrityError as e:
|
||||
# Защита от двойной продажи сработала на уровне БД
|
||||
if 'sold_order_item' in str(e) or 'UNIQUE' in str(e):
|
||||
return {
|
||||
'success': False,
|
||||
'sold_count': 0,
|
||||
'message': 'Один из экземпляров уже был продан. Обновите список витринных букетов.'
|
||||
}
|
||||
raise
|
||||
except ValidationError as e:
|
||||
# Ошибка валидации (например, экземпляр уже продан)
|
||||
return {
|
||||
'success': False,
|
||||
'sold_count': 0,
|
||||
'message': str(e)
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def sell_from_showcase(product_kit, showcase, customer, payment_method='cash_to_courier',
|
||||
|
||||
Reference in New Issue
Block a user