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">')
|
+ '</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 -->
|
"""Разворачивает вложенные циклы вида <!-- loop:users_loop --> ... <!-- loop_end -->
|
||||||
данными из item (список словарей). Используется для циклов внутри цикла ИС,
|
данными из item (список словарей) или из общего словаря циклов loops.
|
||||||
например пользователи ИС. Переменные внутри: {{user_fio}}, {{user_position}}."""
|
Используется для циклов внутри цикла ИС, например пользователи ИС,
|
||||||
|
а также для вложенных таблиц (показатели значимости внутри объекта КИИ).
|
||||||
|
Переменные внутри: {{user_fio}}, {{user_position}}, {{item.*}}."""
|
||||||
|
if loops is None:
|
||||||
|
loops = {}
|
||||||
result = template
|
result = template
|
||||||
for _ in range(20):
|
for _ in range(20):
|
||||||
m_start = LOOP_START.search(result)
|
m_start = LOOP_START.search(result)
|
||||||
@@ -321,6 +325,8 @@ def _expand_nested_loops(template: str, item: Dict) -> str:
|
|||||||
break
|
break
|
||||||
key = m_start.group(1)
|
key = m_start.group(1)
|
||||||
data = item.get(key)
|
data = item.get(key)
|
||||||
|
if not isinstance(data, list):
|
||||||
|
data = loops.get(key)
|
||||||
if not isinstance(data, list):
|
if not isinstance(data, list):
|
||||||
# Нет данных для вложенного цикла — удаляем блок целиком
|
# Нет данных для вложенного цикла — удаляем блок целиком
|
||||||
depth = 1
|
depth = 1
|
||||||
@@ -478,7 +484,7 @@ def expand_loops_in_zip(docx_path: str, loops: Dict[str, List[Dict]]) -> str:
|
|||||||
clone = template_clean
|
clone = template_clean
|
||||||
# Вложенные циклы (users_loop и т.п.) — разворачиваем ДО подстановки
|
# Вложенные циклы (users_loop и т.п.) — разворачиваем ДО подстановки
|
||||||
# обычных полей, чтобы {{user_fio}} внутри них не затёрлись алиасами
|
# обычных полей, чтобы {{user_fio}} внутри них не затёрлись алиасами
|
||||||
clone = _expand_nested_loops(clone, item)
|
clone = _expand_nested_loops(clone, item, loops)
|
||||||
for field, value in item.items():
|
for field, value in item.items():
|
||||||
if isinstance(value, list):
|
if isinstance(value, list):
|
||||||
continue # списки — данные вложенных циклов, не подставляем
|
continue # списки — данные вложенных циклов, не подставляем
|
||||||
|
|||||||
Reference in New Issue
Block a user