Fix media file storage path and permissions
- Fix MEDIA_ROOT path to match Docker volume mount (/app/myproject/media) - Update docker-compose.yml volume mounts to match MEDIA_ROOT - Add setup_directories() function in entrypoint.sh to create media directories with proper permissions - Add logging to TenantAwareFileSystemStorage for debugging - Fix is_returned flag logic improvements (from previous work)
This commit is contained in:
@@ -35,15 +35,14 @@ def update_is_returned_flag(order):
|
||||
"""
|
||||
has_sale_now = Sale.objects.filter(order=order).exists()
|
||||
|
||||
# Проверяем историю: был ли когда-либо в положительном финальном статусе
|
||||
was_completed_ever = order.history.filter(
|
||||
status__is_positive_end=True
|
||||
).exists()
|
||||
|
||||
if has_sale_now:
|
||||
# Есть актуальные продажи → заказ не возвращён
|
||||
new_flag = False
|
||||
else:
|
||||
# Проверяем историю только если нет Sale (оптимизация производительности)
|
||||
was_completed_ever = order.history.filter(
|
||||
status__is_positive_end=True
|
||||
).exists()
|
||||
# Продаж нет → возвращён только если был когда-то completed
|
||||
new_flag = was_completed_ever
|
||||
|
||||
@@ -170,9 +169,10 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs):
|
||||
# Если заказ был возвращён (is_returned=True) и резервов нет, можно использовать
|
||||
# только статусы отрицательного исхода (отменён и т.п.)
|
||||
if instance.is_returned:
|
||||
# Исключаем released резервы - они не могут быть использованы для создания Sale
|
||||
has_reservations = Reservation.objects.filter(
|
||||
order_item__order=instance
|
||||
).exists()
|
||||
).exclude(status='released').exists()
|
||||
|
||||
if not has_reservations:
|
||||
# Резервов нет — разрешены только отрицательные статусы
|
||||
@@ -206,10 +206,22 @@ def create_sale_on_order_completion(sender, instance, created, **kwargs):
|
||||
).exclude(status='converted_to_sale')
|
||||
|
||||
if not reservations_to_update.exists():
|
||||
logger.warning(
|
||||
f"⚠ Заказ {instance.order_number} переведён в '{instance.status.name}', "
|
||||
f"но нет резервов для обновления (все уже converted_to_sale или отсутствуют)"
|
||||
)
|
||||
# Проверяем, есть ли вообще резервы (включая released)
|
||||
has_any_reservations = Reservation.objects.filter(
|
||||
order_item__order=instance
|
||||
).exists()
|
||||
|
||||
if has_any_reservations:
|
||||
logger.warning(
|
||||
f"⚠ Заказ {instance.order_number}: все резервы в статусе 'converted_to_sale' "
|
||||
f"или 'released'. Sale уже созданы или резервы освобождены."
|
||||
)
|
||||
else:
|
||||
logger.error(
|
||||
f"❌ Заказ {instance.order_number}: нет резервов для создания Sale. "
|
||||
f"Заказ в статусе '{instance.status.name}' без возможности списания."
|
||||
)
|
||||
|
||||
# Обновляем флаг is_returned и выходим
|
||||
update_is_returned_flag(instance)
|
||||
return
|
||||
@@ -1208,6 +1220,20 @@ def process_sale_fifo(sender, instance, created, **kwargs):
|
||||
logger.error(f"Ошибка при обработке Sale {instance.id}: {str(e)}")
|
||||
|
||||
|
||||
@receiver(pre_delete, sender=Sale)
|
||||
def update_order_on_sale_delete(sender, instance, **kwargs):
|
||||
"""
|
||||
Обновляет флаг is_returned заказа при удалении Sale.
|
||||
Вызывается ДО удаления, чтобы можно было получить order.
|
||||
"""
|
||||
if instance.order:
|
||||
# Используем on_commit чтобы обновить после завершения транзакции
|
||||
from django.db import transaction
|
||||
transaction.on_commit(
|
||||
lambda: update_is_returned_flag(instance.order)
|
||||
)
|
||||
|
||||
|
||||
@receiver(post_save, sender=Inventory)
|
||||
def process_inventory_reconciliation(sender, instance, created, **kwargs):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user