From cf2a80c4703b113850c4e71e441a63faf36c74f0 Mon Sep 17 00:00:00 2001 From: prog1764 Date: Tue, 4 Aug 2026 15:52:56 +0400 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82?= =?UTF-8?q?=D1=91=D1=80=20=D0=BE=D1=82=D0=B1=D1=80=D0=B0=D1=81=D1=8B=D0=B2?= =?UTF-8?q?=D0=B0=D0=B5=D1=82=20=D1=82=D0=B5=D0=BA=D1=81=D1=82-=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D1=81=D0=BA=D0=B0=D0=B7=D0=BA=D0=B8=20=D0=B8=D0=B7?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?;=20=D0=B2=D1=8B=D0=BF=D0=B0=D0=B4=D0=B0=D1=8E=D1=89=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B8=20=D1=82=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - importer: фильтр HINT_MARKERS — значения вида «Формулировка должна строиться...», «Например...», «Выберите из...» и т.п. не импортируются в поля объекта - ui: все Combobox (сфера, тип, архитектура, типовой объект, категория/цель/способ сети) — state='readonly', нельзя редактировать вручную --- dokogen/importer.py | 19 +++++++++++++++++-- dokogen/ui.py | 14 +++++++------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/dokogen/importer.py b/dokogen/importer.py index 04f4104..89482a9 100644 --- a/dokogen/importer.py +++ b/dokogen/importer.py @@ -308,9 +308,24 @@ def _import_187_is_list(wb, data, settings, log_fn): 'гарантирован': 'Доверенная загрузка', } + HINT_MARKERS = [ + 'формулировка должна', 'например', 'пример:', 'формат:', 'выберите из', + 'если не используются', 'при необходимости можно', 'указать', 'вписать', + 'если адресов несколько', 'по логике', 'произвольное описание', + ] + + def _is_hint(text): + """True, если значение похоже на подсказку/образец из примечания.""" + low = (text or '').lower() + for m in HINT_MARKERS: + if m in low: + return True + return False + def _set(field_lower, key, val): - """Записать значение, если ключевое слово найдено в вопросе.""" - if val and 'выбрать' not in field_lower: + """Записать значение, если ключевое слово найдено в вопросе + и значение не является подсказкой из примечания.""" + if val and 'выбрать' not in field_lower and not _is_hint(val): is_obj[key] = val return True return False diff --git a/dokogen/ui.py b/dokogen/ui.py index 1bfd7d4..02bc420 100644 --- a/dokogen/ui.py +++ b/dokogen/ui.py @@ -795,7 +795,7 @@ class DokoGenApp: # Сфера деятельности — словарик + выпадающий список ttk.Label(main_frame, text="Сфера деятельности:").grid(row=1, column=0, sticky=tk.W, pady=2) - self.is_sphere_combo = ttk.Combobox(main_frame, width=68) + self.is_sphere_combo = ttk.Combobox(main_frame, width=68, state='readonly') self.is_sphere_combo.grid(row=1, column=1, padx=8, sticky=tk.EW, pady=1) try: import json as _json @@ -807,7 +807,7 @@ class DokoGenApp: # Тип объекта — словарик + выпадающий список ttk.Label(main_frame, text="Тип объекта:").grid(row=2, column=0, sticky=tk.W, pady=2) - self.is_object_type_combo = ttk.Combobox(main_frame, width=68) + self.is_object_type_combo = ttk.Combobox(main_frame, width=68, state='readonly') self.is_object_type_combo.grid(row=2, column=1, padx=8, sticky=tk.EW, pady=1) try: _ot = os.path.join(os.path.dirname(__file__), 'dictionaries', 'object_types.json') @@ -818,7 +818,7 @@ class DokoGenApp: # Архитектура объекта — словарик + выпадающий список ttk.Label(main_frame, text="Архитектура объекта:").grid(row=3, column=0, sticky=tk.W, pady=2) - self.is_architecture_combo = ttk.Combobox(main_frame, width=68) + self.is_architecture_combo = ttk.Combobox(main_frame, width=68, state='readonly') self.is_architecture_combo.grid(row=3, column=1, padx=8, sticky=tk.EW, pady=1) try: _ar = os.path.join(os.path.dirname(__file__), 'dictionaries', 'architectures.json') @@ -829,7 +829,7 @@ class DokoGenApp: # Типовой отраслевой объект КИИ — словарик + выпадающий список ttk.Label(main_frame, text="Типовой отраслевой объект КИИ:").grid(row=4, column=0, sticky=tk.W, pady=2) - self.is_typical_object_combo = ttk.Combobox(main_frame, width=68) + self.is_typical_object_combo = ttk.Combobox(main_frame, width=68, state='readonly') self.is_typical_object_combo.grid(row=4, column=1, padx=8, sticky=tk.EW, pady=1) try: _to = os.path.join(os.path.dirname(__file__), 'dictionaries', 'typical_objects.json') @@ -875,7 +875,7 @@ class DokoGenApp: # Категория сети — словарик ttk.Label(net_frame, text="Категория сети электросвязи:").grid(row=1, column=0, sticky=tk.W, pady=2) - self.is_net_category_combo = ttk.Combobox(net_frame, width=68) + self.is_net_category_combo = ttk.Combobox(net_frame, width=68, state='readonly') self.is_net_category_combo.grid(row=1, column=1, padx=8, sticky=tk.EW, pady=1) try: import json as _json @@ -892,7 +892,7 @@ class DokoGenApp: # Цель взаимодействия — словарик ttk.Label(net_frame, text="Цель взаимодействия с сетью электросвязи:").grid(row=3, column=0, sticky=tk.W, pady=2) - self.is_net_purpose_combo = ttk.Combobox(net_frame, width=68) + self.is_net_purpose_combo = ttk.Combobox(net_frame, width=68, state='readonly') self.is_net_purpose_combo.grid(row=3, column=1, padx=8, sticky=tk.EW, pady=1) try: _np = os.path.join(os.path.dirname(__file__), 'dictionaries', 'net_purposes.json') @@ -903,7 +903,7 @@ class DokoGenApp: # Способ взаимодействия — словарик ttk.Label(net_frame, text="Способ взаимодействия (тип доступа):").grid(row=4, column=0, sticky=tk.W, pady=2) - self.is_net_method_combo = ttk.Combobox(net_frame, width=68) + self.is_net_method_combo = ttk.Combobox(net_frame, width=68, state='readonly') self.is_net_method_combo.grid(row=4, column=1, padx=8, sticky=tk.EW, pady=1) try: _nm = os.path.join(os.path.dirname(__file__), 'dictionaries', 'net_methods.json')