Skip to content
ShaerWare edited this page Mar 4, 2026 · 5 revisions

Kanban (Задачи)

Канбан-доска для управления задачами проекта: drag & drop колонки, карточки с чеклистами, зависимости между задачами, дорожная карта Ганта.

Скриншот

Kanban

Концепция

Встроенная система управления задачами в стиле Trello/Kanban. Позволяет:

  • Визуальное управление — перетаскивание карточек между колонками статусов
  • Приватные задачи — новые задачи создаются как черновики (draft) и видны только автору
  • Чеклисты — подзадачи внутри каждой карточки с отслеживанием выполнения
  • Зависимости — связи «блокирует / зависит от» между задачами
  • Дорожная карта — визуализация задач на временной шкале Ганта
  • Теги и назначение — фильтрация и группировка задач по ответственным и меткам

Статусы задач

Каждая задача проходит через 5 статусов (KanbanTaskStatus):

Статус Значение Описание
Draft draft Черновик — видна только автору, начальный статус при создании
To Do todo Запланирована — готова к работе
In Progress in_progress В работе — задача выполняется
Review review На проверке — ожидает ревью
Done done Выполнена — задача завершена

Новые задачи всегда создаются со статусом draft и флагом is_private=true. Чтобы задача появилась на общей доске, нужно сменить статус на todo и снять флаг приватности.

Канбан-доска

Визуальная доска с колонками по статусам (KanbanBoard.vue):

Функция Описание
Колонки по статусам Каждая колонка соответствует одному из 5 статусов
Drag & Drop Перетаскивание карточек между колонками меняет статус и позицию
Порядок карточек Внутри колонки задачи упорядочены по полю position
Автообновление Список задач обновляется при каждом действии

Перетаскивание карточки вызывает POST /admin/kanban/reorder с новым статусом и позицией.

Фронтенд-компоненты

Компонент Назначение
KanbanView.vue Основная страница — переключение между доской и дорожной картой
KanbanBoard.vue Доска с колонками и drag & drop
KanbanCard.vue Карточка задачи в колонке
KanbanCardDetail.vue Боковая панель с деталями задачи
KanbanTaskForm.vue Форма создания/редактирования задачи
KanbanRoadmap.vue Дорожная карта Ганта (временная шкала)
KanbanStatusBadge.vue Бейдж статуса с цветовой индикацией

Карточка задачи

Модель KanbanTask (таблица kanban_tasks):

Поле Тип Описание
id int Уникальный идентификатор
title string(500) Название задачи (обязательное)
description text Описание задачи (markdown)
status string(20) Статус: draft, todo, in_progress, review, done
is_private bool Приватная задача — видна только автору и админам (по умолчанию true)
assignee string(100) Ответственный (имя пользователя)
created_by string(100) Автор задачи
start_date string(10) Дата начала (формат YYYY-MM-DD)
due_date string(10) Дедлайн (формат YYYY-MM-DD)
position int Позиция в колонке для drag-reorder (по умолчанию 0)
tags JSON text Массив тегов в формате JSON (["backend", "urgent"])
created datetime Дата создания
updated datetime Дата последнего обновления

Видимость задач

  • Приватные задачи (is_private=true) — видны только автору (created_by) и администраторам
  • Публичные задачи (is_private=false) — видны всем пользователям
  • Endpoint GET /admin/kanban/tasks фильтрует задачи через get_visible_tasks(username, is_admin)

Чеклисты

Каждая задача может содержать список подзадач — чеклист. Модель KanbanChecklistItem (таблица kanban_checklist_items):

Поле Тип Описание
id int Уникальный идентификатор
task_id int FK на задачу (kanban_tasks.id)
text string(500) Текст пункта чеклиста
is_done bool Выполнен ли пункт (по умолчанию false)
position int Порядок в списке

Действия с чеклистом

Действие Endpoint Описание
Добавить пункт POST /admin/kanban/tasks/{task_id}/checklist Создаёт новый пункт чеклиста
Переключить PATCH /admin/kanban/checklist/{item_id}/toggle Отмечает/снимает галочку (is_done)
Удалить DELETE /admin/kanban/checklist/{item_id} Удаляет пункт

При удалении задачи все её пункты чеклиста удаляются каскадно (CASCADE).

Зависимости

Связи между задачами вида «блокирует / зависит от». Модель KanbanTaskDependency (таблица kanban_task_dependencies):

Поле Тип Описание
blocker_id int FK — задача-блокер (PK, kanban_tasks.id)
dependent_id int FK — зависимая задача (PK, kanban_tasks.id)

Составной первичный ключ: (blocker_id, dependent_id).

Правила

  • Задача blocker блокирует выполнение задачи dependent
  • Нельзя создать зависимость на приватную задачу другого пользователя (только автор и админ)
  • При попытке создать дублирующую зависимость — ошибка 409 Conflict
  • При удалении задачи все её зависимости удаляются каскадно (CASCADE)

