Files
octopus/myproject/tenants/views.py
Andrey Smakotin 097d4ea304 feat: Добавить систему мультитенантности с регистрацией магазинов
Реализована полноценная система мультитенантности на базе django-tenants.
Каждый магазин получает изолированную схему БД и поддомен.

Основные компоненты:

Django-tenants интеграция:
- Модели Client (тенант) и Domain в приложении tenants/
- Разделение на SHARED_APPS и TENANT_APPS
- Public schema для общей админки
- Tenant schemas для изолированных данных магазинов

Система регистрации магазинов:
- Публичная форма регистрации на /register/
- Модель TenantRegistration для заявок со статусами (pending/approved/rejected)
- Валидация schema_name (латиница, 3-63 символа, уникальность)
- Проверка на зарезервированные имена (admin, api, www и т.д.)
- Админ-панель для модерации заявок с кнопками активации/отклонения

Система подписок:
- Модель Subscription с планами (триал 90 дней, месяц, квартал, год)
- Автоматическое создание триальной подписки при активации
- Методы is_expired() и days_left() для проверки статуса
- Цветовая индикация в админке (зеленый/оранжевый/красный)

Приложения:
- tenants/ - управление тенантами, регистрация, подписки
- shops/ - точки магазинов/самовывоза (tenant app)
- Обновлены миграции для всех приложений

Утилиты:
- switch_to_tenant.py - переключение между схемами тенантов
- Обновлены image_processor и image_service

Конфигурация:
- urls_public.py - роуты для public schema (админка + регистрация)
- urls.py - роуты для tenant schemas (магазины)
- requirements.txt - добавлены django-tenants, django-environ, phonenumber-field

Документация:
- DJANGO_TENANTS_SETUP.md - настройка мультитенантности
- TENANT_REGISTRATION_GUIDE.md - руководство по регистрации
- QUICK_START.md - быстрый старт
- START_HERE.md - общая документация

Использование:
1. Пользователь: http://localhost:8000/register/ → заполняет форму
2. Админ: http://localhost:8000/admin/ → активирует заявку
3. Результат: http://{schema_name}.localhost:8000/ - готовый магазин

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-27 19:13:10 +03:00

60 lines
2.1 KiB
Python
Raw Permalink 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 -*-
from django.shortcuts import render, redirect
from django.views.generic import CreateView, TemplateView
from django.urls import reverse_lazy
from django.contrib import messages
from .forms import TenantRegistrationForm
from .models import TenantRegistration
class TenantRegistrationView(CreateView):
"""
Публичная форма регистрации нового тенанта
"""
model = TenantRegistration
form_class = TenantRegistrationForm
template_name = 'tenants/registration_form.html'
success_url = reverse_lazy('tenants:registration_success')
def form_valid(self, form):
"""
Обработка успешной отправки формы
"""
response = super().form_valid(form)
# Добавляем сообщение об успехе
messages.success(
self.request,
f"Спасибо за регистрацию! Ваша заявка на магазин '{self.object.shop_name}' "
f"отправлена на проверку. Мы свяжемся с вами по email {self.object.owner_email} "
f"в ближайшее время."
)
return response
def form_invalid(self, form):
"""
Обработка ошибок валидации
"""
messages.error(
self.request,
"Пожалуйста, исправьте ошибки в форме."
)
return super().form_invalid(form)
class RegistrationSuccessView(TemplateView):
"""
Страница благодарности после успешной регистрации
"""
template_name = 'tenants/registration_success.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
# Получаем последнюю заявку текущего пользователя (если есть)
# Здесь можно добавить фильтрацию по сессии или email
context['show_details'] = False
return context