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

-
Сервис получает информацию о новом заказа, создаёт в БД чеки для всех принтеров точки указанной в заказе и ставит асинхронные задачи на генерацию PDF-файлов для этих чеков. Если у точки нет ни одного принтера - возвращает ошибку. Если чеки для данного заказа уже были созданы - возвращает ошибку.
-
Асинхронный воркер с помощью wkhtmltopdf генерируют PDF-файл из HTML-шаблон. Имя файла должно иметь следущий вид <ID заказа>_<тип чека>.pdf (123456_client.pdf).
Файлы должны хранится в папке media/pdf в корне проекта. -
Приложение опрашивает сервис на наличие новых чеков. Опрос происходит по следующему пути: сначала запрашивается список чеков которые уже сгенерированы для конкретного принтера, после скачивается PDF-файл для каждого чека и отправляется на печать.
Технические требования
-
Сервис должен быть написан на python и Django
-
База данных - PostgreSQL v9.6
-
Для асинхронных задач использовать django_rq
-
Все инфраструктурные вещи необходимые для сервиса (PostgreSQL, Redis, wkhtmltopdf) запускать в docker с помощью docker-compose, сам проект не нужно оборачивать в docker
-
Помимо API, должна быть админка для обеих моделей, с возможностью фильтровать чеки по принтеру, типу и статусу
Примечания
-
Вёрстка HTML-шаблонов для чеков лежит в репозитории в папке templates
-
Для простоты работы с wkhtmltopdf стоит использовать docker-контейнер wkhtmltopdf
-
Во время написания сервиса не стоит изобретать велосипеды, лучше взять что-то существующие
Модели
- Принтер (Printer). Каждый принтер печатает только свой тип чеков. Поле api_key принимает уникальные значения, по нему
однозначно определяется принтер. Для этой модели должны быть fixtures (принтеры для обоих типов чеков для нескольких точек).
| Поле | Тип | Значение | Описание |
|---|---|---|---|
| name | CharField | название принтера | |
| api_key | CharField | ключ доступа к API | |
| check_type | CharField | kitchen|client | тип чека которые печатает принтер |
| point_id | IntegerField | точка к которой привязан принтер |
- Чек (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