From f5e9d3523d2f73ba280349ef53c1ec58f9058e3a Mon Sep 17 00:00:00 2001 From: DokoGen Date: Mon, 3 Aug 2026 10:34:05 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B8=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D0=B8=20=E2=80=94=20=D0=BF=D1=80=D0=B5=D0=B4=D1=81?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE,=20=D1=87=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=B1=D0=B5=D0=B7=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=20=D1=80=D0=BE=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Председатель/Секретарь/Заместитель — своей ролью - Первый обычный член получает «Члены комиссии», остальные — пустая роль - Пустая строка в цикле больше не превращается в «—» Проверено: 1 председатель + 4 члена в шаблоне «6. Акт...» --- dokogen/generator.py | 2 +- dokogen/variables.py | 51 +++++++++++++++++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/dokogen/generator.py b/dokogen/generator.py index 974fb20..f37ef42 100644 --- a/dokogen/generator.py +++ b/dokogen/generator.py @@ -235,7 +235,7 @@ def expand_loops_in_zip(docx_path: str, loops: Dict[str, List[Dict]]) -> str: for idx, item in enumerate(items, 1): clone = template_clean for field, value in item.items(): - val_str = str(value) if value else '—' + val_str = str(value) if value else ('—' if value is None else '') # С префиксом item. clone = clone.replace('{{item.%s}}' % field, val_str) # Без префикса (алиасы {{name}}, {{pd_list}}, {{document}} и т.д.) diff --git a/dokogen/variables.py b/dokogen/variables.py index 4b3aaa8..d9b1840 100644 --- a/dokogen/variables.py +++ b/dokogen/variables.py @@ -165,14 +165,42 @@ def build_replacements( return replacements +def _commission_role_display(members) -> List[str]: + """Группирует роли комиссии для вывода: + - Председатель/Секретарь/Заместитель — отдельной строкой со своей ролью; + - обычные члены — первый получает «Члены комиссии», остальные — пустую роль + (чтобы не повторять «Член комиссии» в каждой строке).""" + result = [] + member_used = False + for m in members: + role = (m.role or 'член комиссии').strip() + role_lower = role.lower() + if ('председател' in role_lower or 'секретар' in role_lower + or 'заместител' in role_lower or 'зам. председателя' in role_lower): + result.append(role) + continue + # обычный член комиссии + if not member_used: + result.append('Члены комиссии') + member_used = True + else: + result.append('') + return result + + def _build_commission_data(company: Company) -> Dict[str, str]: data = {} members = company.commission or [] + display_roles = _commission_role_display(members) lines = [] - for i, m in enumerate(members, 1): - role = m.role or 'член комиссии' - line = f"{i}. {role}: {m.position} — {m.fio}" if m.position else f"{i}. {role}: {m.fio}" + for i, (m, role_disp) in enumerate(zip(members, display_roles), 1): + if role_disp: + line = (f"{i}. {role_disp}: {m.position} — {m.fio}" if m.position + else f"{i}. {role_disp}: {m.fio}") + else: + line = (f"{i}. {m.position} — {m.fio}" if m.position + else f"{i}. {m.fio}") lines.append(line) data['commission_list'] = '\n'.join(lines) if lines else '—' @@ -202,13 +230,20 @@ def _build_loop_data(company: Company, is_list: List) -> Dict[str, List[Dict]]: # Комиссия members = company.commission or [] if members: + display_roles = _commission_role_display(members) items = [] - for m in members: + for m, role_disp in zip(members, display_roles): + pos = m.position or '—' + fio = m.fio or '—' + if role_disp: + full = f"{role_disp} {pos} — {fio}" if pos != '—' else f"{role_disp} — {fio}" + else: + full = f"{pos} — {fio}" if pos != '—' else fio items.append({ - 'role': m.role or 'член комиссии', - 'position': m.position or '—', - 'fio': m.fio or '—', - 'full': f"{m.role} {m.position} — {m.fio}" if m.position else f"{m.role} — {m.fio}", + 'role': role_disp, + 'position': pos, + 'fio': fio, + 'full': full, }) loops['commission'] = items