1628 Commits

Author SHA1 Message Date
lizerk
f2f8a67dd3 chore(ldap): remove unused ExternalSystemSyncMixin
Миксин больше не используется после перехода на Django сигналы
2026-03-18 16:15:33 +03:00
lizerk
5585758ede refactor(ldap): replace ExternalSystemSyncMixin with Django signals
- Удалён ExternalSystemSyncMixin из EmployeeViewSet
- ViewSet теперь использует временные атрибуты (_ldap_password, _ldap_avatar, _ldap_changes)
- Создан employees/signals_ldap.py с post_save/post_delete handlers
- Сигналы автоматически синхронизируют Employee с LDAP через DirectoryService
- Убран дублирующий блок required_perms_by_action из EmployeeViewSet
- Упрощены perform_create и perform_update (-170 строк)

Архитектурное улучшение: разделение ответственности ViewSet (HTTP) и signals (синхронизация)
2026-03-18 16:13:20 +03:00
lizerk
50169ec09d refactor(api): удалить монолитный views.py (4500 строк)
- Удалён дублирующий монолит api/v1/employees/views.py (4622 строки)
- Все ViewSet'ы уже реэкспортированы в views/__init__.py
- Обновлены импорты в extended_views.py, analyze_queries.py, тестах
- -4622 строки дублированного кода

Импорты 'from api.v1.employees.views import X' работают через views/__init__.py
2026-03-18 15:46:23 +03:00
lizerk
c38493a18b refactor(ldap): sync_service employeeNumber через ORM
- sync_service: заменены read_attrs + modify_user_attrs на LdapUser ORM
  для записи employeeNumber при импорте пользователей
- Убран неиспользуемый импорт modify_user_attrs
2026-03-18 15:10:32 +03:00
lizerk
ea0a7e1f29 refactor(ldap): углубить замену ldap3 → ORM
- user_service: _enable_user через LdapUser ORM (убран ldap_modify_or_ignore)
- user_service: _unique_logins через LdapUser.objects.filter (убран is_taken)
- user_service: удалены импорты MODIFY_REPLACE, is_taken, ldap_modify_or_ignore
- group_service: set_description, list_members, add/remove/replace_members,
  find_dn, groups_with_member — все через LdapGroup ORM
- group_service: удалены ldap_modify_or_ignore, MODIFY_*, BASE, esc_filter
- department_service: _set_ou_managed_by через LdapOrganizationalUnit ORM
  (заменены ~60 строк ADD/REPLACE/DELETE логики на 4 строки ORM)
- department_service: удалены MODIFY_ADD/DELETE/REPLACE
- position_service: delete_position_group и _reconcile_position_nesting
  через groups_with_member (ORM) вместо conn.search

Итого: -94 строки, убраны 3 импорта ldap_repository из сервисов.
2026-03-18 14:48:27 +03:00
lizerk
95ff0dc0af refactor(ldap): заменить ldap3 CRUD на django-ldapdb ORM
- user_service.py: read_attrs/modify_user_attrs → LdapUser ORM,
  sync_user_groups_by_cns → ORM, delete_user без _ldap() контекста
- group_service.py: _wrapped методы через LdapGroup ORM
- department_service.py: _set_ou_description/_delete_department_ou → ORM
- views.py, employees.py: ldap_info через LdapUser ORM
- sync_employee_ids_to_ldap: полная замена на LdapUser ORM
- __init__.py: ORM реэкспорты, обёртки import_*/export_*
- orm_models.py: compatibility shim для django-ldapdb + Django 5.x
- Создан group_utils_orm.py (ORM замена group_utils)
- Удалён deprecated sync_service.py (352 строки)

TODO(ldap-orm) помечены: _set_password, _enable_user, _unique_logins,
_create_user_in_ldap, _move_user_to_base, rename (modify_dn),
sync_catalog (paged search), _set_ou_managed_by
2026-03-18 14:25:53 +03:00
lizerk
8cdfbfb6ef feat(ldap): добавлена интеграция с LdapSyncState
Добавлена полная поддержка связи Employee ↔ LdapUser через LdapSyncState.

Ключевые изменения:
- orm_services.py теперь автоматически создает/обновляет/удаляет LdapSyncState
- create_user() создает LdapSyncState при указании employee_pk
- update_user() обновляет last_django_modify_ts в LdapSyncState
- delete_user() удаляет LdapSyncState при hard delete
- Добавлен метод get_user_dn_by_employee_pk() для быстрого получения DN
- Улучшен метод get_user_by_employee_pk() - сначала ищет через LdapSyncState

Архитектура связи:
Employee (pk=123, PostgreSQL)
    ↓ object_pk
LdapSyncState (ldap_dn='CN=...', PostgreSQL)
    ↓ ldap_dn
LdapUser (dn='CN=...', employee_number='123', LDAP server)

Обновлена документация:
- ORM_INTEGRATION.md теперь объясняет связь моделей
- Добавлена диаграмма архитектуры
- Описаны роли каждой модели
- Объяснено почему нет ForeignKey (разные БД)
2026-03-18 13:53:22 +03:00
lizerk
2eb2da4c5a feat(ldap): интеграция django-ldapdb ORM в employees/ldap/
Добавлена поддержка django-ldapdb для упрощения работы с LDAP через Django ORM.

Ключевые изменения:
- Установлен django-ldapdb==1.5.1 в requirements.txt
- Созданы LDAP ORM модели (LdapUser, LdapGroup, LdapOrganizationalUnit) в employees/ldap/orm_models.py
- Реализованы ORM сервисы для CRUD операций в employees/ldap/orm_services.py
- Настроен database router в eusrr_backend/db_routers.py
- Добавлена LDAP database конфигурация в settings.py
- Создана документация ORM_INTEGRATION.md

Архитектура:
✅ GET → Employee (PostgreSQL) - быстро
✅ POST/PUT/DELETE → LdapUser (django-ldapdb ORM) - просто

Преимущества:
- Django ORM вместо низкоуровневого ldap3
- Автоматическая валидация через Django fields
- Унифицированный CRUD API
- Меньше кода, больше удобства

Файлы:
+ employees/ldap/orm_models.py - LDAP ORM модели (LdapUser, LdapGroup, LdapOrganizationalUnit)
+ employees/ldap/orm_services.py - ORM сервисы (LdapOrmUserService, LdapOrmGroupService, LdapOrmDepartmentService)
+ employees/ldap/ORM_INTEGRATION.md - документация по интеграции
+ eusrr_backend/db_routers.py - database router для LDAP моделей
~ requirements.txt - добавлен django-ldapdb==1.5.1
~ eusrr_backend/settings.py - настроена LDAP database и router
2026-03-18 13:42:32 +03:00
lizerk
50b99025c5 Merge branch 'develop' 2026-03-18 11:38:18 +03:00
lizerk
45a634de92 доработал отображение текущего статуса 2026-03-18 11:37:57 +03:00
lizerk
b9e4591387 Merge branch 'develop' 2026-03-18 10:48:08 +03:00
lizerk
7ff1fe22b2 скрыть историю ото всех кроме админов авторов и самого пользователя 2026-03-18 10:48:02 +03:00
lizerk
1d83624947 Merge branch 'develop' 2026-03-18 10:16:39 +03:00
lizerk
5f1d897b7f feat: добавлена поддержка создания событий возврата из отпуска/больничного
- Добавлен RETURN_ACTION_MAPPING для vacation/sick_leave → returned_from_leave
- Migration команда теперь создаёт события возврата на date_to + 1 день
- Исправлена конвертация date в datetime с timezone
- Обработка случаев когда основное событие уже существует, но нужно создать возврат
- Статистика показывает количество созданных событий возврата
2026-03-18 10:16:21 +03:00
lizerk
40c4c4d8a4 Merge branch 'develop' 2026-03-18 09:58:34 +03:00
lizerk
f98a7d69e4 фикс 2026-03-18 09:58:25 +03:00
lizerk
ea61aef99a Merge branch 'develop' 2026-03-18 09:49:32 +03:00
lizerk
26941f29ee Merge branch 'feature/requests-employee-action-automation' into develop
Добавлена автоматизация создания кадровых событий из заявок:
- Сигналы в employees/signals.py для авто-создания EmployeeAction
- Celery tasks для отложенных событий (vacation, sick_leave)
- Management команда migrate_requests_to_actions
- 13 тестов покрытия функционала
- Документация в docs/completed/REQUESTS_CELERY_AUTOMATION.md
2026-03-18 09:42:48 +03:00
lizerk
46daefcdec test: добавлены тесты для сигналов и migration команда
- Добавлена management команда migrate_requests_to_actions для миграции существующих заявок
- Добавлен conftest.py с фикстурой user_factory для тестов requests_app
- Добавлены 13 тестов для проверки автоматизации создания EmployeeAction
- Покрытие: немедленные/отложенные события, дубликаты, условия срабатывания, маппинги
2026-03-18 09:42:13 +03:00
lizerk
c5a8455421 feat: автоматическое создание EmployeeAction из заявок
- Добавлены сигналы в employees/signals.py для автоматизации создания кадровых событий
- Реализованы стратегии: немедленные (transfer, dismissal) и отложенные (vacation, sick_leave)
- Добавлены Celery tasks для отложенного создания событий и авто-возврата
- Настроен periodic task для очистки пропущенных возвратов
- Архитектура: employees (ядро) обрабатывает события из requests_app (модуль)
2026-03-17 20:34:14 +03:00
lizerk
3dc8541508 добавлена иконка чатов в список сотрудников 2026-03-16 18:29:26 +03:00
lizerk
f28eda6929 feat: Улучшения страницы сотрудника и миграция на ChatMembership
Backend:
- Полная миграция на ChatMembership для всех типов чатов
- Удалены проверки participants M2M поля
- Добавлена обработка participants при создании чатов
- API методы для создания/редактирования/удаления кадровых событий

