🏗️ Капстоун C — Task Manager / Project Tracker REST API

📁 Серия: Капстоун C (Флагман) 🔧 Стек: Django 5 · DRF 3.15+ · SimpleJWT 5 · drf-spectacular 📊 Этапов: 12 шагов
#django #drf #jwt #rest-api #permissions #сигналы #swagger #капстоун

⚡ Кратко: что строим

Task Manager API — полноценный REST API управления проектами и задачами с командами, JWT-аутентификацией и уведомлениями. Флагманский сквозной проект, связывающий весь курс.

  • Стек: Django 5.x · DRF 3.15+ · djangorestframework-simplejwt 5.x · drf-spectacular
  • Сущности: User (кастомная), Project, Task, Comment; полные CRUD-операции
  • Закрывает: callout-verify из уроков 26, 29, 31, 33, 36, 38, 40–45 (DRF, JWT, permissions, сигналы, пагинация, логирование)

Время прохождения: ~10–12 часов (12 этапов по 45–60 минут каждый).

📖 О проекте

Task Manager / Project Tracker REST API — backend-сервис для управления проектами и задачами в командной работе. Пользователи создают проекты, добавляют в них участников, заводят задачи, назначают исполнителей и оставляют комментарии. Типичная база для Trello-подобных систем, корпоративных трекеров и agile-инструментов.

Это флагманская серия — она связывает весь курс Python Advanced в один реальный проект. Здесь вы увидите, как DRF, JWT, permissions, сигналы и документация Swagger работают вместе в production-grade приложении.

Что закрывает этот капстоун

В ходе основного курса ряд тем был помечен callout-verify — сложные места, требующие практики в реальном проекте. Данная серия закрывает:

  • Урок 26, Урок 29, Урок 33, Урок 36 — DRF: сериализаторы, generic views, ViewSets, soft-delete, транзакции (этапы 05, 06, 11)
  • Урок 33, Урок 38 — query_params, фильтрация, пагинация, логирование (этапы 07, 11)
  • Урок 40, Урок 42, Урок 44 — аутентификация, permissions, JWT (этапы 08, 09)
  • Урок 42, Урок 45 — сигналы post_save + email-уведомления (этап 10)

Технологический стек

Django 5.x Веб-фреймворк, ORM, Admin, миграции
DRF 3.15+ ModelSerializer, ViewSet, Router, Permissions
SimpleJWT 5.x JWT-аутентификация: access + refresh токены
drf-spectacular Автогенерация OpenAPI 3 / Swagger UI
django-filter Фильтрация QuerySet через URL-параметры
django-environ 12-factor конфигурация через .env
SQLite / PostgreSQL SQLite для dev, PostgreSQL рекомендуется для prod

🗄️ Схема данных

Проект строится вокруг четырёх сущностей:

МодельПриложениеКлючевые поляСвязи
User apps/users/ email (USERNAME_FIELD), username, bio, avatar Базовый AbstractUser; используется во всех FK/M2M
Project apps/projects/ name, description, owner (FK User), created_at, is_active FK → User (owner), M2M → User (members через members)
Task apps/tasks/ title, description, project (FK), assignee (FK User), status, priority, due_date, is_deleted FK → Project, FK → User (assignee)
Comment apps/tasks/ task (FK), author (FK User), text, created_at FK → Task, FK → User (author)

📋 Этапы серии

Каждый этап продолжает проект предыдущего. Проходить строго по порядку.

01

Структура и настройка

Создаём venv, устанавливаем Django 5 + DRF, описываем структуру apps/, настраиваем settings.py через django-environ, добавляем rest_framework в INSTALLED_APPS.

⏱️ ~30 мин 📄 config/settings.py · manage.py · requirements.txt
02

БД и кастомная модель User

Создаём apps/users/, пишем кастомный User на базе AbstractUser, устанавливаем AUTH_USER_MODEL ДО первой миграции. Запускаем migrate, создаём суперпользователя.

⏱️ ~35 мин 📄 apps/users/models.py · config/settings.py
03

Модели Project, Task, Comment

Создаём apps/projects/ и apps/tasks/, описываем все модели с FK/M2M, Meta, TextChoices, миграции.

⏱️ ~45 мин 📄 apps/projects/models.py · apps/tasks/models.py
04

