Date: Mon, 22 Sep 2025 10:30:00 +0300
Subject: [requests] Drawer «Рассмотреть», корректный чекбокс «Черновик», дружелюбные даты,
robust-обработка ошибок reject, и глобальный бейдж непрочитанных чатов
- Список заявлений:
- вместо россыпи кнопок добавлен аккуратный выезжающий блок действий (collapse drawer)
по клику «Рассмотреть»; компактные нейтральные стили, мягкая анимация.
- в модале «Изменить» добавлена галочка «Сохранить как черновик» с правильной
семантикой: hidden `_save_as=submit` по умолчанию + checkbox `_save_as=draft`.
Теперь снятие галочки действительно снимает draft.
- улучшены стили и структура разметки.
- Даты:
- на фронт-обёртке нормализуем datetime-поля (created_at/updated_at/decided_at)
в человекочитаемый вид, чтобы не светить сырые ISO 8601.
- Обработка ошибок:
- фикс падения при попытке отклонить уже одобренную заявку: ответ 400 у DRF
может приходить списком ошибок; теперь сообщение извлекается безопасно.
- Чаты:
- синхронизировали название ключа контекста с проектом (`chat_unread_total`);
- бейдж «Чаты» обновляется глобальным событием `chats:unread-total`, даже если
список чатов не открыт (fallback — суммирование счётчиков на странице).
Примечание: пути к шаблонам могут отличаться в вашем проекте — ниже даны
типовые варианты (`backend/requests_app/templates/...`). Если у вас другой
layout, внесите изменения в соответствующие файлы шаблонов.
30 lines
944 B
Python
30 lines
944 B
Python
from __future__ import annotations
|
||
from django.db.models import TextChoices
|
||
|
||
|
||
class RequestType(TextChoices):
|
||
"""Перечень типов заявлений (значение хранится в БД)."""
|
||
|
||
VACATION = "vacation", "Отпуск"
|
||
SICK_LEAVE = "sick_leave", "Больничный"
|
||
TRANSFER = "transfer", "Перевод"
|
||
DISMISSAL = "dismissal", "Увольнение"
|
||
OTHER = "other", "Другое"
|
||
|
||
|
||
class RequestStatus(TextChoices):
|
||
"""Статусы жизненного цикла заявления (значение хранится в БД)."""
|
||
|
||
DRAFT = "draft", "Черновик"
|
||
PENDING = "pending", "На рассмотрении"
|
||
APPROVED = "approved", "Одобрено"
|
||
REJECTED = "rejected", "Отклонено"
|
||
CANCELLED = "cancelled", "Отменено"
|
||
|
||
|
||
FINAL_STATUS = {
|
||
RequestStatus.APPROVED,
|
||
RequestStatus.REJECTED,
|
||
RequestStatus.CANCELLED,
|
||
}
|