From 353e7403d094913c23a158b480f1ac698e142e38 Mon Sep 17 00:00:00 2001 From: DokoGen Date: Mon, 3 Aug 2026 12:22:49 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=84?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B0=D1=82=20=D0=BE=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D0=B0=205.25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - clean_value не портит аббревиатуры/номера (АРМ №1, СКУД) - ПО: 'Названия программ...' → {{item.software}} - 'локальную сеть' → is_has_lan (поле is_local_network) - Цель обработки ПД — значение из объединённой ячейки (val_b) - Роли комиссии ищутся и в колонке E, и в Примечании (D) - Проверено на присланном опроснике: КПП, подразделение по безопасности, действия с ПДн, структура ИС — импортируются --- dokogen/importer.py | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/dokogen/importer.py b/dokogen/importer.py index a13c3f4..5f713f8 100644 --- a/dokogen/importer.py +++ b/dokogen/importer.py @@ -34,14 +34,19 @@ def clean_value(val): text = text.replace('\n', ' ').replace('\r', ' ') text = ' '.join(text.split()) # Приведение регистра: если текст содержит только заглавные буквы РУ + # НО не трогаем аббревиатуры/номера (АРМ №1, ИС, ЕМСЭД, СКУД и т.п.) if len(text) > 4 and any('А' <= c <= 'Я' or c == 'Ё' for c in text): has_lower = any('а' <= c <= 'я' or c == 'ё' for c in text) - if not has_lower: + has_digit_or_num = bool(re.search(r'[0-9№«»"\']', text)) + if not has_lower and not has_digit_or_num: words = text.split() - if len(words) >= 3: - text = text.title() - else: - text = text.capitalize() + # если есть короткая аббревиатура целиком заглавными — не трогаем + has_abbr = any(len(w) <= 4 and w.isupper() and any('А' <= c <= 'Я' for c in w) for w in words) + if not has_abbr: + if len(words) >= 3: + text = text.title() + else: + text = text.capitalize() return text @@ -220,6 +225,13 @@ def _import_152_is_list(wb, data, settings, log_fn): if val_b: is_obj['structure'] = val_b continue + if 'названия программ' in field_lower or ('программ' in field_lower and 'ос взаимодейств' in field_lower): + if val_b: + is_obj['software'] = val_b + continue + if 'локальную сеть' in field_lower: + is_obj['is_has_lan'] = is_checked + continue if 'количество записей' in field_lower or 'количество субъект' in field_lower: if val_b: is_obj['personalDataCount'] = val_b @@ -270,8 +282,8 @@ def _import_152_is_list(wb, data, settings, log_fn): if 'цель обработки' in field_lower: current_section = 'purpose' elif current_section == 'purpose': - purpose_val = field or val_b or '' - if purpose_val and 'выбрать' not in purpose_val.lower(): + purpose_val = val_b or field or '' + if purpose_val and 'выбрать' not in purpose_val.lower() and ':' not in purpose_val[:40]: is_obj['purpose'] = purpose_val log_fn(f" Цель: {purpose_val[:80]}") current_section = 'header' @@ -404,11 +416,15 @@ def _import_152_employees(wb, data, settings, log_fn): if in_commission: role = 'Член комиссии' - if col_e: - e_lower = col_e.lower() - for keyword, role_name in COMMISSION_ROLES.items(): - if keyword in e_lower: - role = role_name + # Роль ищем в колонках E (было) и D (Примечание — новый формат) + for col in (col_e, col_d): + if col: + col_lower = col.lower() + for keyword, role_name in COMMISSION_ROLES.items(): + if keyword in col_lower: + role = role_name + break + if role != 'Член комиссии': break if not col_b and not col_c: continue