Skip to content

Latest commit

 

History

History
61 lines (45 loc) · 5.67 KB

README.md

File metadata and controls

61 lines (45 loc) · 5.67 KB

Тестовое задание для разработчика на 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 (принтеры для обоих типов чеков для нескольких точек).
Поле Тип Значение Описание
name CharField название принтера
api_key CharField ключ доступа к API
check_type CharField kitchen|client тип чека которые печатает принтер
point_id IntegerField точка к которой привязан принтер
  1. Чек (Check). Информация о заказе для каждого чека хранится в JSON, нет необходимости делать отдельные модели.
Поле Тип Значение Описание
printer_id ForeignKey принтер
type CharField kitchen|client тип чека
order JSONField информация о заказе
status CharField new|rendered|printed статус чека
pdf_file FileField ссылка на созданный PDF-файл

API

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