# -*- coding: utf-8 -*- """ Management команда для ручной активации заявки на регистрацию тенанта. Использование: python manage.py activate_registration Пример: python manage.py activate_registration mixflowers """ from django.core.management.base import BaseCommand, CommandError from django.conf import settings from tenants.models import TenantRegistration, Client, Domain class Command(BaseCommand): help = 'Активировать заявку на регистрацию тенанта вручную' def add_arguments(self, parser): parser.add_argument( 'schema_name', type=str, help='Schema name заявки для активации' ) parser.add_argument( '--force', action='store_true', help='Принудительная активация (пересоздать тенант если уже существует)' ) def handle(self, *args, **options): schema_name = options['schema_name'] force = options.get('force', False) # Ищем заявку try: registration = TenantRegistration.objects.get(schema_name=schema_name) except TenantRegistration.DoesNotExist: raise CommandError(f'Заявка с schema_name "{schema_name}" не найдена') self._print_registration_info(registration) # Проверяем статус if registration.status == TenantRegistration.STATUS_APPROVED and not force: self.stdout.write(self.style.WARNING('Эта заявка уже была одобрена!')) if registration.tenant: self.stdout.write(f'Связанный тенант: {registration.tenant.name} (ID: {registration.tenant.id})') return else: self.stdout.write(self.style.WARNING('Но тенант не был создан. Используйте --force для пересоздания')) if not self._confirm('Продолжить с --force?'): return force = True # Проверяем существование тенанта existing_client = Client.objects.filter(schema_name=schema_name).first() if existing_client and not force: raise CommandError( f'Тенант с schema_name "{schema_name}" уже существует (ID: {existing_client.id}). ' 'Используйте --force для пересоздания (ОПАСНО: удалит все данные!)' ) # Если force - удаляем старый тенант if force and existing_client: self._delete_existing_tenant(existing_client) # Активация через сервис self._activate(registration) def _print_registration_info(self, registration): """Вывод информации о заявке.""" self.stdout.write(f'Найдена заявка: {registration.shop_name} ({registration.schema_name})') self.stdout.write(f'Статус: {registration.get_status_display()}') self.stdout.write(f'Email: {registration.owner_email}') self.stdout.write('') def _delete_existing_tenant(self, client): """Удаление существующего тенанта.""" self.stdout.write(self.style.WARNING(f'Удаление существующего тенанта {client.id}...')) try: client.subscription.delete() except Exception: pass Domain.objects.filter(tenant=client).delete() client.delete() self.stdout.write(self.style.SUCCESS('Старый тенант удален')) def _activate(self, registration): """Активация заявки через сервис.""" self.stdout.write('') self.stdout.write(self.style.WARNING('НАЧИНАЮ АКТИВАЦИЮ...')) self.stdout.write('') try: from tenants.services import TenantOnboardingService client = TenantOnboardingService.activate_registration(registration, admin_user=None) # Выводим результат domain = Domain.objects.filter(tenant=client, is_primary=True).first() domain_base = settings.TENANT_DOMAIN_BASE if ':' in domain_base: domain_base = domain_base.split(':')[0] domain_name = f"{registration.schema_name}.{domain_base}" self.stdout.write('') self.stdout.write(self.style.SUCCESS('=' * 60)) self.stdout.write(self.style.SUCCESS('АКТИВАЦИЯ ЗАВЕРШЕНА УСПЕШНО!')) self.stdout.write(self.style.SUCCESS('=' * 60)) self.stdout.write('') self.stdout.write(f'Магазин: {client.name}') self.stdout.write(f'Schema: {client.schema_name}') self.stdout.write(f'Домен: http://{domain_name}:8000/') self.stdout.write(f'Подписка до: {client.subscription.expires_at.strftime("%Y-%m-%d")} ({client.subscription.days_left()} дней)') self.stdout.write('') except Exception as e: self.stdout.write(self.style.ERROR(f'ОШИБКА: {str(e)}')) import traceback self.stdout.write(traceback.format_exc()) raise CommandError('Активация не удалась') def _confirm(self, question): """Запрос подтверждения у пользователя.""" answer = input(f'{question} (yes/no): ') return answer.lower() in ['yes', 'y', 'да']