fix: генерация циклов — вложенные циклы (показатели значимости внутри объекта КИИ) брали данные только из item; теперь используют общий словарь loops, документ больше не пустой
This commit is contained in:
+10
-4
@@ -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 # списки — данные вложенных циклов, не подставляем
|
||||
|
||||
Reference in New Issue
Block a user