195 Commits

Author SHA1 Message Date
1691a84e3b fix(media): настроена генерация полных HTTPS URL для медиа файлов
- Добавлены переменные USE_HTTPS и DOMAIN в .env
- MEDIA_URL теперь использует полный домен на продакшене
- Убрана зависимость от API_BASE_URL для медиа
- Медиа URL: https://corp.robotail.local/media/ вместо http://127.0.0.1:9000/media/
2025-12-03 11:52:02 +03:00
b1541e7146 Merge branch 'feature/requests-recipients' 2025-12-03 11:15:27 +03:00
7f308bce2f docs: добавлена документация по диагностике WebSocket ошибки 1006 2025-12-03 11:14:36 +03:00
c7a3f475e3 docs: добавлены руководства по диагностике WebSocket 1006
- WEBSOCKET_1006_QUICK_GUIDE.md - быстрая шпаргалка (5 минут)
- WEBSOCKET_1006_PRIORITY_CHECK.md - приоритетная диагностика
- WEBSOCKET_1006_DIAGNOSTIC_PLAN.md - полный план диагностики
- WEBSOCKET_1006_SUMMARY.md - сводка по проблеме
- Обновлен README.md с ссылками на документацию
2025-12-03 11:09:18 +03:00
432224b3ba feat(requests): улучшена UI списка заявлений и добавлены расширенные фильтры
Стили комментариев:
- Приведены к единому стилю с лентой новостей
- Убрана фоновая подложка блока комментариев
- Убрана разделительная линия между заявлением и комментариями
- Обновлена структура: comment-header, comment-body, comment-separator
- Добавлены кликабельные ссылки на профили авторов

Исправления формы комментариев:
- Исправлена перезагрузка страницы при нажатии Enter
- Улучшена обработка submit события (preventDefault + stopPropagation)
- Правильная проверка формы через matches() вместо closest()

API endpoints:
- Использование правильных API endpoints для комментариев
- Переход с /requests/comments/{id}/ на /api/v1/requests/{id}/comments/
- Устранено дублирование запросов к старым и новым endpoints

CSRF токены:
- Добавлена функция getCsrfToken() для извлечения из cookie
- CSRF токен добавлен во все POST запросы к API
- Исправлены ошибки 403 Forbidden для действий (cancel, approve, reject)

Расширенные фильтры:
- Добавлен фильтр 'Все доступные' (свои + адресованные + с правами)
- Добавлен фильтр 'Мои заявления' (только созданные мной)
- Добавлен фильтр 'Мне адресовано' (recipients + cc_users + sent_to_all_department)
- Поддержка параметра addressed_to_me=true в API
- Обновлена логика views_front.py для обработки новых фильтров
- Исправлены lint ошибки (длинные строки)
2025-12-03 08:49:23 +03:00
b8d8a428b9 feat(requests): добавлен custom template filter для форматирования ISO дат
- Создан filter format_iso_date в req_tags.py
- Парсит ISO даты из API (с/без времени, с/без Z)
- Поддерживает форматы: d.m.Y, H:i, d.m.Y H:i, Y-m-d
- Обновлен шаблон для использования нового фильтра
- Более читаемое и надежное отображение дат и времени
2025-12-03 07:45:45 +03:00
a435c77756 fix(requests): исправлено отображение дат в табличном виде
Проблема: API возвращает даты как строки ISO, фильтр date не работал
Решение: используется slice для извлечения даты и времени из ISO строк
- date_from/date_to: slice:":10" для YYYY-MM-DD
- created_at: slice:":10" для даты, slice:"11:16" для времени
- Добавлены проверки на существование значений
2025-12-03 07:44:25 +03:00
3ce95a1458 refactor(requests): настоящий табличный вид с фиксированными колонками
Структура таблицы:
- Иконка (48px) - тип заявления
- Заголовок (расширяемая, 2fr) - название, тип, превью комментария
- Автор (1fr) - имя сотрудника с ссылкой
- Даты (100px) - date_from и date_to
- Статус (110px) - badge со статусом
- Создано (80px) - дата и время создания
- Действия (80px) - кнопки одобрить/отклонить/редактировать

