feat: регистрация продавца (FR-01) + палитра B (зелёный/янтарь)
This commit is contained in:
1 parent
43ac518fc2
commit
c681c724a5
12 files changed
+335
-8
No files matched your search
@@ -0,0 +1,83 @@
|
||||
from datetime import date
|
||||
|
||||
from django import forms
|
||||
from django.contrib.auth.forms import UserCreationForm
|
||||
|
||||
from apps.accounts.models import User
|
||||
from apps.catalog.models import LegalStatus
|
||||
|
||||
MIN_AGE = 14
|
||||
MAX_AGE = 35
|
||||
|
||||
|
||||
class SellerStep1Form(UserCreationForm):
|
||||
"""Шаг 1 — учётная запись и личные данные (ФИО, дата рождения, регион)."""
|
||||
|
||||
full_name = forms.CharField(label='ФИО', max_length=255)
|
||||
birth_date = forms.DateField(
|
||||
label='Дата рождения',
|
||||
widget=forms.DateInput(attrs={'type': 'date'}),
|
||||
)
|
||||
region = forms.CharField(label='Регион', max_length=120)
|
||||
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ('username', 'email', 'full_name', 'birth_date', 'region')
|
||||
|
||||
def clean_birth_date(self):
|
||||
birth_date = self.cleaned_data['birth_date']
|
||||
today = date.today()
|
||||
age = (
|
||||
today.year
|
||||
- birth_date.year
|
||||
- ((today.month, today.day) < (birth_date.month, birth_date.day))
|
||||
)
|
||||
if age < MIN_AGE:
|
||||
raise forms.ValidationError(
|
||||
f'Минимальный возраст участника — {MIN_AGE} лет.',
|
||||
)
|
||||
if age > MAX_AGE:
|
||||
raise forms.ValidationError(
|
||||
f'Максимальный возраст участника — {MAX_AGE} лет.',
|
||||
)
|
||||
return birth_date
|
||||
|
||||
|
||||
class SellerStep2Form(forms.Form):
|
||||
"""Шаг 2 — данные бренда (название, статус, ИНН, город, соцсети, деятельность)."""
|
||||
|
||||
brand_name = forms.CharField(label='Название бренда', max_length=200)
|
||||
legal_status = forms.ChoiceField(
|
||||
label='Правовой статус', choices=LegalStatus.choices,
|
||||
)
|
||||
inn = forms.CharField(label='ИНН', max_length=12, required=False)
|
||||
city = forms.CharField(label='Город', max_length=120, required=False)
|
||||
socials = forms.CharField(
|
||||
label='Ссылки на соцсети (по одной в строке)',
|
||||
widget=forms.Textarea(attrs={'rows': 3}), required=False,
|
||||
)
|
||||
story = forms.CharField(
|
||||
label='Описание деятельности',
|
||||
widget=forms.Textarea(attrs={'rows': 4}), max_length=3000, required=False,
|
||||
)
|
||||
|
||||
def clean_inn(self):
|
||||
inn = self.cleaned_data.get('inn', '').strip()
|
||||
if inn and not inn.isdigit():
|
||||
raise forms.ValidationError('ИНН должен содержать только цифры.')
|
||||
return inn
|
||||
|
||||
|
||||
class SellerStep3Form(forms.Form):
|
||||
"""Шаг 3 — подтверждения и согласие на обработку ПДн."""
|
||||
|
||||
production_photo = forms.ImageField(
|
||||
label='Фото производства', required=False,
|
||||
)
|
||||
statement_doc = forms.FileField(
|
||||
label='Выписка/справка (PDF, JPG, PNG)', required=False,
|
||||
)
|
||||
pd_consent = forms.BooleanField(
|
||||
label='Согласен(на) на обработку персональных данных',
|
||||
required=True,
|
||||
)
|
||||
Reference in new issue
Block a user