Corp/backend/users/forms.py
Игорь Надеин 6fb2cdcea0 feat: enhance Employee model and integrate Telegram/WhatsApp bot
- Add birth_date, created_at/updated_at to Employee; remove username field
- Introduce EmployeeAction for tracking HR events and is_actually_active/status properties
- Create BotSubscriber model (OneToOne relation) for TG/WA binding
- Implement Aiogram-based Telegram bot:
  • request contact to bind by phone or @username
  • department selection keyboard from DEPARTMENTS dict
  • async ORM via sync_to_async, custom filters for bound & active employees
- Update profile view & template:
  • show “Bind Telegram/WhatsApp” button only when not already bound
  • preview avatar on upload
- Remove registration tokens in favor of contact-based auth
- Clean up templates, forms and add avatar validation mixin
2025-07-30 08:15:53 +03:00

85 lines
2.6 KiB
Python

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from phonenumber_field.formfields import PhoneNumberField
from .models import Employee
class AvatarValidationMixin:
def clean_avatar(self):
avatar = self.cleaned_data.get('avatar')
if avatar:
if avatar.size > 2 * 1024 * 1024:
raise forms.ValidationError(
"Размер файла не должен превышать 2MB")
if not avatar.name.lower().endswith(('.jpg', '.jpeg', '.png')):
raise forms.ValidationError(
"Допустимые форматы: JPG, JPEG, PNG")
return avatar
class RegistrationForm(AvatarValidationMixin, UserCreationForm):
first_name = forms.CharField(
label="Имя",
required=True,
widget=forms.TextInput(attrs={'required': 'required'})
)
last_name = forms.CharField(
label="Фамилия",
required=True,
widget=forms.TextInput(attrs={'required': 'required'})
)
email = forms.EmailField(
label="Email",
required=True,
widget=forms.EmailInput(attrs={'required': 'required'})
)
avatar = forms.ImageField(
label="Аватар",
required=True,
widget=forms.FileInput(attrs={'required': 'required'})
)
class Meta:
model = Employee
fields = [
'phone_number', # USERNAME_FIELD
'last_name',
'first_name',
'patronymic',
'birth_date',
'whatsapp',
'telegram',
'email',
'avatar',
'password1',
'password2'
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['whatsapp'].required = False
self.fields['telegram'].required = False
class ProfileUpdateForm(AvatarValidationMixin, UserChangeForm):
avatar = forms.ImageField(label='Аватарка', required=False,
widget=forms.ClearableFileInput(attrs={'id': 'avatarInput'}))
telegram = forms.CharField(label='Telegram', required=False)
whatsapp = PhoneNumberField(label='WhatsApp', required=False)
class Meta:
model = Employee
fields = (
'last_name',
'first_name',
'patronymic',
'birth_date',
'gender',
'email',
'position',
'phone_number',
'telegram',
'whatsapp',
'avatar'
)