From 72b0de18631b35866c11ee9edb287f0c7a07df77 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sat, 20 Dec 2025 19:19:01 +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=D1=8B=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=83=D1=81=D1=8B=20=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2:=20=D0=A7=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BE=D0=B1=D1=80=D0=B0=D0=BD=20=D0=B8=20=D0=9F?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлены системные статусы partially_assembled и fully_assembled в order_status_service.py - Создана management команда update_order_statuses для обновления статусов у всех тенантов - Новые статусы интегрируются в существующую логику резервирования и списания товара - Статусы располагаются между 'В сборке' и 'В доставке' в естественном порядке процесса --- .../commands/update_order_statuses.py | 112 ++++++++++++++++++ .../orders/services/order_status_service.py | 18 +++ 2 files changed, 130 insertions(+) create mode 100644 myproject/orders/management/commands/update_order_statuses.py diff --git a/myproject/orders/management/commands/update_order_statuses.py b/myproject/orders/management/commands/update_order_statuses.py new file mode 100644 index 0000000..292802b --- /dev/null +++ b/myproject/orders/management/commands/update_order_statuses.py @@ -0,0 +1,112 @@ +# -*- 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}') + ) diff --git a/myproject/orders/services/order_status_service.py b/myproject/orders/services/order_status_service.py index 827ba11..9fb0fae 100644 --- a/myproject/orders/services/order_status_service.py +++ b/myproject/orders/services/order_status_service.py @@ -93,6 +93,24 @@ class OrderStatusService: 'color': '#FF9800', 'description': 'Заказ находится в процессе сборки/подготовки' }, + { + 'code': 'partially_assembled', + 'name': 'Частично собран', + 'label': 'Частично собран', + 'is_system': True, + 'order': 35, + 'color': '#FFC107', + 'description': 'Заказ частично собран, некоторые позиции готовы' + }, + { + 'code': 'fully_assembled', + 'name': 'Полностью собран', + 'label': 'Полностью собран', + 'is_system': True, + 'order': 38, + 'color': '#8BC34A', + 'description': 'Заказ полностью собран и готов к отгрузке/доставке' + }, { 'code': 'in_delivery', 'name': 'В доставке',