fix: генерация циклов — вложенные циклы (показатели значимости внутри объекта КИИ) брали данные только из item; теперь используют общий словарь loops, документ больше не пустой

This commit is contained in:
LocoAgent
2026-08-05 13:52:29 +04:00
parent 28fa7edaa8
commit 136c58c948
+10 -4
View File
@@ -310,10 +310,14 @@ def _subst_var_xml(xml: str, var: str, val: str) -> str:
+ '</w:r><w:r><w:t xml:space="preserve">')
def _expand_nested_loops(template: str, item: Dict) -> str:
def _expand_nested_loops(template: str, item: Dict, loops: Dict = None) -> str:
"""Разворачивает вложенные циклы вида <!-- loop:users_loop --> ... <!-- loop_end -->
данными из item (список словарей). Используется для циклов внутри цикла ИС,
например пользователи ИС. Переменные внутри: {{user_fio}}, {{user_position}}."""
данными из item (список словарей) или из общего словаря циклов loops.
Используется для циклов внутри цикла ИС, например пользователи ИС,
а также для вложенных таблиц (показатели значимости внутри объекта КИИ).
Переменные внутри: {{user_fio}}, {{user_position}}, {{item.*}}."""
if loops is None:
loops = {}
result = template
for _ in range(20):
m_start = LOOP_START.search(result)
@@ -321,6 +325,8 @@ def _expand_nested_loops(template: str, item: Dict) -> str:
break
key = m_start.group(1)
data = item.get(key)
if not isinstance(data, list):
data = loops.get(key)
if not isinstance(data, list):
# Нет данных для вложенного цикла — удаляем блок целиком
depth = 1
@@ -478,7 +484,7 @@ def expand_loops_in_zip(docx_path: str, loops: Dict[str, List[Dict]]) -> str:
clone = template_clean
# Вложенные циклы (users_loop и т.п.) — разворачиваем ДО подстановки
# обычных полей, чтобы {{user_fio}} внутри них не затёрлись алиасами
clone = _expand_nested_loops(clone, item)
clone = _expand_nested_loops(clone, item, loops)
for field, value in item.items():
if isinstance(value, list):
continue # списки — данные вложенных циклов, не подставляем