179 Commits

Author SHA1 Message Date
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
803d12c9e4 fix: добавлен initEmployeeForm в employee_detail_scripts.html - форма теперь будет обрабатывать загрузку файлов через FormData 2025-12-01 15:19:13 +03:00
4ceb41147c debug: добавлено логирование вызова функции employee_edit_me 2025-12-01 15:16:00 +03:00
5e75e8ebc1 debug: добавлено подробное логирование в employee_edit и employee_edit_me для отладки загрузки аватаров 2025-12-01 15:14:50 +03:00
4b8130a014 fix: добавлена поддержка multipart/form-data в employee_edit и employee_edit_me для загрузки аватаров 2025-12-01 15:12:19 +03:00
8ae9753650 debug: добавлено детальное логирование отправки PATCH запроса 2025-12-01 15:10:02 +03:00
7fe7cc84e1 debug: добавлено логирование в employeeFormHandler для отладки загрузки аватара 2025-12-01 15:06:41 +03:00
3b5ceb3831 debug: улучшено логирование загрузки аватара (INFO уровень + детали файла) 2025-12-01 15:02:33 +03:00
19bb1615c0 debug: добавлено логирование загрузки аватара в /me/ endpoint + проверка request.FILES 2025-12-01 14:58:40 +03:00
7acc30389c fix: исправлена загрузка аватара в /api/v1/employees/me/ (было photo вместо avatar) 2025-12-01 14:56:11 +03:00
69d99ecba5 fix: исправлен путь к аватарам в команде optimize_avatars (используется MEDIA_ROOT) 2025-12-01 14:43:14 +03:00
16591ff317 fix: устранены дубликаты сообщений, архитектура загрузки через WebSocket, исправлен poll_update для Django Channels, улучшена инициализация голосований и защита от повторов 2025-12-01 14:19:58 +03:00
5b6c691b43 Исправлена отправка уведомлений для объявлений всем участникам
Проблема:
- get_participants для announcement возвращал none()
- notification_signals использовал participants вместо get_participants
- Уведомления не создавались для объявлений с include_all_employees

Решение:
- get_participants для announcement/channel теперь возвращает всех
  активных сотрудников если include_all_employees=True
- notification_signals использует get_participants для
  announcement/channel/department/global типов
- Добавлены тестовые скрипты для проверки

Тестирование:
✅ Уведомления создаются для всех участников (кроме автора)
✅ Тип уведомления: announcement_new_message
✅ Приоритет: high, каналы: web + telegram
2025-11-30 12:25:19 +03:00
d35d7cb9b9 Убраны console.warn из chatListFilter и chatListRealtime
Модули теперь тихо выходят, если не находят элементы (не на странице чатов),
вместо того чтобы засорять консоль предупреждениями на всех остальных страницах.
2025-11-30 12:21:36 +03:00
6f1e477fe8 Реализована полная система объявлений с уникальной бизнес-логикой
Основные возможности:
- Только 1 объявление на пользователя (database constraint)
- Автогенерация названия 'Объявления от {имя}'
- Только создатель может публиковать сообщения
- Админы могут блокировать/разблокировать объявления
- Заблокированные объявления скрыты от всех (кроме staff)
- Запрет на ответы (reply) в объявлениях (can_reply=False)
- Запрет на редактирование/удаление сообщений
- Уведомления всем участникам при новом объявлении

Детали реализации:
- Добавлены поля: is_blocked, blocked_at, blocked_by, can_reply
- API endpoints: /api/announcement/<id>/block/ и /unblock/
- Валидация на уровне views, API и WebSocket
- Новый тип уведомлений: announcement_new_message
- UI индикаторы блокировки и прав доступа
- Компактное отображение статуса 'только просмотр'

Затронуты файлы:
- models.py: новые поля и constraint
- api_views.py: валидация и API блокировки
- consumers.py: проверки прав в WebSocket
- views.py: фильтрация и контекст прав
- templates: UI блокировки и статусов
- notification_signals.py: уведомления для объявлений
2025-11-30 12:18:09 +03:00
f329feb6a2 Жесткая фиксация круглых аватаров чатов через important 2025-11-30 11:39:46 +03:00
2ebacf91ba Улучшена структура списков чатов: круглые аватары, поддержка изображений, названия отделов, badge 'Основной' 2025-11-30 11:29:54 +03:00