Files
octopus/myproject/orders/management/commands/create_order_statuses.py
Andrey Smakotin c7875f147c Implement flexible order status management system
Features:
- Created OrderStatus model for managing statuses per tenant
- Added system-level statuses: draft, new, confirmed, in_assembly, in_delivery, completed, return, cancelled
- Implemented CRUD views for managing order statuses
- Created OrderStatusService with status transitions and business logic hooks
- Updated Order model to use ForeignKey to OrderStatus
- Added is_returned flag for tracking returned orders
- Updated filters to work with new OrderStatus model
- Created management command for status initialization
- Added HTML templates for status list, form, and confirmation
- Fixed views.py to use OrderStatus instead of removed STATUS_CHOICES

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-13 16:29:50 +03:00

90 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Management command для создания системных статусов заказов.
Использование:
python manage.py create_order_statuses
python manage.py create_order_statuses --reset
python manage.py create_order_statuses --schema grach
"""
from django.core.management.base import BaseCommand
from django.db import connection
from django_tenants.utils import get_tenant_model
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(
'--reset',
action='store_true',
help='Удалить все статусы перед созданием (осторожно!)',
)
parser.add_argument(
'--schema',
type=str,
help='Имя схемы тенанта (по умолчанию текущий тенант)',
)
def handle(self, *args, **options):
"""Основной обработчик команды"""
# Если указана схема, переходим на нее
schema_name = options.get('schema')
if schema_name:
Tenant = get_tenant_model()
try:
tenant = Tenant.objects.get(schema_name=schema_name)
connection.set_tenant(tenant)
self.stdout.write(
self.style.SUCCESS(f'Переключился на тенант: {tenant.name}')
)
except Tenant.DoesNotExist:
self.stdout.write(
self.style.ERROR(f'Тенант со схемой {schema_name} не найден')
)
return
if options['reset']:
count = OrderStatus.objects.count()
self.stdout.write(
self.style.WARNING(f'Удаляю {count} статусов...')
)
OrderStatus.objects.all().delete()
self.stdout.write('Создаю системные статусы...')
try:
OrderStatusService.create_default_statuses()
self.stdout.write(
self.style.SUCCESS('Системные статусы успешно созданы')
)
except Exception as e:
self.stdout.write(
self.style.ERROR(f'Ошибка при создании статусов: {str(e)}')
)
return
# Выводим информацию о созданных статусах
statuses = OrderStatus.objects.all().order_by('order')
self.stdout.write(
self.style.SUCCESS(f'\nВсего создано {statuses.count()} статусов:')
)
for status in statuses:
status_type = 'Системный' if status.is_system else 'Пользовательский'
end_type = ''
if status.is_positive_end:
end_type = ' [Успешный]'
elif status.is_negative_end:
end_type = ' [Отрицательный]'
self.stdout.write(
f' - {status.name:<20} ({status.code:<15}) - {status_type}{end_type}'
)