Проект YaMDb

Проект 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. Даже если изменить пользовательскую роль суперюзера — это не лишит его прав администратора. Суперюзер — всегда администратор, но администратор — не обязательно суперюзер.

Алгоритм регистрации пользователей

  1. Для добавления нового пользователя нужно отправить POST-запрос с параметрами email и username на эндпоинт /api/v1/auth/signup/.
  2. Сервис YaMDB отправляет письмо с кодом подтверждения (confirmation_code) на указанный адрес email.
  3. Пользователь отправляет 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 с контентом для ресурсов UsersTitlesCategoriesGenresReview и 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-команд можно подсмотреть в официальной документации.

Архив с готовым проектом:





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: