# Generated manually - Fix ShowcaseItem status for already sold kits from django.db import migrations def fix_showcase_items_status(apps, schema_editor): """ Исправляем статус ShowcaseItem для уже проданных комплектов. Логика: - Если у ShowcaseItem нет активных резервов (status='reserved') → это уже проданный/разобранный букет → удаляем ShowcaseItem """ ShowcaseItem = apps.get_model('inventory', 'ShowcaseItem') Reservation = apps.get_model('inventory', 'Reservation') # Находим все ShowcaseItem в статусе 'available' available_items = ShowcaseItem.objects.filter(status='available') items_to_delete = [] for item in available_items: # Проверяем есть ли активные резервы для этого экземпляра has_active_reservations = Reservation.objects.filter( showcase_item=item, status='reserved' ).exists() # Если резервы не привязаны к showcase_item, проверяем старым способом if not has_active_reservations: has_active_reservations = Reservation.objects.filter( product_kit=item.product_kit, showcase=item.showcase, status='reserved' ).exists() if not has_active_reservations: # Нет активных резервов - этот букет уже продан/разобран items_to_delete.append(item.id) # Удаляем ShowcaseItem без активных резервов if items_to_delete: ShowcaseItem.objects.filter(id__in=items_to_delete).delete() def reverse_migration(apps, schema_editor): """ Откат невозможен - удалённые ShowcaseItem не восстановить. Но это безопасно - они относились к уже проданным букетам. """ pass class Migration(migrations.Migration): dependencies = [ ('inventory', '0008_migrate_showcase_kits_to_items'), ] operations = [ migrations.RunPython( fix_showcase_items_status, reverse_code=reverse_migration ), ]