Особенности:
- Grid layout с фиксированными шириной колонок
- Автоматический перенос текста в пределах ячейки (word-wrap)
- Выравнивание всех элементов по сетке
- Футер с комментариями выровнен с содержимым
- Адаптивный дизайн (планшеты, мобильные)
- На мобильных - две колонки (иконка + остальное)
2025-12-03 07:39:10 +03:00
fd4bde67e0 style(requests): табличный вид списка заявлений без разделительных линий
- Сеточный layout с выравниванием колонок (иконка, метаданные, действия)
- Убраны разделительные линии между блоками внутри заявления
- Тонкая линия между заявлениями для визуального разделения
- Убрана граница над блоком комментариев (card-actions border-top: none)
- Выравнивание комментариев по левому краю текста заявления
- Адаптивный дизайн для мобильных устройств
- Мягкий hover-эффект для строк
2025-12-03 07:33:29 +03:00
33e34bbe3f feat(requests): добавлена клиентская валидация формы создания заявления
- RecipientPicker.validate() проверяет наличие получателей/отделов
- RecipientPicker.setError()/clearError() для визуальной индикации ошибок
- Валидация в requestCrudHandler для create и edit
- Проверка: автор не может быть получателем
- Автоматическая очистка ошибки при изменении получателей
- Удалено временное логирование из сериализатора
2025-12-03 07:30:39 +03:00
766f9fa919 chore: закоммичен весь прогресс по тестам и фиксам requests API 2025-12-03 07:21:25 +03:00
4dee5c8f11 refactor(requests): Улучшена интуитивность RecipientPicker
Изменения по фидбеку:
✨ Строка 'Отделы' теперь показывается по кнопке '+ Отделы'
  - По умолчанию скрыта (как поле CC)
  - Появляется при клике на кнопку рядом с '+ Копия'
  - Автоматически показывается при загрузке данных (редактирование)

✨ Галочка 'Всем в отделе' появляется только после выбора отдела
  - Показывается только если выбран хотя бы 1 отдел
  - Динамически меняет текст: 'Всем в отделе' или 'Всем в отделах'
  - Более понятное название вместо 'Всем сотрудникам'

� Интерфейс стал еще более интуитивным:
  - Пользователь видит только 'Кому:' по умолчанию
  - Дополнительные опции (CC, Отделы) добавляются по кнопкам
  - Прогрессивное раскрытие (progressive disclosure)
  - Меньше visual clutter

� UX паттерн:
  - Следует принципу 'show what's needed, hide what's not'
  - Как в Gmail: To всегда видно, CC/BCC по кнопке
  - Минимальный интерфейс для простых задач
  - Расширенные опции для сложных сценариев
2025-12-02 18:20:15 +03:00
e68404c5ee refactor(requests): Улучшен UX выбора получателей в стиле email-клиента
Переработан RecipientPicker компонент:
✨ Chip-based UI (как в Gmail/Outlook)
- Пользователи отображаются как chips с крестиком для удаления
- Autocomplete с живым поиском по имени/email
- Dropdown с аватарами и должностями пользователей

� Интуитивный интерфейс:
- Структура To:/CC:/Отделы: (как в почтовых клиентах)
- Получатели всегда видны (убраны collapse)
- Кнопка '+ Копия' для показа поля CC
- Inline флаг 'Всем сотрудникам'

� Улучшенная верстка:
- Модальные окна расширены до modal-lg
- Получатели перенесены в начало (как тема в email)
- Добавлены иконки для визуальной группировки
- Добавлены emoji в типы заявлений для удобства

� CSS обновлен:
- Email-style компактный дизайн
- Фокус-состояния для inputs
- Hover-эффекты для dropdown items
- Адаптивность для мобильных устройств
- Поддержка темной темы

� UX улучшения:
- Поиск с автодополнением вместо select
- Визуальные аватары пользователей (инициалы)
- Показ должности и email в dropdown
- Автофокус после добавления пользователя
- Ограничение результатов поиска до 10
2025-12-02 18:09:19 +03:00
6ea7752946 docs: Добавлен отчет о прогрессе выполнения плана получателей
- Детальный статус всех 8 этапов
- 5 из 8 этапов завершены (62%)
- Список коммитов и метрики
- Приоритеты следующих действий
- Известные проблемы и TODO
2025-12-02 18:02:11 +03:00
ba422c7669 feat(requests): Этап 5 - реализован frontend для получателей заявлений
Создан компонент RecipientPicker:
- Множественный выбор отделов (ManyToMany)
- Выбор основных получателей (recipients)
- Выбор пользователей в копии (CC users)
- Флаг "Отправить всем сотрудникам отделов"
- Динамический рендеринг выбранных пользователей
- Валидация: нельзя указать recipients с флагом sent_to_all_department

Интеграция:
- Добавлены секции получателей в модальные окна создания и редактирования
- Обновлен requestCrudHandler.js для передачи данных получателей в API
- Добавлены стили recipientPicker.css
- Подключен CSS в request_list_full.html

