From 5f1c982bf76a6cfbd82d086cb0637caf33c1dda9 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Mon, 8 Dec 2025 18:22:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE:=20=D1=81=D0=BD=D1=8F=D1=82=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D0=B7=D0=B8=D0=BD=D1=8B=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=20=D0=BE=D1=82=D0=BC=D0=B5=D0=BD=D0=B5=20=D0=B7=D0=B0=D0=BA?= =?UTF-8?q?=D0=B0=D0=B7=D0=B0=20=D1=81=20=D0=B2=D0=B8=D1=82=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=BC=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BB=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myproject/inventory/signals.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/myproject/inventory/signals.py b/myproject/inventory/signals.py index 678bdaf..a92d1a0 100644 --- a/myproject/inventory/signals.py +++ b/myproject/inventory/signals.py @@ -456,13 +456,18 @@ def rollback_sale_on_status_change(sender, instance, created, **kwargs): if showcase_count > 0: for reservation in showcase_kit_reservations: reservation.status = 'reserved' + # Очищаем блокировки корзины при отмене заказа + reservation.order_item = None + reservation.cart_lock_expires_at = None + reservation.locked_by_user = None + reservation.cart_session_id = None # Не трогаем showcase и product_kit - они остаются привязанными # converted_at оставляем (для истории) - reservation.save(update_fields=['status']) + reservation.save(update_fields=['status', 'order_item', 'cart_lock_expires_at', 'locked_by_user', 'cart_session_id']) logger.info( f"✓ Обновлено {showcase_count} резервов витринных комплектов: " - f"converted_to_sale → reserved (возвращены на витрину)" + f"converted_to_sale → reserved (возвращены на витрину, блокировки сняты)" ) else: logger.warning( @@ -588,8 +593,16 @@ def release_reservations_on_cancellation(sender, instance, created, **kwargs): ) if showcase_count > 0: + # Для витринных комплектов очищаем блокировки корзины + for reservation in showcase_kit_reservations: + reservation.order_item = None + reservation.cart_lock_expires_at = None + reservation.locked_by_user = None + reservation.cart_session_id = None + reservation.save(update_fields=['order_item', 'cart_lock_expires_at', 'locked_by_user', 'cart_session_id']) + logger.info( - f"ℹ️ Найдено {showcase_count} резервов витринных комплектов - остаются в reserved (на витрине)" + f"ℹ️ Найдено {showcase_count} резервов витринных комплектов - остаются в reserved (на витрине, блокировки сняты)" ) if normal_count == 0 and showcase_count == 0: @@ -728,10 +741,13 @@ def release_stock_on_order_delete(sender, instance, **kwargs): res.released_at = timezone.now() res.save() - # Витринные комплекты остаются зарезервированными, но отвязываем их от заказа + # Витринные комплекты остаются зарезервированными, но отвязываем их от заказа и снимаем блокировки for res in showcase_reservations: res.order_item = None - res.save(update_fields=['order_item']) + res.cart_lock_expires_at = None + res.locked_by_user = None + res.cart_session_id = None + res.save(update_fields=['order_item', 'cart_lock_expires_at', 'locked_by_user', 'cart_session_id']) transaction.on_commit(release_reservations)