/NL_Continent_test_task

NL_Continent_test_task

Primary LanguagePython

NL_Continent_test_task

NL_Continent_test_task

Техническое задание

Условия

  1. Дана модель предметной области с сущностями:
    • Страница (Page)
    • Контент типа видео (Video)
      • специфичные атрибуты: ссылка на видеофайл, ссылка на файл субтитров
    • Контент типа аудио (Audio)
      • специфичные атрибуты: поле для хранения текста произвольной длинны
  2. Нужно учитывать, что специфичные атрибуты разных видов контента существенно различаются.
  3. У всех видов контента присутствует атрибут "счетчик просмотров" (counter).
  4. У всех видов контента и страниц есть атрибут "заголовок" (title).
  5. Со страницей может быть связан любой вид контента в любом количестве. Семантика такая: "на страницу можно выложить любой вид контента в любом количистве". Например: на странице может быть 5 видео, 3 аудио и 7 текстов в любом порядке и в перемешку.
    • Следует учитывать, что в будущем виды контента могут добавляться и функционал должен легко расширятся.

Функциональные требования

  1. Сделать API для получения списка всех страниц.
    • Должна поддерживаться пагинация (постраничная выдача результатов)
    • В ответе должен содержаться URL на API с детальной информацией о странице (пункт №2).
  2. Сделать API ля получения детальной информации о странице
    • Помимо атрибутов страницы в ответе должны содержатся все привязанные к странице объекты контента в виде вложенной структуры-упорядоченого списка привязанных к странице объектов контента со всеми атрибутами, включая специфичные.
  3. При обращении к API с деталями о странице счетчик просмотров каждого объекта контента, привязанного к странице должен увеличится на единицу.
    • Нагрузка на данное API предполагается существенная, поэтому желательно непосредственно изменение данных в БД реализовать в фоновой задаче.
    • Важно обратить внимание, что увеличение счетчика должно происходить строго атомарно. То есть, если две задачи паралельно обновляют счетчик одного объекта, то на выходе всегда должно получится "+2".
  4. Заведение страниц и привязка к ним контента должна выполнятся через админку.
    • Должен поддерживаться поиск по заголовку (title) страниц и контента (по частичному совпадению от начала).
    • Желательно для удобства реализовать привязку и управление контентом на странице в виде inline-блоков в разделе управления страницей (Page) в админке.
    • Желательно, чтобы была возможность задавать порядок выдачи в API объектов, привязанных к странице.

Разворачивание проекта

Клонируем проект

  git clone https://github.com/KorsakovPV/NL_Continent_test_task

Создаем виртуальное окружение

  python -m venv venv

Активируем виртуальное окружение

  source venv/bin/activate 

Устанавливаем зависимости

  pip install -r requirements.txt 

Применяем миграции

  python manage.py migrate

Создаем суперпользователя

  python manage.py createsuperuser

Запуск Redis

  sudo docker run -p 6379: 6379 --name some-redis -d redis

Запуск Celery из папки mysite/mysite

  celery -A mysite worker -l INFO -f logfile.log

Запускаем Django Application

  python manage.py runserver

Добавляем в админке сущности

  http://127.0.0.1:8000/admin/

Проверяем работу метода list и retrieve

  http://127.0.0.1:8000/page/

Проходим по ссылке в результатах и проверяем работу метода retrieve. При каждом вызове значение counter увеличивается.