From 37c203a78382eea06bb690393b74078704a94521 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Thu, 11 Dec 2025 22:18:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B8=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=D0=B6=D0=B8=20=D0=B2=D0=B8=D1=82=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BB=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D0=B2=20=D0=B2=20POS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: Продолжает возникать ошибка 'Один из экземпляров уже был продан' при попытке продажи витринных букетов. Изменения для диагностики: 1. Добавлена валидация showcase_item_ids ПЕРЕД передачей в sell_showcase_items 2. Проверка что все экземпляры имеют status='in_cart' и locked_by_user=текущий 3. Фильтр по статусу исключает уже проданные/разобранные экземпляры 4. Добавлено детальное логирование: - Запрошенные showcase_item_ids - Количество найденных заблокированных экземпляров - Недостающие IDs если не все найдены Улучшенное сообщение об ошибке: Вместо 'уже был продан' теперь 'уже не заблокированы на вас' с просьбой обновить страницу - более понятно для пользователя. Логи помогут выявить: - Передаются ли дубликаты в showcase_item_ids - Истекают ли блокировки до момента продажи - Меняется ли статус экземпляров между добавлением в корзину и checkout --- myproject/pos/views.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/myproject/pos/views.py b/myproject/pos/views.py index 3fe6649..4f4d254 100644 --- a/myproject/pos/views.py +++ b/myproject/pos/views.py @@ -1468,9 +1468,26 @@ def pos_checkout(request): # Продаём экземпляры через ShowcaseManager if showcase_item_ids: + # Логируем для отладки + logger.info(f'POS Checkout: попытка продать showcase_item_ids={showcase_item_ids}') + + # Проверяем что все экземпляры заблокированы на текущего пользователя showcase_items = list(ShowcaseItem.objects.filter( - id__in=showcase_item_ids + id__in=showcase_item_ids, + status='in_cart', + locked_by_user=request.user )) + + logger.info(f'POS Checkout: найдено {len(showcase_items)} заблокированных экземпляров из {len(showcase_item_ids)} запрошенных') + + if len(showcase_items) != len(showcase_item_ids): + # Не все экземпляры доступны + missing_ids = set(showcase_item_ids) - set(item.id for item in showcase_items) + logger.warning(f'POS Checkout: недоступные showcase_item_ids={missing_ids}') + raise ValidationError( + f'Некоторые экземпляры букета уже не заблокированы на вас. ' + f'Обновите страницу и попробуйте снова.' + ) if showcase_items: result = ShowcaseManager.sell_showcase_items(showcase_items, order_item)