Функциональность:
- Загрузка списка пользователей и отделов из API
- Добавление/удаление получателей через UI
- Автоматическая очистка форм после создания
- Поддержка редактирования существующих получателей
2025-12-02 17:49:54 +03:00
5b44848a35 docs: Добавлен детальный отчет о тестировании получателей заявлений
- Результаты тестирования: 7/7 модельных тестов пройдено
- Описание всех проверенных функций
- Список исправленных ошибок
- Рекомендации для следующих этапов (Frontend, Admin, Tests)
- Команды для запуска тестов
2025-12-02 17:40:32 +03:00
771b93feed fix(requests): Исправлена ошибка с employee_departments и добавлены тесты
- Заменено employee_departments на departments_links в notification_signals.py
- Добавлен импорт Department в serializers.py
- Создан комплексный тестовый скрипт test_recipients.py (7 тестов)
- Создан скрипт test_recipients_api.py для API тестирования
- Добавлены утилиты для создания тестовых данных

Результаты тестирования:
✓ 7/7 тестов модели прошли успешно (100%)
✓ Проверены все методы: add_recipient, is_recipient, all_recipients
✓ Проверена работа с ManyToMany полями
✓ Проверена сериализация через API
✓ Проверен флаг sent_to_all_department
2025-12-02 17:39:09 +03:00
60fc506ef9 feat(requests): Этап 4 - обновлена система уведомлений для получателей
- notify_new_request теперь отправляет уведомления всем recipients и cc_users
- При sent_to_all_department уведомления идут всем сотрудникам отделов
- notify_status_change уведомляет автора, получателей, CC и сотрудников отделов
- create_comment_notification уведомляет всех заинтересованных лиц
- Добавлены метаданные is_primary_recipient, is_cc, is_approver
- Сохранена обратная совместимость со старым полем department
2025-12-02 17:17:22 +03:00
ca056a15f8 feat(requests): Этап 3 - обновлена логика доступа с поддержкой получателей
- Обновлен get_queryset в RequestViewSet с учетом recipients и cc_users
- Добавлен параметр ?addressed_to_me=true для фильтрации заявок, адресованных текущему пользователю
- Получатели теперь видят заявки через recipients, cc_users или sent_to_all_department
- Департаментные права работают с новым полем departments (ManyToMany)
- Добавлена поддержка видимости по нескольким отделам
2025-12-02 17:15:55 +03:00
7cfd290d7d feat(requests): Этапы 1-2 - добавлены поля получателей в модель и сериализаторы
- Добавлены ManyToMany поля: departments, recipients, cc_users, sent_to_all_department
- Старое поле department сохранено для обратной совместимости
- Создана миграция с автоматическим переносом данных
- Обновлены сериализаторы RequestReadSerializer и RequestWriteSerializer
- Добавлен RecipientIDsField для поддержки разных форматов
- Добавлены методы is_recipient, add_recipient, remove_recipient в модель
- Добавлена валидация получателей и отделов
2025-12-02 17:15:04 +03:00
21e2972c11 fix: корректировка конфигурации LDAP_UPN_SUFFIX, устранение двойной @ в UPN, улучшения валидации ФИО и аватара 2025-12-02 14:44:48 +03:00
f0a7a85628 Валидация ФИО: запрет цифр, обязательность аватара, улучшения JS live validation, фиксы паттернов для отчества 2025-12-02 14:02:10 +03:00
a60e85ad16 fix: синхронизация аватара LDAP <-> БД при обновлении пользователя (avatar теперь сохраняется и в employee.avatar) 2025-12-02 12:49:29 +03:00
e6a8fa3e69 fix: синхронизируем avatar из LDAP обратно в БД после обновления 2025-12-02 12:27:01 +03:00
6c5b20a35b fix: Base64ImageField теперь корректно обрабатывает пустые файлы (size=0) 2025-12-02 11:35:23 +03:00
1b1989c76e fix: удаляем avatar из vd перед DB-only валидацией (предотвращает повторную валидацию) 2025-12-02 11:33:23 +03:00
ae47ab0d90 debug: подробные логи для диагностики валидации аватара (JS, DRF, сериализатор) 2025-12-02 11:28:45 +03:00
e240fbf256 Исправлена обработка ValidationError: возврат 400 вместо 500 при ошибках валидации аватара и других полей 2025-12-02 11:16:10 +03:00
2bf3692474 Исправлена ошибка фильтра LdapSyncState: использование model+object_pk вместо несуществующего поля employee 2025-12-02 11:11:50 +03:00
5aa8149514 Улучшена обработка ошибок валидации: парсинг detail с извлечением имени поля и сообщения, обработка API ошибок в try-except 2025-12-02 11:07:47 +03:00
e6e39b7fd0 AJAX submit для формы редактирования сотрудника, ошибки показываются inline 2025-12-02 11:05:37 +03:00
dd902d6d52 AJAX submit для формы редактирования сотрудника, ошибки показываются inline 2025-12-02 11:01:42 +03:00
afdd563913 Разрешено создание записей LDAP синхронизации через админку, убраны readonly поля для редактирования 2025-12-02 10:53:24 +03:00
38a2196a36 - 2025-12-02 10:50:47 +03:00
6cc0624368 Добавлена кликабельная ссылка для быстрого создания записи синхронизации:
- При отсутствии записи LdapSyncState теперь показывается кликабельная ссылка
- Клик по "❌ Нет записи" ведет на форму создания записи с предзаполненными полями model и object_pk
- Упрощено создание отсутствующих записей синхронизации одним кликом
2025-12-02 10:43:57 +03:00
bbe07b122b Добавлено детальное логирование для диагностики проблем с LDAP синхронизацией:
- Добавлены логи при поиске записи синхронизации
- При отсутствии записи выводится список всех object_pk в таблице синхронизации
- Добавлен ID пользователя в сообщение об ошибке для упрощения отладки
- Улучшена обработка исключений с полным логированием стека
2025-12-02 10:42:48 +03:00
6ce7df7e5e Добавлены админ-действия для управления LDAP синхронизацией:
1. Улучшен статус ldap_sync_status с детальной информацией:
   - Локальные пользователи отмечены как "Локальный" (серый)
   - LDAP пользователи с полными данными: ✅ с GUID и DN в подсказке
   - LDAP пользователи с неполными данными: ⚠️ с указанием отсутствующих полей
   - LDAP пользователи без записи: ❌ с пояснением
