Сервис пользовательских опросов: создание опросов, прохождение, аналитика.
- Email: krishtopadenis@gmail.com
- Telegram: @thefoxdk
test-task-surveys.mp4
- Python 3.12, Django 5, DRF
- PostgreSQL, Docker Compose
- JWT (
djangorestframework-simplejwt) - OpenAPI (
drf-spectacular) - Типизация (
mypy,django-stubs), линтинг (ruff) - Пакетный менеджер —
uv
src/config— настройки Django (base,dev,prod)src/common— базовые абстракции (TimeStampedModel)src/users— модели и API идентификацийsrc/surveys— домен опросов, сервисы и API
Скопируйте .env.example → .env и заполните переменные.
make build # собрать образы
make up # поднять web + db
make migrate # применить миграцииСервис будет доступен на http://127.0.0.1:8000.
make up/make down— запустить/остановить проектmake restart— пересобрать контейнер webmake reset— остановить и удалить тома БДmake migrate/make makemigrationsmake shell— Django shell внутри контейнераmake show_urls— список URLов проектаmake lint—ruff checkmake format—ruff formatmake typecheck—mypyсо strict-настройками
POST /api/v1/auth/register— регистрация (email+password)POST /api/v1/auth/token— получение access/refresh токеновPOST /api/v1/auth/token/refresh— обновление access токенаPOST /api/v1/auth/logout— отзыв refresh (blacklist)
- Кто может создавать опросы: любой аутентифицированный пользователь (JWT).
- Кто видит/редактирует/удаляет свой опрос: только автор опроса.
- Реализовано через
IsSurveyAuthorна detail/статистике; список (/surveys/list) фильтруется по текущему пользователю.
- Реализовано через
- Кто может проходить опросы: любой аутентифицированный пользователь (не только автор).
- Удаление с ответами: если по опросу уже есть ответы, удаление отклоняется (вернётся 400).
Таким образом, автор управляет только своими опросами и видит их статистику, а остальные пользователи могут их проходить, но не модифицировать.
GET /api/v1/surveys/list— список опросов текущего автораPOST /api/v1/surveys/create— создать опросGET /api/v1/surveys/{id}— детальная информация (с вопросами и вариантами)PATCH /api/v1/surveys/{id}— обновление опроса и вложенных сущностейDELETE /api/v1/surveys/{id}— удаление (если нет ответов, иначе 409)- CRUD для вопросов/вариантов: вложенные маршруты
questions/иoptions/
GET /api/v1/surveys/{id}/runs/next-question— получить очередной вопрос для пользователя- Ответ 200:
{ run_id, question } - Если вопросов больше нет: 204 (прогон помечается завершённым)
- Ответ 200:
POST /api/v1/surveys/{id}/runs/answer— отправить выбранный вариант- Ответ 200:
{ run_id, completed, question|null }completed=falseи заполненныйquestion— есть следующий вопросcompleted=trueиquestion=null— опрос завершён, время зафиксировано
- Ответ 200:
GET /api/v1/surveys/{id}/stats — возвращает:
- total_runs
- avg_duration_seconds
- список вопросов с распределением ответов и топ-вариантом
make lint
make typecheckGET /api/v1/schema— JSON схемаGET /api/v1/docs— Swagger UI