Действия

Действие Endpoint Описание
Добавить POST /admin/kanban/dependencies Тело: {"blocker_id": 1, "dependent_id": 2}
Удалить DELETE /admin/kanban/dependencies Query-параметры: blocker_id=1&dependent_id=2

Дорожная карта Ганта

Визуализация задач на временной шкале (KanbanRoadmap.vue):

  • Горизонтальная ось — время (дни/недели)
  • Вертикальная ось — задачи
  • Отображаются только задачи с заданными start_date и/или due_date
  • Полоски окрашены в цвет статуса задачи
  • Зависимости между задачами показаны стрелками-связями

Доступ к дорожной карте — через переключатель вида в KanbanView.vue (вкладки «Доска» / «Дорожная карта»).

API эндпоинты

Все эндпоинты находятся в app/routers/kanban.py под префиксом /admin/kanban.

Метод Endpoint Описание Доступ
GET /admin/kanban/tasks Получить все видимые задачи Любой авторизованный
POST /admin/kanban/tasks Создать задачу (статус draft, is_private=true) Не гость
PATCH /admin/kanban/tasks/{task_id} Обновить задачу (не-админ — только свои) Не гость
DELETE /admin/kanban/tasks/{task_id} Удалить задачу Только admin
POST /admin/kanban/reorder Переместить задачу (статус + позиция) Не гость
POST /admin/kanban/dependencies Добавить зависимость между задачами Не гость
DELETE /admin/kanban/dependencies Удалить зависимость (query: blocker_id, dependent_id) Не гость
POST /admin/kanban/tasks/{task_id}/checklist Добавить пункт чеклиста Не гость
PATCH /admin/kanban/checklist/{item_id}/toggle Переключить состояние пункта чеклиста Не гость
DELETE /admin/kanban/checklist/{item_id} Удалить пункт чеклиста Не гость

Пример: создание задачи

POST /admin/kanban/tasks
Authorization: Bearer <jwt_token>
Content-Type: application/json

{
  "title": "Реализовать экспорт в CSV",
  "description": "Добавить кнопку экспорта в таблицу аудита",
  "assignee": "admin",
  "start_date": "2026-02-21",
  "due_date": "2026-02-28",
  "tags": ["backend", "feature"]
}

Пример ответа

{
  "task": {
    "id": 1,
    "title": "Реализовать экспорт в CSV",
    "description": "Добавить кнопку экспорта в таблицу аудита",
    "status": "draft",
    "is_private": true,
    "assignee": "admin",
    "created_by": "admin",
    "start_date": "2026-02-21",
    "due_date": "2026-02-28",
    "position": 0,
    "tags": "[\"backend\", \"feature\"]",
    "created": "2026-02-21T10:00:00",
    "updated": "2026-02-21T10:00:00"
  }
}

Пример: перемещение задачи (reorder)

POST /admin/kanban/reorder
Authorization: Bearer <jwt_token>
Content-Type: application/json

{
  "task_id": 1,
  "new_status": "in_progress",
  "new_position": 0
}

RBAC

Роль Доступ
admin Полный доступ: все задачи (включая приватные), создание, редактирование, удаление
user Создание задач, редактирование только своих задач, видимость — свои + публичные
web Аналогично user (вкладка Tasks доступна)
guest Только просмотр публичных задач, без создания и редактирования

Все действия по задачам (создание, обновление, удаление) записываются в аудит-лог через async_audit_logger.

Миграция

Для создания таблиц канбан-доски используется скрипт миграции:

python scripts/migrate_kanban.py

Скрипт создаёт 3 таблицы:

  • kanban_tasks — задачи
  • kanban_task_dependencies — зависимости между задачами
  • kanban_checklist_items — пункты чеклистов

Примечание: таблицы также автоматически создаются через Base.metadata.create_all при запуске приложения. Скрипт миграции нужен только при обновлении уже работающей системы.

Архитектура

app/routers/kanban.py (10 endpoints)
  -> modules/kanban/service.py (KanbanService)
    -> db/repositories/kanban.py (KanbanRepository)
      -> modules/kanban/models.py (KanbanTask, KanbanTaskDependency, KanbanChecklistItem)

Примечание: Синглтон kanban_service определён в modules/kanban/service.py. В db/integration.py доступен как async_kanban_manager (backward-compatible алиас).

Frontend:

admin/src/views/KanbanView.vue
  -> KanbanBoard.vue (drag & drop колонки)
     -> KanbanCard.vue (карточка задачи)
  -> KanbanCardDetail.vue (боковая панель)
  -> KanbanTaskForm.vue (форма создания/редактирования)
  -> KanbanRoadmap.vue (дорожная карта Ганта)
  -> KanbanStatusBadge.vue (бейдж статуса)

<- Chat | Telegram ->

Clone this wiki locally