Перейти к содержанию

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 у типа поля «Адрес + ФССП и суды») — доступны в шаблонах документов и агрегатах, а не отбрасываются.

Где настроить

  1. Приложение AI Документы → раздел Сводки → тип сводки.
  2. Блок «Тонкая настройка» → поле «Jinja-шаблон обработки данных» (первый этап).
  3. Для двухэтапной обработки — блок «Дополнительная обработка» → «Jinja-шаблон обработки данных при дополнительной обработке» (применяется после второго этапа).

Импортированные типы из библиотеки

У типа сводки, импортированного из библиотеки, шаблоны принадлежат оригиналу: поля недоступны для редактирования, при обновлении типа из библиотеки значения переносятся из оригинала. Чтобы поменять постобработку — сначала перенесите тип в собственную копию.