56 Commits

Author SHA1 Message Date
lizerk
efd4a84c89 Update application functionality and supporting components 2026-09-07 16:59:38 +03:00
lizerk
cd64ee4ef7 Add project analytics and improve commerce integrations 2026-09-07 12:23:15 +03:00
c7ba753087 Allow browser SSO logout without JWT authentication 2026-09-04 12:47:14 +03:00
17c84eb366 Sync LDAP usernames and verify corporate emails 2026-09-04 11:19:51 +03:00
f2e85de672 Support unified LDAP, email, and phone login 2026-09-04 09:58:20 +03:00
cae8e97146 Add corporate OpenID Connect provider and browser sessions 2026-09-04 09:50:56 +03:00
lizerk
205fd7252d Update application features and supporting components 2026-08-19 12:09:01 +03:00
lizerk
bd515fd6d5 Harden commerce import reliability 2026-08-18 18:48:00 +03:00
lizerk
214323760b Fix notification lifecycle and commerce task scheduling 2026-08-18 16:43:50 +03:00
lizerk
138a1284cd Improve commerce, notifications, and task UX 2026-08-18 15:30:55 +03:00
lizerk
156b649b04 Complete commerce synchronization and realtime updates 2026-08-18 09:10:40 +03:00
lizerk
53cf1918c0 Add message mentions and unread mention tracking 2026-08-17 16:08:14 +03:00
lizerk
3c5a8c87e2 Update application functionality and supporting components 2026-08-17 13:54:35 +03:00
lizerk
cca52d70d6 Refactor project structure and remove obsolete code 2026-08-15 11:16:50 +03:00
lizerk
b7e20c8956 feat: stream calendar events over websocket 2026-08-14 23:44:28 +03:00
lizerk
aaa1da663c refactor: unify observability and realtime updates 2026-08-14 22:49:20 +03:00
lizerk
014afc485e Remove obsolete code and simplify project structure 2026-08-14 17:00:49 +03:00
lizerk
78f19e27af Remove obsolete files and simplify project structure 2026-08-14 16:35:21 +03:00
lizerk
beb4b8b86b refactor(departments): unify department feed and discussion flows 2026-04-14 16:14:52 +03:00
lizerk
969554bf3f refactor(frontend): remove redundant department panels 2026-04-13 23:44:18 +03:00
lizerk
64eafeea46 refactor(frontend): normalize danger action shells 2026-04-13 23:41:16 +03:00
lizerk
3b855e2ef1 refactor(frontend): split department showcase and management 2026-04-13 22:25:30 +03:00
lizerk
b73336744a refactor(frontend): simplify department workspace 2026-04-13 21:23:54 +03:00
lizerk
28d61b842c refactor(frontend): build department management screen 2026-04-13 17:52:41 +03:00
lizerk
5ab638892b chore: checkpoint workspace changes 2026-04-13 16:00:53 +03:00
lizerk
4127e65c4f docs(frontend): prioritize person chip pattern 2026-04-13 15:49:16 +03:00
lizerk
b9a6de7b43 refactor(frontend): unify comment composer controls 2026-04-13 15:33:57 +03:00
lizerk
c96b9453a5 refactor(frontend): normalize vertical rhythm scale 2026-04-13 15:21:54 +03:00
lizerk
07ded50432 refactor(frontend): extract settings page controller 2026-04-13 14:44:38 +03:00
lizerk
caf6eebc0f refactor(frontend): refine profile timeline balance 2026-04-13 14:30:29 +03:00
lizerk
d437f63d02 refactor(frontend): finish people cluster alignment 2026-04-13 14:25:00 +03:00
lizerk
79b66c5884 refactor(frontend): align profile sections and users list 2026-04-13 14:20:51 +03:00
lizerk
fe040e2da9 refactor(frontend): align profile page controllers 2026-04-13 14:15:34 +03:00
lizerk
55f3171636 docs(frontend): document genre drift and refactor waves 2026-04-13 14:05:47 +03:00
lizerk
c87901452a docs(frontend): soften requests guidance 2026-04-13 13:46:03 +03:00
lizerk
61db827ae2 refactor(frontend): tighten requests controls contract 2026-04-13 13:23:16 +03:00
lizerk
ba41dd2b0f refactor(frontend): remove requests image warnings 2026-04-13 13:19:54 +03:00
lizerk
2cfa1099f3 refactor(frontend): normalize requests list shell 2026-04-13 13:17:34 +03:00
lizerk
8b150e270d refactor(frontend): extract requests screen orchestration 2026-04-13 13:11:58 +03:00
lizerk
331dc1433a refactor(frontend): decompose requests screen 2026-04-13 12:56:00 +03:00
lizerk
3a2d05a64d feat(requests): улучшены фильтры по датам, исправлена логика фильтрации, добавлена инструкция по тестированию 2026-03-27 14:57:31 +03:00
lizerk
540e295ef4 feat: Fix LDAP DN bugs + add password management in admin
BREAKING CHANGES:
- Department.head автоматически очищается при увольнении руководителя
- LDAP managedBy атрибут очищается при увольнении

