From 42a243f7b6ac6de823f2230540c8dae06f8d44f3 Mon Sep 17 00:00:00 2001 From: prog1764 Date: Tue, 4 Aug 2026 17:31:09 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8/?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81=D1=82=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BB=D1=8E=D0=B1=D1=8B=D1=85=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B7=D0=B8=D1=86=D0=B8=D0=B9=20=D1=81=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=80=D1=8F=20(=D0=9E=D0=A1=20=D0=B8=20=D0=B4=D1=80.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - кнопка «✏️ Уточнить модель/кол-во» теперь всегда в окне выбора из словаря - для позиций без маркера (Windows 10 Pro и т.п.) запрашивает количество: вводишь 5 → «Windows 10 Pro 5 шт.» - для позиций с «(уточнить …)» вычищает маркер из названия и дописывает модель + количество - формат: «Позиция Модель N шт.» (без запятой) --- dokogen/ui.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/dokogen/ui.py b/dokogen/ui.py index 3b37991..36fbf26 100644 --- a/dokogen/ui.py +++ b/dokogen/ui.py @@ -1991,15 +1991,11 @@ class DokoGenApp: for var in vars.values(): var.set(False) - has_refinable = any('уточн' in str(item).lower() for item in items) - def _refine_selected(): - """Для отмеченных позиций с «(уточнить …)» запросить модель и количество.""" + """Для отмеченных позиций запросить модель/версию и количество.""" for item, (var, cb) in list(items_map.items()): if not var.get(): continue - if 'уточн' not in item.lower(): - continue new_text = self._refine_dict_item_dialog(item) if new_text is None or new_text == item: continue @@ -2010,9 +2006,8 @@ class DokoGenApp: vars[new_text] = var items_map[new_text] = (var, cb) - if has_refinable: - ttk.Button(btn_frame, text="✏️ Уточнить модель/кол-во", - command=_refine_selected).pack(side=tk.LEFT, padx=2) + ttk.Button(btn_frame, text="✏️ Уточнить модель/кол-во", + command=_refine_selected).pack(side=tk.LEFT, padx=2) ttk.Button(btn_frame, text="Выбрать всё", command=_select_all).pack(side=tk.LEFT, padx=2) ttk.Button(btn_frame, text="Снять всё", command=_clear_all).pack(side=tk.LEFT, padx=2) ttk.Button(btn_frame, text="✅ Применить", command=_apply).pack(side=tk.RIGHT, padx=2) @@ -2022,8 +2017,13 @@ class DokoGenApp: def _refine_dict_item_dialog(self, base_item): """Окно уточнения модели и количества для позиции из словаря. - Возвращает полную строку вида «Сервер <модель>, шт.» или None. + Возвращает полную строку вида «Windows 10 Pro 5 шт.» или + «Сервер Supermicro SSG-2027R -E1R24N 2 шт.» или None. """ + import re + # Убираем из базы маркер «(уточнить …)» + base = re.sub(r'\s*\([^)]*уточн[^)]*\)', '', base_item, flags=re.I).strip() or base_item + dialog = tk.Toplevel(self.root) dialog.title("Уточнить модель и количество") dialog.geometry("500x180") @@ -2033,15 +2033,15 @@ class DokoGenApp: frame = ttk.Frame(dialog, padding=10) frame.pack(fill=tk.BOTH, expand=True) - ttk.Label(frame, text=f"Позиция: {base_item}", wraplength=470, + ttk.Label(frame, text=f"Позиция: {base}", wraplength=470, font=('Arial', 9, 'bold')).pack(anchor=tk.W, pady=(0, 8)) - ttk.Label(frame, text="Модель / версия / конфигурация:").pack(anchor=tk.W) + ttk.Label(frame, text="Модель / версия / конфигурация (необязательно):").pack(anchor=tk.W) model_entry = ttk.Entry(frame, width=60) model_entry.pack(fill=tk.X, pady=(2, 6)) model_entry.focus_set() - ttk.Label(frame, text="Количество (необязательно):").pack(anchor=tk.W) + ttk.Label(frame, text="Количество:").pack(anchor=tk.W) count_entry = ttk.Entry(frame, width=20) count_entry.pack(anchor=tk.W, pady=(2, 6)) @@ -2050,11 +2050,11 @@ class DokoGenApp: def _ok(): model = model_entry.get().strip() count = count_entry.get().strip() - text = base_item + text = base if model: text = f"{text} {model}" if count: - text = f"{text}, {count} шт." + text = f"{text} {count} шт." result['val'] = text dialog.destroy()