fix: аудит ветки source — критические и высокие замечания
- api_settings: убраны реальные API-ключи из кода (чтение из env/файла) — 1.1
- variables: {{is_security_requirements}} больше не подставляет всегда УЗ-4;
extended_fields/defence_level передаются в контекст — 1.2
- defence.py: эталонная таблица ПП-1119 (п.9-12), 48 комбинаций;
ui.py: авторасчёт УЗ переведён на неё (public больше не 'всегда 4',
спец/био/общедоступные/иные разделены) — 2.1
- generator: убран дубль хвоста параграфа в _highlight_unmatched — 2.2
- importer: категории ПДн взаимоисключающие ('иные' только если нет
спец/био); УЗ пересчитывается при импорте — 2.3
- import_settings(.py/.json): убран перехват 'администратора безопасности'
правилом ответственного за ПДн — 3.1
- variables: {{category}}/{{is.category}} резолвятся из personal_data_category — 3.2
- verify: ИИ-предложения ИНН/ОГРН/КПП валидируются контрольными суммами
перед применением — 3.3
- models: defence_level None вместо '' (не маскирует 'не рассчитано')
- .gitignore: api_settings.json/.env не попадают в git
- test_defence.py: юнит-тест всех 48 комбинаций таблицы УЗ
This commit is contained in:
+4
-36
@@ -23,6 +23,7 @@ from .verify import (
|
||||
check_declension_ai, check_company_ai,
|
||||
COMPANY_FIELDS, compare_company_values,
|
||||
)
|
||||
from .defence import calc_defence_level
|
||||
from .api_settings import load_api_settings, save_api_settings
|
||||
|
||||
|
||||
@@ -1311,42 +1312,8 @@ class DokoGenApp:
|
||||
has_only_employees = len(subj_items) > 0 and all('сотрудник' in s.lower() for s in subj_items)
|
||||
is_employees = has_only_employees or len(subj_items) == 0
|
||||
|
||||
# Таблица ПП №1119: (категория, тип_субъектов, объём, тип_угроз) → УЗ
|
||||
def lookup(cat_group, employees, large, threat):
|
||||
# Общедоступные → всегда 4
|
||||
if cat_group == 'public':
|
||||
return 4
|
||||
# Специальные/биометрические
|
||||
if cat_group == 'special_bio':
|
||||
tbl = {
|
||||
('emp', False, '1'): 2, ('emp', True, '1'): 1,
|
||||
('other', False, '1'): 1, ('other', True, '1'): 1,
|
||||
('emp', False, '2'): 2, ('emp', True, '2'): 1,
|
||||
('other', False, '2'): 2, ('other', True, '2'): 1,
|
||||
('emp', False, '3'): 3, ('emp', True, '3'): 2,
|
||||
('other', False, '3'): 3, ('other', True, '3'): 2,
|
||||
}
|
||||
else: # иные
|
||||
tbl = {
|
||||
('emp', False, '1'): 3, ('emp', True, '1'): 2,
|
||||
('other', False, '1'): 2, ('other', True, '1'): 1,
|
||||
('emp', False, '2'): 4, ('emp', True, '2'): 3,
|
||||
('other', False, '2'): 3, ('other', True, '2'): 2,
|
||||
('emp', False, '3'): 4, ('emp', True, '3'): 4,
|
||||
('other', False, '3'): 4, ('other', True, '3'): 3,
|
||||
}
|
||||
key = ('emp' if employees else 'other', large, threat)
|
||||
return tbl.get(key, 4)
|
||||
|
||||
# Определяем группу категорий
|
||||
if 'общедоступные' in categories and not any(c in categories for c in ['специальные', 'биометрические', 'иные']):
|
||||
cat_group = 'public'
|
||||
elif any(c in categories for c in ['специальные', 'биометрические']):
|
||||
cat_group = 'special_bio'
|
||||
else:
|
||||
cat_group = 'other'
|
||||
|
||||
level = lookup(cat_group, is_employees, is_large, threat_type)
|
||||
# Расчёт УЗ по эталонной таблице ПП РФ №1119 (п.9-12) — dokogen/defence.py
|
||||
level = calc_defence_level(categories, is_employees, is_large, threat_type)
|
||||
self.is_defence_var.set(str(level))
|
||||
|
||||
def _on_categories_or_count_changed(self):
|
||||
@@ -1959,6 +1926,7 @@ class DokoGenApp:
|
||||
room=is_data.get('room', ''),
|
||||
structure=is_data.get('structure', ''),
|
||||
pd_actions_list=is_data.get('pd_actions', []),
|
||||
defence_level=is_data.get('defenceLevel', ''),
|
||||
)
|
||||
self.model.information_systems.append(isys)
|
||||
self._refresh_is_listbox()
|
||||
|
||||
Reference in New Issue
Block a user