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, )