fix: пустой временный файл при отсутствии циклов в шаблоне (Package not found)

expand_loops_in_zip возвращал путь к пустому tmp-файлу, если в шаблоне
не было маркеров <!-- loop:... -->. python-docx падал с
'Package not found'. Теперь при отсутствии циклов возвращается
исходный шаблон, tmp удаляется. Тесты: без циклов, с циклом,
вложенные циклы — всё ок.
This commit is contained in:
2026-08-03 09:28:45 +04:00
parent 12df5f106c
commit 28ac7f69ab
+12
View File
@@ -86,6 +86,7 @@ def expand_loops_in_zip(docx_path: str, loops: Dict[str, List[Dict]]) -> str:
tmp = tempfile.NamedTemporaryFile(delete=False, suffix='.docx') tmp = tempfile.NamedTemporaryFile(delete=False, suffix='.docx')
tmp.close() tmp.close()
wrote = False # была ли хоть одна запись в tmp
max_passes = 30 max_passes = 30
for _ in range(max_passes): for _ in range(max_passes):
# Читаем ВСЕ файлы из исходного ZIP # Читаем ВСЕ файлы из исходного ZIP
@@ -144,6 +145,7 @@ def expand_loops_in_zip(docx_path: str, loops: Dict[str, List[Dict]]) -> str:
with zipfile.ZipFile(tmp.name, 'w', zipfile.ZIP_DEFLATED) as z: with zipfile.ZipFile(tmp.name, 'w', zipfile.ZIP_DEFLATED) as z:
for name, data in all_files.items(): for name, data in all_files.items():
z.writestr(name, data) z.writestr(name, data)
wrote = True
continue continue
# Извлекаем шаблон (всё между start и end маркерами) # Извлекаем шаблон (всё между start и end маркерами)
@@ -170,6 +172,16 @@ def expand_loops_in_zip(docx_path: str, loops: Dict[str, List[Dict]]) -> str:
with zipfile.ZipFile(tmp.name, 'w', zipfile.ZIP_DEFLATED) as z: with zipfile.ZipFile(tmp.name, 'w', zipfile.ZIP_DEFLATED) as z:
for name, data in all_files.items(): for name, data in all_files.items():
z.writestr(name, data) z.writestr(name, data)
wrote = True
if not wrote:
# Циклов в шаблоне не было — возвращаем исходный файл,
# пустой временный удаляем (иначе python-docx упадёт с Package not found)
try:
os.unlink(tmp.name)
except Exception:
pass
return docx_path
return tmp.name return tmp.name