Fixes:
- DN не перемещался при восстановлении сотрудника (Dismissed → Users)
- DN не перемещался при увольнении сотрудника без отделов
- Ошибка при увольнении из множественных отделов (двойной modify_dn)
- Неправильные URL patterns для LDAP моделей в админке
- Двойное кодирование DN в редиректе смены пароля

Features:
- Добавлен метод _ensure_ldap_dn_location для гарантированного перемещения DN
- Добавлена проверка already_there в sync_department_member_to_ldap
- Управление паролями LDAP пользователей через админку:
  * Кнопка смены пароля в карточке пользователя
  * Массовое действие смены пароля
  * Автосинхронизация с Django password hash
- Автоочистка Department.head и LDAP managedBy при увольнении руководителя
- Добавлены методы set_password() и change_password() в LdapUser

Changed:
- Переписан сигнал sync_department_member_to_ldap с реальными методами
- Исправлены URL patterns: ldap_* → employees_*
2026-03-23 20:32:39 +03:00
lizerk
75662ec7ea feat(ldap): Полная миграция на django-ldapdb ORM с миксинами и Django Admin
LDAP ORM модели (orm_models.py):
================================
✅ Применены миксины ModifyDnMixin и LdapSyncStateMixin ко всем моделям
✅ LdapUser - поддержка modify_dn + автоуправление LdapSyncState
✅ LdapGroup - поддержка modify_dn для перемещения групп
✅ LdapOrganizationalUnit - поддержка modify_dn для реорганизации

Миксины (mixins.py) - НОВЫЙ ФАЙЛ:
=================================
✅ ModifyDnMixin - автоматический modify_dn при изменении base_dn
   • Отслеживает изменения base_dn
   • Выполняет LDAP modify_dn с newsuperior
   • Обновляет _saved_dn для корректного последующего save()
   • Использование: user.base_dn = new_dn; user.save()

✅ LdapSyncStateMixin - автоуправление LdapSyncState
   • Автоматически создает/обновляет LdapSyncState при save()
   • Автоматически удаляет LdapSyncState при delete()
   • Настройки: _sync_model_name, _sync_pk_field

Django Admin для LDAP (admin.py) - НОВЫЙ ФАЙЛ:
==============================================
✅ LdapUserAdmin - полноценная админка для LDAP пользователей
   • List display: CN, SAM, email, Django Employee link, sync status
   • Search: по CN, SAM, email, имени, фамилии
   • Filters: по userAccountControl
   • Actions синхронизации:
     - sync_from_ldap_to_django (LDAP → Django)
     - sync_from_django_to_ldap (Django → LDAP)
     - show_sync_diff (сравнение данных)
   • Fieldsets: идентификация, персональные данные, контакты, UAC, группы
   • DN форматирование с подсветкой компонентов
   • Sync status indicators с иконками

Django Admin для Employee (employees/admin.py):
===============================================
✅ Добавлены зеркальные actions синхронизации:
   • sync_from_django_to_ldap - создание/обновление в LDAP
     - Автоматическое создание LDAP пользователя если не существует
     - Генерация временного пароля
     - Установка is_ldap_managed = True
   • sync_from_ldap_to_django - обновление из LDAP
   • show_sync_diff - сравнение Django ↔ LDAP
