-
Notifications
You must be signed in to change notification settings - Fork 5
Kanban
Канбан-доска для управления задачами проекта: drag & drop колонки, карточки с чеклистами, зависимости между задачами, дорожная карта Ганта.

Встроенная система управления задачами в стиле 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 (вкладки «Доска» / «Дорожная карта»).
Все эндпоинты находятся в 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"
}
}POST /admin/kanban/reorder
Authorization: Bearer <jwt_token>
Content-Type: application/json
{
"task_id": 1,
"new_status": "in_progress",
"new_position": 0
}| Роль | Доступ |
|---|---|
| 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 (бейдж статуса)