Добавлена офлайн/EndUser-подпись «ознакомлен и принял в работу» для документов отчётов и файловые вложения к задачам через Nextcloud.
Co-authored-by: Cursor <cursoragent@cursor.com>
В /documents/ добавлено дерево департаментов, права view/edit через DocumentAccessGrant и выдача доступа сотрудникам/отделам/группам.
Co-authored-by: Cursor <cursoragent@cursor.com>
Сотрудник может подключить несколько IMAP-ящиков и переключаться между ними.
Дислокация снова показывает всю сеть, а не только назначенные аптеки.
Co-authored-by: Cursor <cursoragent@cursor.com>
Сотрудник сам подключает ящик (autoconfig, вложения, пагинация списка, надёжный IMAP-поиск); в хедере работает /api/search по разделам и сущностям с ACL. Также устойчивость Mattermost-токена для чата.
Co-authored-by: Cursor <cursoragent@cursor.com>
Каждому виджету можно задать ширину: «Полная» (на всю строку) или «½».
Виджеты выстраиваются в flex-сетку: два «½» встают в один ряд, «Полная»
занимает строку целиком. На узких экранах половинные переносятся в столбик.
- DashboardLayout.widget_widths (JSON {ключ: half|full}) + миграция 0022;
поле widgets не тронуто — обратная совместимость сохранена
- core/dashboard: layout_widths, ширина в build_dashboard_context/
customize_rows, save_layout(widths=...), normalize_width
- dashboard.html: flex-wrap сетка по ширине; customize: переключатель ½/полная
- tests: 6 (сохранение/чтение ширин, нормализация, дефолт, контекст, POST)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Виджеты теперь могут требовать доступ к разделу портала (required_section).
Недоступный виджет не отдаётся и не предлагается в настройке — даже если
остался в сохранённой раскладке или в наборе по умолчанию; save_layout
отбрасывает недоступные ключи (защита от подмены). Виджет «Метрики»
(общекорпоративная сводка) требует доступа к разделу «Отчёты».
Плитки в «Быстром доступе» скрываются по can_section (Документы, Задачи,
Календарь, Сотрудники) — как email и справочники ранее; остаются только
разделы, доступные пользователю.
- core/dashboard.py: required_section, widget_allowed, accessible_keys;
фильтрация в resolve/customize/save
- quick_access.html: плитки под can_section
- tests: 6 тестов доступности (скрытие/показ, отбрасывание, ре-фильтр)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Три новых виджета к кастомизируемому дашборду:
- upcoming — праздники, отпуска, ДР, смены и встречи на 2 недели вперёд;
переиспользует сборщики календаря (с их логикой видимости) через новый
calendar_service.upcoming_events()
- my_hr_requests — статусы моих кадровых заявок (отпуск/больничный/отгул)
- my_tickets — мои открытые обращения в IT-поддержку
Все три — в реестре DASHBOARD_WIDGETS, доступны в настройке дашборда и
наборах по умолчанию. Тесты: реестр, контекст HR-заявок, рендер виджетов.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Дашборд теперь собирается из виджетов (приветствие, метрики, мои задачи,
новости, быстрый доступ). Сотрудник настраивает состав и порядок под себя
(вкл/выкл + перемещение ↑↓), а для тех, кто не настраивал, действует набор
по умолчанию по типу локации (Офис/Аптека/Склад), задаётся в админке.
- core/dashboard.py: реестр виджетов + сборка раскладки
- core/models/dashboard.py: DashboardLayout (персональная), DashboardDefaults
(синглтон по типу локации)
- core/views.py: dashboard_view через реестр + dashboard_customize_view
- templates/pages/dashboard_widgets/*: виджеты-партиалы; dashboard.html —
цикл по виджетам; dashboard_customize.html — настройка (HTMX + ↑↓)
- admin: DashboardDefaults (чекбоксами по локации) + read-only раскладки;
пункт меню «Дашборд по умолчанию»
- core/tests_dashboard.py: 11 тестов (логика раскладки + view)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Form Word draft for OnlyOffice, publish the file to unlock the month; roster is head-first then by name with Employee responsibility zones.
Co-authored-by: Cursor <cursoragent@cursor.com>
- ReportDocument (+ миграция 0005): файлы отдела в Nextcloud (06_Отчёты).
- blank_office.py: генерация пустых Word/Excel для новых документов.
- documents.py: доступ/путь/создание, права view/edit по отделу.
- редактор OnlyOffice учится открывать report_doc (view/edit).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Выдача/отзыв права на отчёты по всем отделам конкретному сотруднику
из портала управления группами.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ConnectorConfig(onlyoffice) + миграция, подсказка по extra_config в админке.
- /documents/onlyoffice/ в whitelist 2FA — Document Server забирает файл
без сессии портала (доступ по подписанному file-token + JWT DS).
- Страница редактора и кнопки «открыть в OnlyOffice» в браузере документов.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Раздел «Справка» (категории/статьи/предложка), правки ad_connector
и обновление тестов feed под обязательную 2FA.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Конфиг счётчиков и день/ночь-тарифы, учёт энергосистем (генераторы,
инверторы), доступ к разделу РРО/ПРРО.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Отдельное право на редактирование карточки аптеки, формы, пресеты колонок
дислокации и правки видимости карточки.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Модель/сервисы HR-заявок с заменами, приглашения на установку пароля
(инвайты), обновлённая страница профиля сотрудника и правки 2FA.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Section-based portal access, matrix прав по группам, аккаунтинг-портал,
управление группами пользователей, справочники, дашборд и общий каркас
навигации/стилей.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Remove the is_staff permission bridge, tighten intern credential handling with one-time PDFs and random seed passwords, and let staff manage cash registers from the portal.
Co-authored-by: Cursor <cursoragent@cursor.com>
Let admins set per-section access levels so operational data on pharmacy detail is no longer all-or-nothing for every logged-in user.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Строка поиска перенесена наверх страницы (над всем чатом), результаты
по-прежнему открываются в области сообщений
- В списке ЛС у собеседников-ботов рядом выводится метка «бот»
- Закрытые/архивные разговоры (delete_at>0) скрыты по умолчанию, показываются
только по галочке «Показувати закриті розмови» (тянем include_deleted=true)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Порядок каналов/ЛС — по реальному времени последнего поста (тянем per-channel,
т.к. last_post_at из списка каналов ненадёжен), архивные (delete_at>0) — вниз
- Непрочитанные: счётчик по websocket, бейдж на строке + жирное имя, префикс
«(N)» в тайтле, браузерное уведомление; сброс при открытии канала
- Кнопка «Написати в чат» на карточке сотрудника → /chat/?dm=<mm_id>,
чат открывает/создаёт ЛС с этим человеком (идемпотентный /channels/direct)
- Тесты кнопки чата в EmployeeDetailTests
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Единый скролл вместо жёсткого max-height:35% на ЛС и flex:1 на каналах
(убран пустой провал под каналами)
- Секции-заголовки — компактные uppercase-подписи в стиле портала
- Строки ЛС и каналов выровнены по единому левому краю (0.75rem)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Списки каналов и ЛС сортируются по last_post_at (свежие сверху)
- При открытии чата автоматически выбирается самая свежая розмова — сразу
видны последние сообщения, а не пустой экран
- Поиск сообщений через Mattermost /teams/{id}/posts/search: строка поиска
над лентой, результаты списком (кто/канал/время/текст), клик открывает канал
- Выход из поиска при открытии канала и смене команды
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Заменяет статичный макет documents.html реальным браузером Group Folders:
- access.py: accessible_sections (разделы по правам: Компания/Обучение/Обмен,
отдел сотрудника, Кадровые дела для суперюзера) + safe_relpath (посегментная
валидация подпути от path traversal); раздел резолвится только из whitelist
- views: documents_browse/download/upload с проверкой раздела и пути на каждом
эндпоинте, запись — только в writable-разделы
- documents.html: вкладки разделов + ленивый HTMX-браузер с хлебными крошками,
навигацией по папкам, скачиванием и загрузкой
- documents_view отдаёт доступные разделы; тесты разделов, путей и авторизации
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>