fix: импорт под новый формат опросника 5.25

- clean_value не портит аббревиатуры/номера (АРМ №1, СКУД)
- ПО: 'Названия программ...' → {{item.software}}
- 'локальную сеть' → is_has_lan (поле is_local_network)
- Цель обработки ПД — значение из объединённой ячейки (val_b)
- Роли комиссии ищутся и в колонке E, и в Примечании (D)
- Проверено на присланном опроснике: КПП, подразделение по
  безопасности, действия с ПДн, структура ИС — импортируются
This commit is contained in:
2026-08-03 12:22:49 +04:00
parent 79952bf735
commit 353e7403d0
+22 -6
View File
@@ -34,10 +34,15 @@ 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()
# если есть короткая аббревиатура целиком заглавными — не трогаем
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:
@@ -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,12 +416,16 @@ def _import_152_employees(wb, data, settings, log_fn):
if in_commission:
role = 'Член комиссии'
if col_e:
e_lower = col_e.lower()
# Роль ищем в колонках 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 e_lower:
if keyword in col_lower:
role = role_name
break
if role != 'Член комиссии':
break
if not col_b and not col_c:
continue
commission.append({