Рефакторинг: вынос логики онбординга тенанта в сервисный слой
Создан 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>
This commit is contained in:
104
myproject/tenants/services/email.py
Normal file
104
myproject/tenants/services/email.py
Normal file
@@ -0,0 +1,104 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Сервис отправки email для тенантов.
|
||||
"""
|
||||
import uuid
|
||||
from django.utils import timezone
|
||||
from django.conf import settings
|
||||
|
||||
|
||||
def send_password_setup_email(registration):
|
||||
"""
|
||||
Отправить email с ссылкой для установки пароля одобренному владельцу тенанта.
|
||||
|
||||
Args:
|
||||
registration: экземпляр TenantRegistration
|
||||
|
||||
Returns:
|
||||
bool: True если письмо успешно "отправлено" (выведено в консоль)
|
||||
"""
|
||||
# Генерировать токен
|
||||
registration.password_setup_token = uuid.uuid4()
|
||||
registration.password_setup_token_created_at = timezone.now()
|
||||
|
||||
# Построить URL динамически в зависимости от окружения
|
||||
# Локально: http://localhost:8000
|
||||
# Продакшен: https://mix.smaa.by
|
||||
protocol = 'https' if settings.USE_HTTPS else 'http'
|
||||
domain_base = settings.TENANT_DOMAIN_BASE # localhost:8000 или mix.smaa.by
|
||||
|
||||
# URL для установки пароля (главный домен)
|
||||
setup_url = f"{protocol}://{domain_base}/accounts/setup-password/{registration.password_setup_token}/"
|
||||
|
||||
# URL тенанта (поддомен)
|
||||
tenant_url = f"{protocol}://{registration.schema_name}.{domain_base}/"
|
||||
|
||||
# Составить письмо
|
||||
subject = f"Ваш магазин {registration.shop_name} активирован!"
|
||||
|
||||
message = f"""
|
||||
╔══════════════════════════════════════════════════════════════════╗
|
||||
║ ВАША ЗАЯВКА НА РЕГИСТРАЦИЮ МАГАЗИНА ОДОБРЕНА! ║
|
||||
╚══════════════════════════════════════════════════════════════════╝
|
||||
|
||||
Здравствуйте, {registration.owner_name}!
|
||||
|
||||
Отличные новости! Ваша заявка на регистрацию магазина "{registration.shop_name}"
|
||||
была одобрена администратором.
|
||||
|
||||
╔══════════════════════════════════════════════════════════════════╗
|
||||
║ ДАННЫЕ ДЛЯ ВХОДА ║
|
||||
╚══════════════════════════════════════════════════════════════════╝
|
||||
|
||||
📧 Email для входа: {registration.owner_email}
|
||||
🏪 Ваш магазин доступен по адресу: {tenant_url}
|
||||
|
||||
╔══════════════════════════════════════════════════════════════════╗
|
||||
║ УСТАНОВИТЕ ПАРОЛЬ (действительна 7 дней) ║
|
||||
╚══════════════════════════════════════════════════════════════════╝
|
||||
|
||||
Для завершения настройки аккаунта, пожалуйста, установите пароль,
|
||||
перейдя по следующей ссылке:
|
||||
|
||||
{setup_url}
|
||||
|
||||
⏰ Ссылка действительна в течение 7 дней.
|
||||
|
||||
╔══════════════════════════════════════════════════════════════════╗
|
||||
║ ЧТО ДЕЛАТЬ ДАЛЬШЕ? ║
|
||||
╚══════════════════════════════════════════════════════════════════╝
|
||||
|
||||
1. Нажмите на ссылку выше
|
||||
2. Придумайте надежный пароль
|
||||
3. Войдите в свой магазин и начните работу!
|
||||
|
||||
Если у вас возникли вопросы, свяжитесь с нами:
|
||||
📧 support@inventory.by
|
||||
📞 +375 29 123-45-67
|
||||
|
||||
С уважением,
|
||||
Команда Inventory System
|
||||
|
||||
---
|
||||
Если вы не подавали заявку на регистрацию, проигнорируйте это письмо.
|
||||
"""
|
||||
|
||||
from_email = settings.DEFAULT_FROM_EMAIL
|
||||
recipient_list = [registration.owner_email]
|
||||
|
||||
# Вывести в консоль с красивым форматированием
|
||||
print("\n" + "="*70)
|
||||
print("📧 ОТПРАВКА EMAIL (Console Backend)")
|
||||
print("="*70)
|
||||
print(f"Тема: {subject}")
|
||||
print(f"От: {from_email}")
|
||||
print(f"Кому: {recipient_list[0]}")
|
||||
print("-"*70)
|
||||
print(message)
|
||||
print("="*70 + "\n")
|
||||
|
||||
# Обновить registration
|
||||
registration.owner_notified_at = timezone.now()
|
||||
registration.save()
|
||||
|
||||
return True
|
||||
Reference in New Issue
Block a user