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>
This commit is contained in:
2025-11-13 16:29:50 +03:00
parent 0d5f0d2015
commit c7875f147c
28 changed files with 1337 additions and 390 deletions

View File

@@ -0,0 +1,89 @@
"""
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}'
)