Админка: ModelAdmin и inline

Регистрируем все модели в Admin, настраиваем list_display, search_fields, list_filter. Добавляем TaskInline в ProjectAdmin. Пишем кастомный action.

⏱️ ~35 мин 📄 apps/projects/admin.py · apps/tasks/admin.py · apps/users/admin.py
05

DRF Сериализаторы

Пишем ModelSerializer для всех моделей. Вложенные сериализаторы, validate_ / validate(), read_only_fields, сериализатор регистрации User.

⏱️ ~50 мин 📄 apps/tasks/serializers.py · apps/projects/serializers.py · apps/users/serializers.py
06

ViewSets, Router и CRUD

Реализуем ModelViewSet для Project, Task, Comment. Подключаем DefaultRouter, регистрируем маршруты. Базовый CRUD проверяется через curl.

⏱️ ~50 мин 📄 apps/tasks/views.py · apps/tasks/urls.py · apps/projects/views.py · apps/projects/urls.py · config/urls.py
07

Фильтрация, сортировка, пагинация

django-filter: фильтрация задач по статусу, проекту, исполнителю. OrderingFilter. PageNumberPagination + LimitOffsetPagination.

⏱️ ~45 мин 📄 apps/tasks/filters.py · apps/tasks/views.py · config/settings.py
08

JWT-аутентификация

SimpleJWT: регистрация, логин (получение access/refresh), обновление токена. Настройка httpOnly-куки (best practice). Защищаем эндпоинты.

⏱️ ~50 мин 📄 apps/users/views.py · apps/users/urls.py · config/settings.py
09

Object-level permissions

Кастомные permissions: IsProjectOwner, IsProjectMemberOrOwner, IsTaskAssigneeOrOwner. Object-level проверки в ViewSet.

⏱️ ~45 мин 📄 apps/core/permissions.py · apps/tasks/views.py · apps/projects/views.py
10

Сигналы и email-уведомления

Сигнал post_save на Task → email исполнителю при назначении. Django console email backend для разработки. Подключение через apps.py.

⏱️ ~40 мин 📄 apps/tasks/signals.py · apps/tasks/apps.py
11

Логирование, ошибки, soft-delete

Python logging в Django, кастомный exception handler DRF. Soft-delete для Task через is_deleted + кастомный QuerySet. Транзакции atomic().

⏱️ ~50 мин 📄 apps/tasks/managers.py · apps/core/exceptions.py · config/settings.py
12

Swagger и финал

drf-spectacular: настройка, @extend_schema, Swagger UI. Базовые тесты через APITestCase. Финальный Postman-прогон. Деплой-заметки.

⏱️ ~60 мин 📄 config/urls.py · tests/ · config/settings.py

📚 Что понадобится

Пройдите весь основной курс (46 уроков), особенно:
  • Уроки 13–16 — Django ORM, модели, миграции
  • Уроки 19, 22, 24 — Django Admin, queryset оптимизация
  • Уроки 26, 29, 33, 36 — DRF основы: сериализаторы, generic views, ViewSets
  • Уроки 40–45 — Auth: сессии, permissions, JWT, сигналы
  • Python 3.10+, pip, venv установлены
  • Git (базовые команды)
  • Postman или curl для тестирования API
Рекомендуем пройти капстоуны A и B перед этим: Капстоун A даст опыт работы с REST API, Капстоун B — с Django-проектом и миграциями. Этот капстоун предполагает уверенное знание обоих.

🚀 Как работать с серией

  1. Проходите этапы строго по порядку — каждый продолжает код предыдущего.
  2. Перед каждым этапом: прочитайте секцию «Цель» и «Затрагиваемые файлы».
  3. Над каждым блоком кода указан путь к файлу — не гадайте, куда писать.
  4. После каждого этапа: выполните шаги из раздела «Проверка» (curl / Postman).
  5. Все 12 этапов доступны. Проходите строго по порядку.
Архитектурное решение — структура apps/: Весь код бизнес-логики живёт в папке apps/. Каждое приложение — отдельная директория: apps/users/, apps/projects/, apps/tasks/. Настройки — в config/. Это распространённое соглашение в Django-сообществе, аналогичное паттерну из Капстоуна B.