Переработка механизма отчётов. ReportEngine
Описание
На текущий момент отчётность в НОКе реализована на базе собственного модуля SimpleReport
на базе приложения Django. Модуль позволяет решать задачу вывода отчёта в виде HTML, с конвертацией в PDF или CSV в интерфейсе пользователя. Обладает несколькими недостатками:
- Интеграция с приложениями
application
джанго не позволяет использовать отчёты вне сервисаweb
- Ограниченный набор форматов итоговых документов:
html
иcsv
- Сложность реализации
REST API
для работы с отчётами из внешних источников (по ссылке и пр.) - Невозможность расширения отчётов пользователем - требуется написание
web
приложения - Сложность реализации отчётов по расписанию - поскольку модуль встроен в
Application
- Отчёты строятся в сервис
web
что не всегда хорошо с точки зрения работоспособности, поскольку основная задачаweb
это поддержкаAPI
пользовательского интерфейса - Сложность с тестированием работоспособности отчётов - написания тестов
Поэтому возникла потребность реализации отдельного механизма отчётов - ReportEngine
, который должен решить решить следующие задачи:
- В качестве источников данных использовать
Datasource
#1789 (closed) - Поддержка разнообразных выходных форматов документов с возможностью расширения, например:
xlsx
,pdf
,docx
и другие - Поддержка пользовательских шаблонов документов
- Настройка отчётов через интерфейс пользователя (
UI
) - Использование тестов в системе (
pytest
) для проверки работоспособности - Реализация сервиса отчётов
Report Service
для предоставленияREST API
по работе с отчётами
В текущей реализации SimpleReport
модуль отчёта описывает источник данных и формат документа. Разумным выглядит подход по разделению механизма источника данных и формирование документа. Источники данных описаны в #1789 (closed) а для формирования документа предусмотреть отдельный модуль. Это позволит отделить механизм работы с данными и подготовки документа. Следующим шагом необходим связующий элемент, с одной стороны которого данные, а с другой шаблон. Поиск информации привёл к билиотеке yarg в которой подсмотрен DataBand ближайший аналог это секция отчёта (Report Section
).
DataBand (Report Section) это некий именованный участок шаблона, связанный с источником данных. Когда шаблонизатор (в терминах yarg
- Formatter
) обнаруживает в шаблоне DataBand
он вставляет в него данные из источника. При таком подходе от пользователя требуется только подготовка шаблона (template
) документа в любом требуемом редакторе, а задача системы разместить данных в указанных частях шаблона.
DataBand
ограничен рамками одного отчёта и не пересекается с другими.
Предложение
Для выполнение задачи понадобится описать:
- Механизм источников данных: описан в #1789 (closed)
- Класс
DataBand
(илиReportSection
) - Класс форматтера
Formatter
- на входеDataBand
и формат, на выходе сформированный документ (Document
) - Класс
ReportEngine
- на входе описание отчёта и пользовательские параметры. На выходе сформированный документа (Document
)
Задачи
-
Секции и SectionData
(BandData
) -
Базовый класс отчёта ( Report class ) -
Классы для форматирования: Formatter csv
-
html
- использоватьJinja
-
table
- портироватьSimpleReport
-
xlsx
-openpyxl
-
Тесты -
Настройки отчётов (модель + UI) Сервисы отчётов-
Перевод существующих отчётов в настройки -
Вывод отчётов из настроек в дерево навигации