✅ Импорт django.contrib.messages для уведомлений

Сервисы LDAP (services/):
=========================
✅ UserService - полная миграция на ORM для UPDATE операций
✅ GroupService - использование ORM для модификаций
✅ DepartmentService - ORM для обновления OU
✅ PositionService - ORM для групп позиций

Тесты (tests/unit/):
===================
✅ test_user_service.py - обновлены под ORM
✅ test_group_service.py - обновлены под ORM
✅ test_position_service.py - обновлены под ORM
✅ conftest.py - добавлены фикстуры для ORM моделей

Authentication (auth_backends.py):
=================================
✅ EmailOrPhoneBackend - добавлено подробное debug логирование
   • Логирование email/phone lookup
   • Логирование is_active проверки
   • Логирование password check с hash prefix
✅ SuperuserOnlyBackend - добавлено debug логирование
   • Логирование parent auth результата
   • Логирование is_superuser проверки

API (api/auth/serializers.py):
==============================
✅ PhoneOrEmailTokenObtainPairSerializer - исправлен KeyError
   • Добавлена проверка credentials перед super().validate()
   • Явный AuthenticationFailed при отсутствии учетных данных

Middleware (middleware.py):
===========================
✅ Очистка от устаревшего кода (305 → 102 строки)
   • ❌ Удалена EmailVerificationMiddleware (не используется)
   • ❌ Удалена RegistrationIPRestrictionMiddleware (не используется)
   • ❌ Удалены все ссылки на namespace 'auth_front'
   • ✅ Возврат 403 для неавторизованных вместо редиректа

Settings (settings.py):
=======================
✅ LOGIN_URL изменен с 'auth_front:login' на '/admin/login/'
✅ Добавлено DEBUG логирование для:
   • django.contrib.auth
   • eusrr_backend.auth_backends

Миграции:
=========
✅ Удалены старые миграции LDAP моделей (0042, 0043)
✅ Добавлена миграция LdapSyncQueue (0042_ldapsyncqueue.py)

Документация:
=============
✅ ADMIN_GUIDE.md - руководство по использованию LDAP Admin
✅ docs/guides/ldap-orm-mixins-usage.md - usage guide для миксинов
✅ docs/completed/ldap-orm-create-support.md - документация ORM миграции
✅ docs/in-progress/LDAP_ORM_MIGRATION_PLAN.md - план миграции

Инфраструктура (__init__.py):
=============================
✅ Добавлен импорт admin для авторегистрации
✅ Экспорт ORM моделей (LdapUser, LdapGroup, LdapOrganizationalUnit)

ИТОГО:
======
• Полная миграция с ldap3 на django-ldapdb ORM для UPDATE/MOVE/DELETE
• Унификация: один подход для всех LDAP операций через модели
• Автоматизация: синхронизация состояния и перемещения через миксины
• UI: полноценный Django Admin для управления LDAP объектами
• Отладка: расширенное логирование аутентификации
• Чистота: удален устаревший код middleware и миграций
• Тесты: 29 passed, 0 failed, 18 skipped

Breaking Changes: НЕТ - обратная совместимость сохранена
2026-03-19 22:33:06 +03:00
4025eb2b19 feat: Create modern DocumentDetailModal with tabs based on market analysis
Analyzed leading DMS solutions (Google Drive, Notion, Confluence, SharePoint, ClickUp)
and implemented enterprise-grade document modal with progressive disclosure.

NEW COMPONENT:
- DocumentDetailModal.tsx - modern tabbed interface for document details

STRUCTURE:
- Fixed header with title, metadata, quick actions, status badge
- Tab navigation: Overview | Activity | Acknowledgements | Versions
- Full-screen modal with optimized layout

TAB: OVERVIEW
- 2-column layout (66% main content, 33% sidebar)
- Document preview (images, PDF iframe, file icon fallback)
- Description section
- Workflow actions
- Sidebar with:
  • Author & dates (created, modified)
  • Folder location (breadcrumbs)
  • Tags (color badges)
  • Recipients (departments + individuals)