Frontend:
- Редизайн страницы пользователя с lucide-react иконами
- Добавлено редактирование профиля (ФИО, контакты, аватар)
- Функциональные кадровые события (создание/редактирование/удаление)
- История кадровых событий с цветовой кодировкой
- Исправлено создание дубликатов чатов (поиск по member_ids)
- Удалены визуальные статусные индикаторы (is_active ≠ online)
- Добавлен статус сотрудника из последнего action

Fixes:
- type 'private' вместо 'direct' для личных чатов
- ChatMembership проверки в user_can_access_chat()
- member_ids в ChatListSerializer для поиска чатов
2026-03-16 18:21:24 +03:00
lizerk
8588e52447 Merge branch 'develop' 2026-03-13 12:52:51 +03:00
lizerk
e414358e76 фикс веб пуш 2026-03-13 12:52:40 +03:00
lizerk
4df7c14c45 Merge branch 'develop' 2026-03-13 12:18:37 +03:00
lizerk
6e566b1dee фикс уведомлений через почту 2026-03-13 12:17:40 +03:00
lizerk
4078aca3f8 Merge branch 'develop' 2026-03-13 12:09:50 +03:00
lizerk
3910079223 фикс селоери 2026-03-13 12:09:20 +03:00
lizerk
037d7dcad5 Merge branch 'develop' 2026-03-12 17:12:08 +03:00
lizerk
a98c403116 Мигрировать участников из participants в ChatMembership 2026-03-12 17:11:49 +03:00
lizerk
83031d8118 Merge branch 'develop' 2026-03-12 17:08:28 +03:00
lizerk
2d818b6064 проверка видимости 2026-03-12 17:08:22 +03:00
lizerk
2bc4d73cab Merge branch 'develop' 2026-03-12 17:03:06 +03:00
lizerk
c59f8a77af Добавлю максимум диагностической информации для выявления проблемы: 2026-03-12 17:02:34 +03:00
lizerk
cd87e2ffe0 Merge branch 'develop' 2026-03-12 16:53:49 +03:00
lizerk
15b9b216ed Добавил диагностические опции в команду чек чат 2026-03-12 16:53:19 +03:00
lizerk
a1684fefce Merge branch 'develop' 2026-03-12 16:37:59 +03:00
lizerk
bfcafd219f фиус чек чат 2026-03-12 16:37:44 +03:00
lizerk
ff1acfa60b Merge branch 'develop' 2026-03-12 16:28:43 +03:00
lizerk
387d5bb672 проверка типов чатов 2026-03-12 16:28:30 +03:00
lizerk
b94c6499d4 chore: очистка устаревшей документации
- Удалена устаревшая документация из backend/docs/
- Актуальные гайды сохранены в backend/docs/guides/ и других подпапках
- Удален migrate_participants_to_memberships.py (уже был создан в communications/management/commands/)
2026-03-12 16:12:17 +03:00
lizerk
91342d199d feat: миграция на ChatMembership.is_active, удаление дублирования participants
АРХИТЕКТУРНЫЙ РЕФАКТОРИНГ:
✅ Убрано дублирование логики Chat.participants vs ChatMembership.is_active
✅ Теперь единственный источник истины - ChatMembership.is_active
✅ Исправлен баг с изменением ролей (роли не отображались после изменения)

