Files
octopus/myproject/activate_mixflowers.py
Andrey Smakotin 4b44624f86 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>
2025-10-27 18:20:26 +03:00

98 lines
3.8 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 -*-
"""
Скрипт для активации заявки 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}')