from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileAllowed, FileRequired from wtforms import StringField, PasswordField, SelectField, TextAreaField, FloatField, DateField from wtforms.validators import DataRequired, Length, Email, Optional class LoginForm(FlaskForm): username = StringField('Логин', validators=[DataRequired(), Length(1, 80)]) password = PasswordField('Пароль', validators=[DataRequired()]) class UserForm(FlaskForm): username = StringField('Логин', validators=[DataRequired(), Length(1, 80)]) full_name = StringField('ФИО', validators=[DataRequired(), Length(1, 200)]) email = StringField('Email', validators=[Optional(), Email()]) password = PasswordField('Пароль', validators=[Optional(), Length(4, 100)]) role = SelectField('Роль', choices=[ ('junior_expert', 'Младший эксперт'), ('employee', 'Эксперт'), ('senior_expert', 'Старший эксперт'), ('sm', 'Руководитель'), ('guest', 'Гость') ], default='employee') senior_expert_id = SelectField('Старший эксперт', coerce=int, choices=[], default=0) grade = SelectField('Грейд', choices=[ ('', '---'), ('SE', 'SE'), ('JSE', 'JSE'), ('SSE', 'SSE'), ('SM', 'SM'), ('Lead', 'Lead') ], default='') position = SelectField('Должность', choices=[ ('', '---'), ('младший эксперт', 'Младший эксперт'), ('эксперт', 'Эксперт'), ('старший эксперт', 'Старший эксперт'), ('руководитель', 'Руководитель'), ], default='') project_start_date = DateField('Дата начала работы', validators=[Optional()]) phone = StringField('Телефон', validators=[Optional(), Length(0, 30)]) telegram = StringField('Telegram', validators=[Optional(), Length(0, 100)]) emergency_contact = StringField('Контакт для связи (экстр.)', validators=[Optional(), Length(0, 200)]) emergency_contact_phone = StringField('Телефон экстр. контакта', validators=[Optional(), Length(0, 30)]) previous_review_rating = StringField('Предыдущая оценка (TellentReview)', validators=[Optional(), Length(0, 50)]) class ExcelUploadForm(FlaskForm): file = FileField('Excel файл', validators=[ FileRequired(), FileAllowed(['xlsx', 'xls'], 'Только Excel файлы (.xlsx, .xls)') ]) kpi_name = StringField('Название KPI', validators=[DataRequired(), Length(1, 200)]) description = TextAreaField('Описание', validators=[Optional()]) class PdfUploadForm(FlaskForm): file = FileField('PDF файл', validators=[ FileRequired(), FileAllowed(['pdf'], 'Только PDF файлы') ]) description = TextAreaField('Описание', validators=[Optional()]) class KpiTargetForm(FlaskForm): target_value = FloatField('Целевое значение', validators=[Optional()]) unit = StringField('Единица измерения', validators=[Optional(), Length(0, 50)]) class TaskForm(FlaskForm): title = StringField('Название', validators=[DataRequired(), Length(1, 300)]) description = TextAreaField('Описание', validators=[Optional()]) assigned_to = SelectField('Назначить', coerce=int, choices=[]) priority = SelectField('Приоритет', choices=[ ('low', 'Низкий'), ('medium', 'Средний'), ('high', 'Высокий') ], default='medium') due_date = DateField('Срок до', validators=[Optional()]) comment = TextAreaField('Комментарий', validators=[Optional()]) class TrainingForm(FlaskForm): title = StringField('Название обучения', validators=[DataRequired(), Length(1, 300)]) description = TextAreaField('Описание', validators=[Optional()]) hours = FloatField('Часы', validators=[Optional()]) date = DateField('Дата', validators=[Optional()]) file = FileField('Файл (PDF, документ)')