Создан TenantOnboardingService как единый источник истины для: - Активации заявки на регистрацию тенанта - Создания Client, Domain, Subscription - Инициализации системных данных (Customer, статусы, способы оплаты, склад, витрина) Новые сервисы: - TenantOnboardingService (tenants/services/onboarding.py) - WarehouseService (inventory/services/warehouse_service.py) - ShowcaseService (inventory/services/showcase_service.py) - PaymentMethodService (orders/services/payment_method_service.py) Рефакторинг: - admin.py: 220 строк → 5 строк (делегирование сервису) - init_tenant_data.py: 259 строк → 68 строк - activate_registration.py: использует сервис - Тесты обновлены для вызова сервиса напрямую При создании тенанта автоматически создаются склад и витрина по умолчанию. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
68 lines
2.9 KiB
Python
68 lines
2.9 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
Management команда для инициализации всех системных данных тенанта.
|
||
|
||
Создаёт:
|
||
- Системного клиента (анонимный покупатель для POS)
|
||
- Системные статусы заказов
|
||
- Системные способы оплаты
|
||
- Склад по умолчанию
|
||
- Витрину по умолчанию
|
||
|
||
Использование:
|
||
# Инициализация для конкретного тенанта
|
||
python manage.py init_tenant_data --schema=anatol
|
||
|
||
# С флагом --reset для пересоздания данных
|
||
python manage.py init_tenant_data --schema=anatol --reset
|
||
"""
|
||
from django.core.management.base import BaseCommand
|
||
from django_tenants.utils import get_tenant_model, schema_context
|
||
|
||
|
||
class Command(BaseCommand):
|
||
help = 'Инициализация всех системных данных тенанта (клиент, статусы, способы оплаты, склад, витрина)'
|
||
|
||
def add_arguments(self, parser):
|
||
parser.add_argument(
|
||
'--schema',
|
||
type=str,
|
||
required=True,
|
||
help='Имя схемы БД тенанта (пример: anatol)'
|
||
)
|
||
parser.add_argument(
|
||
'--reset',
|
||
action='store_true',
|
||
help='Удалить и пересоздать все системные данные'
|
||
)
|
||
|
||
def handle(self, *args, **options):
|
||
schema_name = options.get('schema')
|
||
reset = options.get('reset', False)
|
||
|
||
# Проверяем что тенант существует
|
||
Tenant = get_tenant_model()
|
||
try:
|
||
tenant = Tenant.objects.get(schema_name=schema_name)
|
||
except Tenant.DoesNotExist:
|
||
self.stdout.write(self.style.ERROR(f'\nОШИБКА: Тенант со схемой "{schema_name}" не найден\n'))
|
||
return
|
||
|
||
self.stdout.write(self.style.SUCCESS('\n=== Инициализация системных данных тенанта ===\n'))
|
||
self.stdout.write(f'Тенант: {tenant.name} ({schema_name})')
|
||
if reset:
|
||
self.stdout.write(self.style.WARNING('Режим: RESET (пересоздание данных)\n'))
|
||
else:
|
||
self.stdout.write('')
|
||
|
||
# Переключаемся на схему тенанта и вызываем сервис
|
||
with schema_context(schema_name):
|
||
from tenants.services import TenantOnboardingService
|
||
TenantOnboardingService.init_tenant_data(reset=reset)
|
||
|
||
# Итоговое сообщение
|
||
self.stdout.write('\n' + '='*70)
|
||
self.stdout.write(self.style.SUCCESS('УСПЕХ: Инициализация системных данных завершена!'))
|
||
self.stdout.write('='*70)
|
||
self.stdout.write('\nТенант готов к работе.\n')
|