feat: переделка под ОКИИ (187-ФЗ) — объекты КИИ вместо ИС, категории 1-3, ОКВЭД, убраны ПДн/бумажные носители

- вкладка «Информационные системы» → «Объекты КИИ», убрана «Структура объекта»
- «Тип угроз»/«УЗ» → категория значимости 1/2/3/без категории
- удалены Категории ПДн, кол-во записей, перечень/субъекты/действия с ПДн + словари
- «Пользователи ИС» → «Пользователи ОКИИ», средства защиты оставлены
- вкладка «Бумажные документы» удалена полностью (GUI + логика + модели)
- ОКВЭД: поля во вкладке «Организация», словарь okved.json, выбор галочками, импорт
- нормализация регистра адреса DaData (КАПС → нормальный)
- importer: объекты КИИ (наименование объекта, ПО, СЗИ, пользователи)
This commit is contained in:
2026-08-04 13:58:23 +04:00
parent b115f9e2b4
commit ce1b56066a
11 changed files with 562 additions and 724 deletions
+32 -2
View File
@@ -65,6 +65,17 @@ _ADDRESS_ABBR = {
'СТ': 'ст.', 'Ш': 'ш.', 'Р-Н': 'р-н.', 'Б-Р': 'б-р.', 'МКР': 'мкр.',
'НАБ': 'наб.', 'ТУП': 'туп.', 'ПР-Д': 'пр-д.', 'КРП': 'крп.',
'Г.': 'г.', 'УЛ.': 'ул.', 'Д.': 'д.', 'Р-Н.': 'р-н.',
'Г.О': 'г.о.', 'Г.О.': 'г.о.', 'ГО': 'г.о.', 'М.О': 'м.о.', 'М.О.': 'м.о.',
}
# Слова, которые в адресах пишутся со строчной буквы (кроме случаев,
# когда стоят первым словом после точки — «г. Электроугли» и т.п.)
_ADDRESS_LOWERCASE = {
'область', 'край', 'республика', 'округ', 'район', 'город', 'поселок',
'посёлок', 'деревня', 'село', 'станица', 'хутор', 'аул', 'улица',
'проспект', 'переулок', 'бульвар', 'шоссе', 'набережная', 'площадь',
'проезд', 'тупик', 'аллея', 'линия', 'дом', 'строение', 'корпус',
'квартира', 'офис', 'помещение', 'этаж', 'комната', 'участок',
}
@@ -105,7 +116,12 @@ def _normalize_text(text):
def normalize_address(text):
"""«Г Крымск» → «г. Крымск», «Р-Н» → «р-н.» и т.п."""
"""«Г Крымск» → «г. Крымск», «Р-Н» → «р-н.», «МОСКОВСКАЯ ОБЛАСТЬ» → «Московская область».
Приводит адрес к нормальному регистру: каждое слово с заглавной буквы,
адресные сокращения (г., ул., д., обл., г.о.) и административные термины
(область, район, город, дом и т.п.) — со строчной.
"""
if not text:
return ''
parts = re.split(r'(\s+|[,\;])', text)
@@ -115,7 +131,21 @@ def normalize_address(text):
out.append(_ADDRESS_ABBR[p.strip().upper()])
else:
out.append(p)
return ''.join(out)
res = ''.join(out)
# КАПС → нормальный регистр по словам
res = _normalize_text(res)
# Адресные термины — со строчной буквы (сохраняя пунктуацию)
words = res.split(' ')
fixed = []
for w in words:
m = re.match(r'^([^\w]*)([\w\-]+)([^\w]*)$', w, re.UNICODE)
if m:
pre, core, post = m.group(1), m.group(2), m.group(3)
if core.lower() in _ADDRESS_LOWERCASE:
fixed.append(pre + core.lower() + post)
continue
fixed.append(w)
return ' '.join(fixed)
def _fmt_date(value):