feat: регистрация продавца (FR-01) + палитра B (зелёный/янтарь)

This commit is contained in:
apuc committed 2026-09-23 18:28:45 +03:00
1 parent 43ac518fc2
commit c681c724a5
12 files changed
+335 -8

No files matched your search

+113 -2
View File
@@ -1,3 +1,114 @@
from django.shortcuts import render
from datetime import date
# Create your views here.
from django.contrib.contenttypes.models import ContentType
from django.shortcuts import redirect, render
from django.urls import reverse
from apps.accounts.forms import SellerStep1Form, SellerStep2Form, SellerStep3Form
from apps.accounts.models import Role, User
from apps.catalog.models import Brand, VerificationStatus
from apps.moderation.models import AuditLog, ModerationRequest
SESSION_KEY = 'seller_registration'
def _get_session_data(request):
return request.session.get(SESSION_KEY, {})
def seller_register(request):
"""Многошаговая регистрация продавца (FR-01)."""
step = int(request.GET.get('step', 1))
data = _get_session_data(request)
if step == 1:
form = SellerStep1Form(request.POST or None)
if request.method == 'POST' and form.is_valid():
cleaned = form.cleaned_data
# date нельзя сериализовать в сессию (JSON) — храним ISO-строку.
cleaned['birth_date'] = cleaned['birth_date'].isoformat()
data['step1'] = cleaned
request.session[SESSION_KEY] = data
return redirect(reverse('accounts:seller_register') + '?step=2')
return render(request, 'accounts/seller_register.html', {
'form': form, 'step': 1, 'total_steps': 3,
})
if step == 2:
if 'step1' not in data:
return redirect(reverse('accounts:seller_register'))
form = SellerStep2Form(request.POST or None)
if request.method == 'POST' and form.is_valid():
data['step2'] = form.cleaned_data
request.session[SESSION_KEY] = data
return redirect(reverse('accounts:seller_register') + '?step=3')
return render(request, 'accounts/seller_register.html', {
'form': form, 'step': 2, 'total_steps': 3,
})
if step == 3:
if 'step1' not in data or 'step2' not in data:
return redirect(reverse('accounts:seller_register'))
form = SellerStep3Form(request.POST or None, request.FILES or None)
if request.method == 'POST' and form.is_valid():
_create_seller(request, data, form.cleaned_data)
request.session.pop(SESSION_KEY, None)
return redirect(reverse('accounts:seller_register_done'))
return render(request, 'accounts/seller_register.html', {
'form': form, 'step': 3, 'total_steps': 3,
})
return redirect(reverse('accounts:seller_register'))
def _create_seller(request, data, step3):
s1 = data['step1']
s2 = data['step2']
user = User.objects.create_user(
username=s1['username'],
email=s1.get('email', ''),
password=s1['password1'],
role=Role.SELLER,
full_name=s1['full_name'],
birth_date=date.fromisoformat(s1['birth_date']),
region=s1['region'],
pd_consent=step3['pd_consent'],
)
socials = [
line.strip()
for line in s2.get('socials', '').splitlines()
if line.strip()
]
brand = Brand.objects.create(
user=user,
name=s2['brand_name'],
legal_status=s2['legal_status'],
inn=s2.get('inn', ''),
city=s2.get('city', ''),
region=s1['region'],
socials=socials,
story=s2.get('story', ''),
production_photo=step3.get('production_photo'),
statement_doc=step3.get('statement_doc'),
verification_status=VerificationStatus.PENDING,
)
ModerationRequest.objects.create(
content_type=ContentType.objects.get_for_model(Brand),
object_id=brand.pk,
decision='pending',
)
AuditLog.objects.create(
user=user,
action='seller_registered',
object_repr=f'Бренд «{brand.name}»',
)
return user, brand
def seller_register_done(request):
return render(request, 'accounts/seller_register_done.html')