- 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
85 lines
2.6 KiB
Python
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'
|
|
)
|