TAB: ACTIVITY
- Timeline placeholder for workflow events
- Ready for integration with django-reversion API
- Shows created/published events

TAB: ACKNOWLEDGEMENTS
- Reuses existing DocumentAcknowledgement component
- Progress visualization
- User list with status

TAB: VERSIONS
- Placeholder for version history
- Ready for integration with django-reversion API

IMPROVEMENTS:
- Progressive disclosure - info organized in tabs, not overwhelming
- Visual hierarchy - preview is focal point, actions always visible
- Quick actions - Open, Download, Share in header
- Rich metadata - type, size, dates, location, tags, recipients
- Scalable structure - easy to add new tabs (comments, related docs)

TYPES:
- Added document_type field (id, name, description) to Document interface
- Added tags field (id, name, color) to Document interface

DOCUMENTATION:
- docs/guides/MODERN_DOCUMENT_UI.md - comprehensive guide
- Market analysis of 5+ leading DMS solutions
- Architecture decisions and UX improvements
- Integration roadmap with django-reversion
- Future features: comments, related documents, @mentions

BENEFITS:
- Enterprise-level UX matching Confluence/SharePoint standards
- All document info accessible without context switching
- Transparent workflow and history (after backend integration)
- Modular and extensible architecture
2026-02-28 13:46:58 +03:00
967819a58f feat: интеграция django-rules для object-level permissions
- Установлен пакет rules==3.5
- Добавлен ObjectPermissionBackend в AUTHENTICATION_BACKENDS
- Созданы базовые правила для employees:
  * Предикаты: is_hr_staff, is_department_head, is_own_profile и др.
  * Правила: view/change/delete employee, view reports и контакты
- Созданы базовые правила для documents:
  * Предикаты: is_document_owner, has_document_access, can_approve и др.
  * Правила: view/change/delete/approve/publish/share documents
- Правила регистрируются в apps.py (ready() метод)
- Создана подробная документация с примерами использования
  * В views, templates, DRF permissions, Django Admin
  * Сценарии: многоуровневое согласование, временные ограничения
  * Сравнение с django-guardian, отладка, тестирование

Документация: docs/guides/DJANGO_RULES_INTEGRATION.md
2026-02-28 00:07:53 +03:00
8a083f6f67 fix: Исправлена система автоотметки прочитанных сообщений
- Удалено поле last_read_at из ChatReadState, используется только last_read_message FK
- Исправлена логика автоотметки: отмечается последнее ЗАГРУЖЕННОЕ сообщение, а не последнее в чате
- Убран вызов chat.mark_read() при WebSocket open_chat (отмечал последнее в чате вместо загруженного)
- Добавлен signal для мониторинга изменений ChatReadState
- Исправлена логика скролла: убран автоскролл при дозагрузке вниз
- Добавлена проверка разрывов при WebSocket сообщениях (предотвращает пропуск сообщений)
- Реализована автоотметка WebSocket сообщений (только если пользователь внизу)
- Асимметричная загрузка: 24 контекста + 6 новых сообщений
- Добавлен ScrollableMessageList компонент для корректной работы скролла
- Миграции: 0028 (удаление last_read_at), 0029 (индекс на last_read_message)
2026-02-25 20:29:00 +03:00
8b2d3b378e feat(frontend): добавлен API клиент и восстановлен backend из master
- Создан frontend/src/lib/api.ts с 43 методами для всех API endpoint'ов
- Создан frontend/src/lib/permissions.ts для проверки прав доступа
- Исправлен URL в getChatMessagesAround: /messages/around/ → /messages-around/
- Исправлен параметр: message_id → around_id
- Восстановлен backend из ветки master для стабильности
- Удалены конфликтующие файлы Pages Router (src/pages, App.tsx, providers)
- Оставлена только чистая структура Next.js App Router
- Добавлена документация по миграции API v2
2026-02-24 15:40:50 +03:00
e97dc26514 docs: добавление документации по тестированию и оптимизации
API Testing:
- docs/guides/API_TESTING_GUIDE.md - полное руководство по API тестированию
  * Использование Postman коллекции
  * Newman CLI интеграция
  * REST Client примеры
  * Pytest примеры с fixtures
