Files
octopus/myproject/tenants/services/email.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

105 lines
5.2 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 -*-
"""
Сервис отправки 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