2. Добавлен action "Создать записи LDAP синхронизации" для массового создания записей LdapSyncState
3. Добавлен action "Проверить статус LDAP синхронизации" с детальной статистикой по выбранным сотрудникам
2025-12-02 10:35:41 +03:00
bb692c2c1c Улучшена админка для мониторинга LDAP синхронизации:
1. Добавлена колонка ldap_sync_status в список сотрудников с иконками статуса (✅/⚠️/❌)
2. В детальной информации ldap_sync_info добавлена кликабельная ссылка на запись LdapSyncState
3. Создан кастомный фильтр LdapSyncedFilter для быстрой фильтрации сотрудников по наличию записи синхронизации
4. Улучшена читаемость статусов синхронизации с подсказками при наведении
2025-12-02 10:32:56 +03:00
843ba2adaa Расширена админка для полного управления моделями и LDAP:
1. Добавлено поле ldap_sync_info в админку Employee для отображения состояния LDAP синхронизации (DN, GUID, направление, timestamps)
2. Добавлены недостающие поля Employee в админку: is_ldap_managed, email_activation_code, sms_activation_code
3. Добавлен is_ldap_managed в list_display и list_filter для быстрой фильтрации
4. Добавлены LDAP поля (ldap_group_dn) в админки Department, DepartmentRole и Position
5. Улучшены fieldsets для всех моделей с группировкой LDAP полей
2025-12-02 10:24:57 +03:00
f16db4abb3 Улучшена обработка ошибок профиля и добавлена админка для LDAP:
1. Убраны редиректы из employee_edit и employee_edit_me - теперь всегда возвращается JSON
2. Добавлена проверка наличия ldap_dn перед обновлением через LDAP в обоих методах (me и partial_update)
3. Зарегистрирована модель LdapSyncState в админке для просмотра состояния синхронизации
2025-12-02 10:13:17 +03:00
4fc149ecd5 Исправлены ошибки редактирования профиля:
1. Изменен редирект при ошибках валидации: теперь возврат на страницу профиля вместо несуществующего GET endpoint
2. Добавлена проверка наличия ldap_dn перед обновлением через LDAP: локальные пользователи без ldap_dn теперь обновляются напрямую в БД
2025-12-02 10:03:47 +03:00
d057e0cdb5 Исправлена обработка ошибок валидации: теперь при ошибках валидации в employee_edit и employee_edit_me происходит возврат на форму редактирования с сообщениями об ошибках, вместо редиректа на профиль. 2025-12-02 09:58:25 +03:00
28a6e9e65f закомитил обработчик который обрабатывал сигнал смены аватара 2025-12-02 09:23:51 +03:00
18bc13b8f8 fix: handle missing avatar files gracefully in signals, improve registration phone error, PATCH avatar empty handling 2025-12-01 17:09:44 +03:00
b293a671c5 фикс? 2025-12-01 16:13:44 +03:00
01759ffbba фикс авы? 2025-12-01 16:03:42 +03:00
1211422ebd логирование апи+ 2025-12-01 16:00:26 +03:00
255d5b556d логирование апи 2025-12-01 15:55:40 +03:00
f5e615f2fc Фикс: корректный placeholder для фото сотрудника при пустом avatar, форма отправляет POST на фронтовую вьюху, убрана JS-валидация и кастомный submit. 2025-12-01 15:44:02 +03:00
cdef98adef debug: добавлено детальное логирование процесса сохранения аватара в API 2025-12-01 15:21:36 +03:00