- docs/reports/API_EMPLOYEES_COVERAGE.md - анализ покрытия эндпоинтов
  * Покрытие расширено с 23% до ~70%
  * Список протестированных и непокрытых эндпоинтов

Database Optimization:
- backend/docs/reports/DB_QUERIES_ANALYSIS.md - детальный анализ запросов к БД
  * 8 ViewSet'ов проанализированы
  * Найдены критические N+1 проблемы:
    - SkillViewSet.merge() делает 2N запросов в цикле
    - GroupViewSet.retrieve не использует prefetch_related
    - RegisterAPIView дважды проверяет email
  * Предложены оптимизации с raw SQL
  * Рейтинг текущего состояния: 4/5 звезд
2026-02-17 18:33:56 +03:00
28e2f1615f feat: реализован drag & drop для перемещения событий между календарями
- Создан модуль calendarEventDragDrop.js с классами DragDropState и CalendarUtils
- Реализовано перетаскивание событий между календарями через модальное окно
- Добавлена кнопка 'Переместить все' для массового перемещения
- Модальное окно отображает источник и цель перемещения
- Поддержка legacy-календарей (company/department/personal)
- Добавлены стили для подсветки drop-target (папки и календари)
- Backend: исправлена обработка null значений в serializer
- Backend: добавлен endpoint list_raw для получения немодерируемых событий
- Использованы стандартные Bootstrap стили для модалов
- Исправлено всплытие событий dragover/drop (stopPropagation)
- Эмодзи иконки для типов календарей (����)
- Toast уведомления об успехе/ошибках перемещения
2026-02-12 15:59:53 +03:00
281f0b2bbc feat: современное отображение событий календаря с множественным выбором
Реализовано:

1. Множественный выбор календарей через чекбоксы
   - Заменил <select> на чекбоксы для выбора нескольких календарей
   - События создаются одновременно во всех выбранных календарях
   - При редактировании - обновляется только первый выбранный
   - Цветовые индикаторы для каждого календаря

2. Современный дизайн событий
   - Двухцветная схема: левая граница = цвет календаря, фон = цвет события
   - Полупрозрачный фон события (80%) для лучшей видимости
   - Тени и hover эффекты для объёма
   - Закругленные углы (4px)
   - Плавные анимации (transform + transition)

3. Улучшенное отображение накладывающихся событий
   - dayMaxEvents: автоматически показывать '+N еще'
   - dayMaxEventRows: 4 - максимум 4 строки на день
   - moreLinkClick: 'popover' - красивый popover для остальных
   - eventMaxStack: 3 - до 3 событий в стеке
   - eventOrder: сортировка по началу, длительности, алфавиту

4. Новый CSS файл calendar-improvements.css
   - Современные стили для FullCalendar
   - Улучшенный popover с градиентом
   - Стили для выходных дней (розоватый фон)
   - Hover эффекты на события
   - Анимация fadeInEvent при загрузке
   - Улучшенная читаемость текущего дня
   - Адаптивность для мобильных устройств
   - Кастомные scrollbar для списков

5. Передача цвета календаря в события
   - calendar_color добавляется в extendedProps
   - Используется __calendar из интеграции
   - Отдельная обработка eventColor и calendarColor

6. Визуальные улучшения
   - Текст события: font-weight 500, line-height 1.3
   - Отступы: paddingLeft 6px (с цветом календаря)
   - Тень текста для читаемости на любом фоне
   - Паттерн для ежегодных событий (диагональные полосы)
   - Индикатор текущего дня: синий круг с белым текстом

Результат:
✅ События визуально различимы по календарям (левая граница)
✅ Сохранён индивидуальный цвет события (основной фон)
✅ Множество событий в день отображается компактно (+N еще)
✅ Современный Material Design стиль
✅ Плавные анимации и hover эффекты
✅ Улучшенная читаемость и UX
2026-02-11 12:52:25 +03:00