feat: Добавить автоматическое создание суперпользователей для тенантов

Реализована система автоматического создания суперпользователей при активации
новых тенантов (магазинов). Credentials читаются из .env файла.

Изменения:
- Подключен django-environ для управления переменными окружения
- Обновлен settings.py: SECRET_KEY, DEBUG, DATABASE теперь из .env
- Добавлены настройки TENANT_ADMIN_EMAIL, TENANT_ADMIN_PASSWORD, TENANT_ADMIN_NAME
- Обновлен tenants/admin.py: автоматическое создание superuser при активации
- Создан activate_tenant.py: универсальный скрипт активации заявок
- Обновлен activate_mixflowers.py: добавлено создание superuser
- Создан .gitignore для защиты секретов
- Добавлена документация TENANT_ADMIN_GUIDE.md

Использование:
1. Через админку: Заявки → Активировать (автоматически создаст superuser)
2. Через скрипт: python activate_tenant.py <schema_name>

Доступ к админке тенанта:
- URL: http://{schema_name}.localhost:8000/admin/
- Email: admin@localhost (из .env)
- Password: 1234 (из .env)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-27 18:20:26 +03:00
parent a55d0405ed
commit 4b44624f86
6 changed files with 1164 additions and 70 deletions

View File

@@ -0,0 +1,97 @@
# -*- coding: utf-8 -*-
"""
Скрипт для активации заявки mixflowers
"""
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
django.setup()
from django.db import transaction
from django.utils import timezone
from tenants.models import TenantRegistration, Client, Domain, Subscription
# Ищем заявку
registration = TenantRegistration.objects.get(schema_name='mixflowers')
print(f'Найдена заявка: {registration.shop_name} ({registration.schema_name})')
print(f'Статус: {registration.get_status_display()}')
print(f'Email: {registration.owner_email}')
print('')
with transaction.atomic():
# Создаем тенант
print(f'Создание тенанта: {registration.schema_name}')
client = Client.objects.create(
schema_name=registration.schema_name,
name=registration.shop_name,
owner_email=registration.owner_email,
owner_name=registration.owner_name,
phone=registration.phone,
is_active=True
)
print(f'[OK] Тенант создан (ID: {client.id})')
# Создаем домен
domain_name = f"{registration.schema_name}.localhost"
print(f'Создание домена: {domain_name}')
domain = Domain.objects.create(
domain=domain_name,
tenant=client,
is_primary=True
)
print(f'[OK] Домен создан (ID: {domain.id})')
# Создаем триальную подписку
print('Создание триальной подписки на 90 дней')
subscription = Subscription.create_trial(client)
print(f'[OK] Подписка создана (ID: {subscription.id})')
print(f' Истекает: {subscription.expires_at.strftime("%Y-%m-%d")} ({subscription.days_left()} дней)')
# Создаем суперпользователя для тенанта
print('Создание суперпользователя для тенанта')
from django.db import connection
from django.contrib.auth import get_user_model
from django.conf import settings
# Переключаемся на схему тенанта
connection.set_tenant(client)
User = get_user_model()
if not User.objects.filter(email=settings.TENANT_ADMIN_EMAIL).exists():
superuser = User.objects.create_superuser(
email=settings.TENANT_ADMIN_EMAIL,
name=settings.TENANT_ADMIN_NAME,
password=settings.TENANT_ADMIN_PASSWORD
)
print(f'[OK] Суперпользователь создан (ID: {superuser.id})')
print(f' Email: {superuser.email}')
print(f' Password: {settings.TENANT_ADMIN_PASSWORD}')
else:
print(f'[SKIP] Пользователь с email {settings.TENANT_ADMIN_EMAIL} уже существует')
# Возвращаемся в public схему
public_tenant = Client.objects.get(schema_name='public')
connection.set_tenant(public_tenant)
# Обновляем заявку
registration.status = TenantRegistration.STATUS_APPROVED
registration.processed_at = timezone.now()
registration.processed_by = None
registration.tenant = client
registration.save()
print('[OK] Заявка обновлена')
print('')
print('=' * 60)
print('АКТИВАЦИЯ ЗАВЕРШЕНА УСПЕШНО!')
print('=' * 60)
print(f'Магазин: {client.name}')
print(f'Schema: {client.schema_name}')
print(f'Домен: http://{domain_name}:8000/')
print(f'Подписка до: {subscription.expires_at.strftime("%Y-%m-%d")} ({subscription.days_left()} дней)')
print('')
print('Доступ к админке:')
print(f' URL: http://{domain_name}:8000/admin/')
print(f' Email: {settings.TENANT_ADMIN_EMAIL}')
print(f' Password: {settings.TENANT_ADMIN_PASSWORD}')