feat: регистрация продавца (FR-01) + палитра B (зелёный/янтарь)
This commit is contained in:
1 parent
43ac518fc2
commit
c681c724a5
12 files changed
+335
-8
No files matched your search
+113
-2
@@ -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')
|
||||
Reference in new issue
Block a user