Files
octopus/myproject/tenants/management/commands/init_tenant_data.py
Andrey Smakotin b59ad725cb Рефакторинг: вынос логики онбординга тенанта в сервисный слой
Создан 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>
2025-12-30 14:52:55 +03:00

68 lines
2.9 KiB
Python
Raw 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.
# -*- 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')