# -*- coding: utf-8 -*- """ Management команда для обновления системных статусов заказов у всех тенантов. Использование: # Обновить статусы у всех тенантов python manage.py update_order_statuses --all # Обновить статусы у конкретного тенанта python manage.py update_order_statuses --schema=anatol """ from django.core.management.base import BaseCommand from django_tenants.utils import get_tenant_model, schema_context from orders.services.order_status_service import OrderStatusService from orders.models import OrderStatus class Command(BaseCommand): help = 'Обновление системных статусов заказов (добавляет новые статусы если их нет)' def add_arguments(self, parser): parser.add_argument( '--all', action='store_true', help='Обновить статусы у всех тенантов' ) parser.add_argument( '--schema', type=str, help='Имя схемы конкретного тенанта' ) def handle(self, *args, **options): update_all = options.get('all', False) schema_name = options.get('schema') if not update_all and not schema_name: self.stdout.write( self.style.ERROR('Укажите либо --all для всех тенантов, либо --schema=<имя> для конкретного') ) return Tenant = get_tenant_model() if update_all: # Обновляем у всех тенантов (кроме public) tenants = Tenant.objects.exclude(schema_name='public') self.stdout.write( self.style.SUCCESS(f'\n=== Обновление статусов у всех тенантов ({tenants.count()}) ===\n') ) for tenant in tenants: self._update_tenant_statuses(tenant) else: # Обновляем у конкретного тенанта try: tenant = Tenant.objects.get(schema_name=schema_name) self.stdout.write( self.style.SUCCESS(f'\n=== Обновление статусов тенанта: {tenant.name} ===\n') ) self._update_tenant_statuses(tenant) except Tenant.DoesNotExist: self.stdout.write( self.style.ERROR(f'\nОШИБКА: Тенант со схемой "{schema_name}" не найден\n') ) return self.stdout.write(self.style.SUCCESS('\n✓ Обновление завершено!\n')) def _update_tenant_statuses(self, tenant): """Обновляет статусы для конкретного тенанта""" self.stdout.write(f'\nТенант: {tenant.name} ({tenant.schema_name})') self.stdout.write('-' * 70) with schema_context(tenant.schema_name): try: # Получаем количество статусов до before_count = OrderStatus.objects.filter(is_system=True).count() # Создаем/обновляем системные статусы OrderStatusService.create_default_statuses() # Получаем количество статусов после after_count = OrderStatus.objects.filter(is_system=True).count() new_count = after_count - before_count if new_count > 0: self.stdout.write( self.style.SUCCESS(f' ✓ Добавлено новых статусов: {new_count}') ) else: self.stdout.write( self.style.WARNING(f' • Все статусы уже существуют ({after_count})') ) # Выводим список всех системных статусов statuses = OrderStatus.objects.filter(is_system=True).order_by('order') self.stdout.write(f'\n Системные статусы ({statuses.count()}):') for status in statuses: end_type = '' if status.is_positive_end: end_type = ' [Успешный]' elif status.is_negative_end: end_type = ' [Отрицательный]' self.stdout.write( f' {status.order:>2}. {status.name:<25} ({status.code:<20}){end_type}' ) except Exception as e: self.stdout.write( self.style.ERROR(f' ✗ Ошибка при обновлении статусов: {e}') )