Высокая сложностьВысокий уровень

Тестовое задание по Python от компании PyShop

Тестовое задание для разработчика на python

У сети ресторанов доставки "ФорФар" есть множество точек, на которых готовятся заказы для клиентов.
Каждый клиент хочет вместе с заказом получить чек, содержащий детальную информацию о заказе.
Сотрудники кухни также хотят чек, чтобы в процессе готовки и упаковки заказа не забыть положить всё что нужно.
Наша задача помочь и тем и другим, написав сервис для генерации чеков.

Схема работы сервиса

  1. Сервис получает информацию о новом заказа, создаёт в БД чеки для всех принтеров точки указанной в заказе и ставит асинхронные задачи на генерацию PDF-файлов для этих чеков. Если у точки нет ни одного принтера - возвращает ошибку. Если чеки для данного заказа уже были созданы - возвращает ошибку.

  2. Асинхронный воркер с помощью wkhtmltopdf генерируют PDF-файл из HTML-шаблон. Имя файла должно иметь следущий вид <ID заказа>_<тип чека>.pdf (123456_client.pdf).
    Файлы должны хранится в папке media/pdf в корне проекта.

  3. Приложение опрашивает сервис на наличие новых чеков. Опрос происходит по следующему пути: сначала запрашивается список чеков которые уже сгенерированы для конкретного принтера, после скачивается PDF-файл для каждого чека и отправляется на печать.

Технические требования

  1. Сервис должен быть написан на python и Django

  2. База данных - PostgreSQL v9.6

  3. Для асинхронных задач использовать django_rq

  4. Все инфраструктурные вещи необходимые для сервиса (PostgreSQL, Redis, wkhtmltopdf) запускать в docker с помощью docker-compose, сам проект не нужно оборачивать в docker

  5. Помимо API, должна быть админка для обеих моделей, с возможностью фильтровать чеки по принтеру, типу и статусу

Примечания

  1. Вёрстка HTML-шаблонов для чеков лежит в репозитории в папке templates

  2. Для простоты работы с wkhtmltopdf стоит использовать docker-контейнер wkhtmltopdf

  3. Во время написания сервиса не стоит изобретать велосипеды, лучше взять что-то существующие

Модели

  1. Принтер (Printer). Каждый принтер печатает только свой тип чеков. Поле api_key принимает уникальные значения, по нему
    однозначно определяется принтер. Для этой модели должны быть fixtures (принтеры для обоих типов чеков для нескольких точек).
ПолеТипЗначениеОписание
nameCharFieldназвание принтера
api_keyCharFieldключ доступа к API
check_typeCharFieldkitchen|clientтип чека которые печатает принтер
point_idIntegerFieldточка к которой привязан принтер
  1. Чек (Check). Информация о заказе для каждого чека хранится в JSON, нет необходимости делать отдельные модели.
ПолеТипЗначениеОписание
printer_idForeignKeyпринтер
typeCharFieldkitchen|clientтип чека
orderJSONFieldинформация о заказе
statusCharFieldnew|rendered|printedстатус чека
pdf_fileFileFieldссылка на созданный PDF-файл

API

Описание доступных методов находится в файле api.yml (swagger-спецификация). Можно отрендерить через онлайн редактор или через соответствующий плагин для PyCharm или VSCode

Источник задания