ИЗМЕНЕНИЯ:

Backend (viewsets.py):
- get_queryset: мигрировано на memberships__is_active=True
- create: убрано participants.add, только memberships
- leave/remove_member: только is_active=False + left_at
- add_member: восстанавливает is_active=True если был False
- change_role: явно устанавливает is_active=True + left_at=None

Backend (serializers.py):
- Убрано поле participants из ChatDetailSerializer
- get_participant_details: через memberships.filter(is_active=True)
- get_participant_names: через memberships

Backend (models.py):
- get_participants(): только через ChatMembership.is_active=True
- __str__(): получаем участников через memberships
- participants помечен как устаревший (в комментариях)

Backend (rules.py):
- is_member_of_chat: только ChatMembership.is_active=True
- has_send_messages_permission: убран fallback на participants

Миграции:
- Создана 0038: убирает 'owner' из choices, очищает help_text
- Исправлены зависимости в requests_app/documents/feed 0010/0014/0006
  (заменили __latest__ на конкретную версию 0037)
- Создан management command migrate_participants_to_memberships
  (перенос данных participants → memberships)

Frontend:
- Добавлено оптимистичное обновление UI при изменении ролей
- Детальное логирование для диагностики

Тесты:
- test_change_role_improved.py: проверка изменения ролей с задержкой
- Обновлен test_chat_roles.py

Удаление устаревшей документации:
- Удалены старые отчеты из docs/ (73 файла)
- Сохранены актуальные руководства

ИСПРАВЛЕННЫЙ БАГ:
До: При изменении роли is_active оставался False → membership не попадал в filter(is_active=True) → исчезал с фронтенда
После: Явно устанавливаем is_active=True при любом действии с членством
2026-03-12 15:58:49 +03:00
lizerk
80cdc36d92 fix: исправлена система прав доступа к чатам и сообщениям
Backend:
- Исправлен user_can_access_chat() для поддержки context-based чатов
- Обновлен is_chat_member() для использования get_participants()
- Добавлена проверка has_send_messages_permission (блокирует гостей)
- Исправлен MessageViewSet.get_queryset() для комментариев
- Добавлена поддержка Feed Post resolver в resolve_chat_participants()
- Чаты типа 'comments' исключены из общего списка
- Добавлены permissions для mark_read, messages, messages_around
- Добавлена команда manage_chat_permissions для управления ролями

Frontend:
- Скрыто поле ввода сообщений для гостей (role='guest')
- Добавлена проверка can_send_messages из membership
- Показывается информативная заглушка для пользователей без прав

Tests & Docs:
- Добавлены тесты для guest роли (send_message + reactions)
- Документация по ролям и правам в чатах
- Troubleshooting guide для отладки permissions

Fixes:
- 403 при доступе к чатам-комментариям
- 404 при удалении/редактировании комментариев
- Комментарии в общем списке чатов
- Гости могли отправлять сообщения
2026-03-12 14:30:25 +03:00
lizerk
558c697f16 Merge branch 'develop' 2026-03-12 01:09:57 +03:00
lizerk
d87e8ed796 фикс 2026-03-12 01:09:51 +03:00
lizerk
c5859ae796 Merge branch 'develop' 2026-03-12 01:08:17 +03:00
lizerk
f58b87c9a8 фикс 2026-03-12 01:08:11 +03:00
lizerk
c65a425bcd Merge branch 'develop' 2026-03-12 01:02:08 +03:00
lizerk
0e133a4633 фикс 2026-03-12 01:01:53 +03:00
lizerk
26283e1a0d Merge branch 'develop' 2026-03-12 00:59:48 +03:00