Jinja-шаблоны постобработки сводок
Jinja-шаблоны постобработки сводок¶
В настройке типа сводки доступно поле «Jinja-шаблон обработки данных» (раздел «Тонкая настройка»). Если оно заполнено, данные сводки после первого этапа извлечения пропускаются через Jinja2-шаблон: можно переформатировать значения, досчитать производные поля, почистить лишнее — до сохранения в сводку. Аналогичное поле в секции «Дополнительная обработка» (двухэтапная обработка) применяется к данным после второго этапа.
Для специалистов
Шаблон — это код на Jinja2. Ошибка в шаблоне помечает обработку сводки ошибкой рендеринга (RenderError), сами данные при этом не теряются: исправьте шаблон и запустите обработку повторно.
Что доступно в шаблоне¶
| Переменная | Что содержит |
|---|---|
data |
Список строк сводки (Python-список словарей) — данные этапа извлечения после приведения к типам полей |
obj |
Объект RelationWalker текущей сделки — доступ к полям сделки, компании, контакта и связям, как в генераторе документов |
localtime |
Текущее локальное время (datetime с таймзоной) |
current_date |
Сегодняшняя дата (date) |
current_datetime |
Текущие дата и время (naive datetime) |
relativedelta |
dateutil.relativedelta — «человеческая» арифметика дат: месяцы, годы |
timedelta |
datetime.timedelta — сдвиги в днях, часах, минутах |
Доступны фильтры: |date, |chain_from_iterable, |render_phones, |render_emails, |tz_to_naive, |tz_to_aware, |tz_to.
Фильтр |inline_image и дескриптор aidocs24_image в шаблонах сводок не регистрируются — встраивание изображений работает только в DOCX-генерации.
Порядок обработки и требование к результату¶
Обработка сводки идёт по цепочке: извлечение ИИ → приведение к типам полей → Jinja-шаблон → (дополнительная обработка → её Jinja-шаблон) → обогащения (Дадата по ИНН, адреса) → сохранение.
Шаблон получает на вход уже нормализованные данные: значения приведены к типам полей настройки, отсутствующие поля добавлены как null, а ключи, которых нет в настройке типа, удалены с фиксацией в ошибках валидации («лишнее поле — удалено»).
Шаблон обязан вернуть валидный JSON-массив (список строк сводки). Результат разбирается json.loads; не-массив или битый JSON — ошибка рендеринга, данные не сохраняются. Фильтр |tojson подходит для сериализации: он использует DjangoJSONEncoder, поэтому даты, время и Decimal сериализуются корректно.
Арифметика дат: relativedelta и timedelta¶
Для вычисления сроков в шаблоне доступны обе функции. Пример: пересобрать строки, оставив нужные ключи и добавив срок оплаты +30 дней от текущей даты:
{% set ns = namespace(rows=[]) %}
{% for row in data %}
{% set ns.rows = ns.rows + [{
'contract': row.contract,
'amount': row.amount,
'payment_due': current_date + timedelta(days=30),
}] %}
{% endfor %}
{{ ns.rows | tojson }}
relativedelta удобнее для календарных сдвигов — «+2 месяца» останется «+2 месяца» даже в коротком месяце:
{% set deadline = current_date + relativedelta(months=2, days=5) %}
Поведение лишних полей при чтении сводок¶
Когда готовые сводные данные читаются обратно — в шаблонах генератора документов (obj.entities(...), obj.entity(...)) или агрегирующими сводками, анализирующими другие сводные таблицы, — они проходят через приведение типов в режиме сохранения неизвестных полей:
- значения полей, описанных в настройке типа сводки, приводятся к своим типам (дата, число и т.д.);
- неизвестные ключи — которых нет в настройке типа — сохраняются как есть, без приведения и без удаления.
Поэтому ключи, добавленные после этапа извлечения — обогащениями (например, <имя_поля>_fssp / <имя_поля>_court у типа поля «Адрес + ФССП и суды») — доступны в шаблонах документов и агрегатах, а не отбрасываются.
Где настроить¶
- Приложение AI Документы → раздел Сводки → тип сводки.
- Блок «Тонкая настройка» → поле «Jinja-шаблон обработки данных» (первый этап).
- Для двухэтапной обработки — блок «Дополнительная обработка» → «Jinja-шаблон обработки данных при дополнительной обработке» (применяется после второго этапа).
Импортированные типы из библиотеки
У типа сводки, импортированного из библиотеки, шаблоны принадлежат оригиналу: поля недоступны для редактирования, при обновлении типа из библиотеки значения переносятся из оригинала. Чтобы поменять постобработку — сначала перенесите тип в собственную копию.