diff --git a/dokogen/ui.py b/dokogen/ui.py index 591b5e6..15f36a0 100644 --- a/dokogen/ui.py +++ b/dokogen/ui.py @@ -338,12 +338,18 @@ class DokoGenApp: nb2 = ttk.Notebook(self._is_edit_panel) nb2.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) + # Список ПДн + pd_tab = ttk.Frame(nb2) + nb2.add(pd_tab, text="Перечень ПДн") + pd_btn_frame = ttk.Frame(pd_tab) + pd_btn_frame.pack(fill=tk.X) # Список ПДн pd_tab = ttk.Frame(nb2) nb2.add(pd_tab, text="Перечень ПДн") pd_btn_frame = ttk.Frame(pd_tab) pd_btn_frame.pack(fill=tk.X) ttk.Button(pd_btn_frame, text="+ Добавить", command=self._add_pd_item).pack(side=tk.LEFT, padx=2) + ttk.Button(pd_btn_frame, text="- Удалить", command=lambda: self._del_from_listbox(self.pd_listbox)).pack(side=tk.LEFT, padx=2) ttk.Button(pd_btn_frame, text="Выбрать из списка", command=self._select_from_pd_list).pack(side=tk.LEFT, padx=2) self.pd_listbox = tk.Listbox(pd_tab, height=6) self.pd_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) @@ -354,6 +360,7 @@ class DokoGenApp: subj_btn_frame = ttk.Frame(subj_tab) subj_btn_frame.pack(fill=tk.X) ttk.Button(subj_btn_frame, text="+ Добавить", command=self._add_pd_subjects_item).pack(side=tk.LEFT, padx=2) + ttk.Button(subj_btn_frame, text="- Удалить", command=lambda: self._del_from_listbox(self.pd_subjects_listbox)).pack(side=tk.LEFT, padx=2) ttk.Button(subj_btn_frame, text="Выбрать из списка", command=self._select_from_subjects_list).pack(side=tk.LEFT, padx=2) self.pd_subjects_listbox = tk.Listbox(subj_tab, height=6) self.pd_subjects_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) @@ -364,6 +371,7 @@ class DokoGenApp: act_btn_frame = ttk.Frame(act_tab) act_btn_frame.pack(fill=tk.X) ttk.Button(act_btn_frame, text="+ Добавить", command=self._add_pd_action_item).pack(side=tk.LEFT, padx=2) + ttk.Button(act_btn_frame, text="- Удалить", command=lambda: self._del_from_listbox(self.pd_actions_listbox)).pack(side=tk.LEFT, padx=2) ttk.Button(act_btn_frame, text="Выбрать из списка", command=self._select_from_actions_list).pack(side=tk.LEFT, padx=2) self.pd_actions_listbox = tk.Listbox(act_tab, height=6) self.pd_actions_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) @@ -374,6 +382,7 @@ class DokoGenApp: def_btn_frame = ttk.Frame(def_tab) def_btn_frame.pack(fill=tk.X) ttk.Button(def_btn_frame, text="+ Добавить", command=self._add_defense_item).pack(side=tk.LEFT, padx=2) + ttk.Button(def_btn_frame, text="- Удалить", command=lambda: self._del_from_listbox(self.defense_tools_listbox)).pack(side=tk.LEFT, padx=2) ttk.Button(def_btn_frame, text="Выбрать из списка", command=self._select_from_defense_list).pack(side=tk.LEFT, padx=2) self.defense_tools_listbox = tk.Listbox(def_tab, height=6) self.defense_tools_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) @@ -447,7 +456,7 @@ class DokoGenApp: # Заголовки header = ttk.Frame(frame) header.pack(fill=tk.X) - for w, col in [(25, "Должность"), (30, "ФИО"), (30, "Доступ к ИС")]: + for w, col in [(25, "Должность"), (30, "ФИО")]: ttk.Label(header, text=col, font=('', 9, 'bold'), width=w, anchor=tk.W).pack(side=tk.LEFT, padx=2) @@ -471,11 +480,11 @@ class DokoGenApp: self._add_employee_row( emp.get('position', ''), emp.get('fio', ''), - emp.get('is_list', ''), + , ) self._update_emp_count() - def _add_employee_row(self, position="", fio="", is_list=""): + def _add_employee_row(self, position="", fio=""): """Добавляет одну строку сотрудника.""" row = ttk.Frame(self._employees_frame) row.pack(fill=tk.X, pady=2) @@ -488,9 +497,6 @@ class DokoGenApp: fio_entry.insert(0, fio) fio_entry.pack(side=tk.LEFT, padx=2) - is_entry = ttk.Entry(row, width=30) - is_entry.insert(0, is_list if isinstance(is_list, str) else ', '.join(is_list)) - is_entry.pack(side=tk.LEFT, padx=2) del_btn = ttk.Button(row, text="✖", width=3, command=lambda: self._delete_employee_row(row)) @@ -525,7 +531,6 @@ class DokoGenApp: emp = { 'position': pos_e.get().strip(), 'fio': fio_e.get().strip(), - 'is_list': [s.strip() for s in is_e.get().split(',') if s.strip()], } if emp['position'] or emp['fio']: self.model.employees_access.append(emp) @@ -700,13 +705,13 @@ class DokoGenApp: """Извлекает название города из адреса (простая эвристика).""" if not address: return '' - # Пробуем найти "г. Город" + # Пробуем найти "г. Город" или "Г Город" (без точки, заглавная) import re - m = re.search(r'\bг\.\s*([А-ЯЁ][а-яёA-Za-z-]+(?:\s+[А-ЯЁ][а-яёA-Za-z-]+)*)', address) + m = re.search(r'\b[гГ]\.?\s*([А-ЯЁ][а-яёA-Za-z-]+(?:\s+[А-ЯЁ][а-яёA-Za-z-]+)*)', address) if m: return m.group(1).strip() # Пробуем найти "город Город" - m = re.search(r'\bгород\s+([А-ЯЁ][а-яёA-Za-z-]+(?:\s+[А-ЯЁ][а-яёA-Za-z-]+)*)', address) + m = re.search(r'\bгород\s+([А-ЯЁ][а-яёA-Za-z-]+(?:\s+[А-ЯЁ][а-яёA-Za-z-]+)*)', address, re.IGNORECASE) if m: return m.group(1).strip() # Пробуем первую часть до запятой, если там известный город @@ -930,6 +935,12 @@ class DokoGenApp: if sel: self.users_listbox.delete(sel[0]) + def _del_from_listbox(self, listbox): + """Удаление выбранного элемента из любого listbox.""" + sel = listbox.curselection() + if sel: + listbox.delete(sel[0]) + # ==================== ВЫБОР ИЗ СПИСКА (словари) ==================== def _select_from_dialog(self, title: str, items: list, listbox): """Открывает окно с чекбоксами для выбора элементов из списка."""