Проект YaMDb собирает отзывы (Review) пользователей на произведения (Titles). Произведения делятся на категории: «Книги», «Фильмы», «Музыка». Список категорий (Category) может быть расширен администратором (например, можно добавить категорию «Изобразительное искусство» или «Ювелирка»).
Сами произведения в YaMDb не хранятся, здесь нельзя посмотреть фильм или послушать музыку.
В каждой категории есть произведения: книги, фильмы или музыка. Например, в категории «Книги» могут быть произведения «Винни-Пух и все-все-все» и «Марсианские хроники», а в категории «Музыка» — песня «Давеча» группы «Насекомые» и вторая сюита Баха.
Произведению может быть присвоен жанр (Genre) из списка предустановленных (например, «Сказка», «Рок» или «Артхаус»). Новые жанры может создавать только администратор.
Благодарные или возмущённые пользователи оставляют к произведениям текстовые отзывы (Review) и ставят произведению оценку в диапазоне от одного до десяти (целое число); из пользовательских оценок формируется усреднённая оценка произведения — рейтинг (целое число). На одно произведение пользователь может оставить только один отзыв.
Техническое описание проекта YaMDb
Вам доступен репозиторий api_yamdb
, в нём сохранён пустой Django-проект.
К проекту по адресу http://127.0.0.1:8000/redoc/
подключена документация API YaMDb. В ней описаны возможные запросы к API и структура ожидаемых ответов. Для каждого запроса указаны уровни прав доступа: пользовательские роли, которым разрешён запрос.
Ваша задача — написать бэкенд проекта (приложение reviews) и API для него (приложение api) так, чтобы они полностью соответствовали документации.
Обязательно заполните описание проекта в файле README.md.
Пользовательские роли
- Аноним — может просматривать описания произведений, читать отзывы и комментарии.
- Аутентифицированный пользователь (
user
) — может читать всё, как и Аноним, может публиковать отзывы и ставить оценки произведениям (фильмам/книгам/песенкам), может комментировать отзывы; может редактировать и удалять свои отзывы и комментарии, редактировать свои оценки произведений. Эта роль присваивается по умолчанию каждому новому пользователю. - Модератор (
moderator
) — те же права, что и у Аутентифицированного пользователя, плюс право удалять и редактировать любые отзывы и комментарии. - Администратор (
admin
) — полные права на управление всем контентом проекта. Может создавать и удалять произведения, категории и жанры. Может назначать роли пользователям. - Суперюзер Django должен всегда обладать правами администратора, пользователя с правами
admin
. Даже если изменить пользовательскую роль суперюзера — это не лишит его прав администратора. Суперюзер — всегда администратор, но администратор — не обязательно суперюзер.
Алгоритм регистрации пользователей
- Для добавления нового пользователя нужно отправить POST-запрос с параметрами
email
иusername
на эндпоинт/api/v1/auth/signup/
. - Сервис YaMDB отправляет письмо с кодом подтверждения (
confirmation_code
) на указанный адресemail
. - Пользователь отправляет POST-запрос с параметрами
username
иconfirmation_code
на эндпоинт/api/v1/auth/token/
, в ответе на запрос ему приходитtoken
(JWT-токен).
В результате пользователь получает токен и может работать с API проекта, отправляя этот токен с каждым запросом.После регистрации и получения токена пользователь может отправить PATCH-запрос на эндпоинт /api/v1/users/me/
и заполнить поля в своём профайле (описание полей — в документации).
Если пользователя создаёт администратор, например, через POST-запрос на эндпоинт api/v1/users/
— письмо с кодом отправлять не нужно (описание полей запроса для этого случая — в документации).
Ресурсы API YaMDb
- Ресурс auth: аутентификация.
- Ресурс users: пользователи.
- Ресурс titles: произведения, к которым пишут отзывы (определённый фильм, книга или песенка).
- Ресурс categories: категории (типы) произведений («Фильмы», «Книги», «Музыка»).
- Ресурс genres: жанры произведений. Одно произведение может быть привязано к нескольким жанрам.
- Ресурс reviews: отзывы на произведения. Отзыв привязан к определённому произведению.
- Ресурс comments: комментарии к отзывам. Комментарий привязан к определённому отзыву.
Каждый ресурс описан в документации: указаны эндпоинты (адреса, по которым можно сделать запрос), разрешённые типы запросов, права доступа и дополнительные параметры, если это необходимо.
Связанные данные и каскадное удаление
При удалении объекта пользователя User должны удаляться все отзывы и комментарии этого пользователя (вместе с оценками-рейтингами).
При удалении объекта произведения Title должны удаляться все отзывы к этому произведению и комментарии к ним.
При удалении объекта отзыва Review должны быть удалены все комментарии к этому отзыву.
При удалении объекта категории Category не нужно удалять связанные с этой категорией произведения.
При удалении объекта жанра Genre не нужно удалять связанные с этим жанром произведения.
База данных
В репозитории с заданием, в директории /api_yamdb/static/data
, подготовлены несколько файлов в формате csv
с контентом для ресурсов Users, Titles, Categories, Genres, Review и Comments. Тестировать пустой проект будет неудобно, а наполнять его руками — долго.
После того как вы подготовите модели, заполните базу данных контентом из приложенных csv-файлов.
«Закинь данные из CSV в БД» — достаточно распространённая задача. Этот опыт вам обязательно пригодится в дальнейшей работе — и в реальной практике данные могут быть небезупречны: например, в таблице будут пропущены какие-то обязательные значения; эти данные менеджер у себя в эксельке набивал, откуда ему знать.
Распределение задач в команде
Мы предлагаем распределить работу между участниками таким образом:
- Первый разработчик пишет всю часть, касающуюся управления пользователями (Auth и Users): систему регистрации и аутентификации, права доступа, работу с токеном, систему подтверждения через e-mail.
- Второй разработчик пишет категории (Categories), жанры (Genres) и произведения (Titles): модели, представления и эндпойнты для них.
- Третий разработчик занимается отзывами (Review) и комментариями (Comments): описывает модели, представления, настраивает эндпойнты, определяет права доступа для запросов. Рейтинги произведений тоже достаются третьему разработчику.
Это только наши рекомендации, вы можете распределить работу как-то иначе.
Подсказки
- Встроенная модель
User
может оказаться неудобной для реализации ТЗ проекта. Вам пригодятся знания о кастомизации этой модели. - Работу с пользователями и токенами в API не всегда удобно доверять внешним библиотекам, таким как Djoser. Возможности, которые они дают, иногда оказываются избыточными. Опишите работу с JWT-токенами самостоятельно. Официальная документация вам поможет.
- Для обновления access-токена не нужно применять refresh-токен и дополнительный эндпоинт. Токен должен обновляться через повторную передачу
username
и кода подтверждения. - Используйте вьюсеты везде, где это возможно и оправдано. При необходимости не бойтесь миксовать их с view-функциями или view-классами: это допустимо.
- Залить данные из файлов
csv
в базу данных можно несколькими способами:- можно импортировать данные средствами SQLite; нужную команду ищите здесь;
- можно написать скрипт, применив библиотеку csv.
Для загрузки данных, получаемых вместе с проектом, хорошей практикой будет написать собственную management-команду, добавляющую данные в БД через Django ORM.
Примеры создания management-команд можно подсмотреть в официальной документации.
Архив с готовым проектом: