From 6407cf422905edc8952579f471ab188addfa9cb3 Mon Sep 17 00:00:00 2001 From: sroth Date: Fri, 9 May 2025 21:28:39 +0200 Subject: [PATCH] fixed bug #12 --- src/brovski-adress-etiketten-verwaltung.py | 8 ++++---- src/config.py | 21 ++++++++++++++++----- src/connector.py | 17 ++++++++++------- src/model.py | 8 +++++--- src/windows.py | 8 ++++---- 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/brovski-adress-etiketten-verwaltung.py b/src/brovski-adress-etiketten-verwaltung.py index 3c4614c..cdc2be0 100644 --- a/src/brovski-adress-etiketten-verwaltung.py +++ b/src/brovski-adress-etiketten-verwaltung.py @@ -7,7 +7,6 @@ from tkinter import messagebox from tkinter import ttk from config import Config -from connector import JSONConnector from model import Model from windows import SettingsWindow, EditRecord, show_error @@ -37,7 +36,7 @@ class Application: self.filter_active = tk.BooleanVar(value=False) # model connector - self.model = Model(JSONConnector()) + self.model = Model(self.config) # init paths to json and csv file self.json_file_name = "brovski-adress-etiketten-verwaltung.json" @@ -265,6 +264,7 @@ class Application: if reload: self.address_list = self.model.get_all() if len(self.address_list) == 0: + self.delete_all_table_items() return self.delete_all_table_items() for address in self.address_list: @@ -290,14 +290,14 @@ class Application: self.table.delete(item) def open_window_settings(self): - window = SettingsWindow(self, self.root) + window = SettingsWindow(self, self.root, self.config) window.wm_transient(self.root) window.wait_visibility() window.grab_set() return window def open_window_edit_records(self, record_id: int): - window = EditRecord(self, self.root, record_id) + window = EditRecord(self, self.root, record_id, self.config) window.wm_transient(self.root) window.wait_visibility() window.grab_set() diff --git a/src/config.py b/src/config.py index 56a05f0..eb01278 100644 --- a/src/config.py +++ b/src/config.py @@ -1,11 +1,11 @@ import os -from configparser import ConfigParser +from configparser import ConfigParser, NoOptionError, NoSectionError, DuplicateSectionError class Config: parser: ConfigParser - def __init__(self): + def __init__(self, filename: str = "config.ini"): """ Config parser reading config.ini @@ -19,7 +19,7 @@ class Config: full_path = os.path.join(home_path, ".config", "brovski-adress-etiketten" ) if not os.path.exists(full_path): os.makedirs(full_path) - self.config_file = os.path.join(full_path, "config.ini") + self.config_file = os.path.join(full_path, filename) self._load() @@ -32,14 +32,25 @@ class Config: def add_section(self, section): self._load() - self.parser.add_section(section) + try: + self.parser.add_section(section) + except DuplicateSectionError: + return + self._save() def set(self, section: str, option: str, value: str): self._load() + self.add_section(section) self.parser.set(section, option, value) self._save() def get(self, section: str, option: str): self._load() - return self.parser.get(section, option) + try: + option = self.parser.get(section, option) + except NoOptionError: + option = "" + except NoSectionError: + option = "" + return option diff --git a/src/connector.py b/src/connector.py index f3f4c9f..5b3000f 100644 --- a/src/connector.py +++ b/src/connector.py @@ -3,11 +3,12 @@ import os from abc import ABC, abstractmethod import config +from config import Config class Connector(ABC): - def __init__(self): - pass + def __init__(self, config: Config): + self.config = config @abstractmethod def get_all(self) -> list: @@ -35,15 +36,17 @@ class Connector(ABC): class JSONConnector(Connector): - def __init__(self): - super().__init__() - self.config = config.Config() + def __init__(self, config: Config): + super().__init__(config) self.json_path = self.config.get("json", "path") self.json_file = os.path.join(self.json_path, "brovski-adress-etiketten-verwaltung-v7.json") def get_all(self) -> list: - with open(self.json_file, "r") as f: - return json.load(f) + try: + with open(self.json_file, "r") as f: + return json.load(f) + except FileNotFoundError: + return [] def get_all_sorted_by(self, field: str, reverse=False) -> list: with open(self.json_file, "r") as f: diff --git a/src/model.py b/src/model.py index 1c7164c..c94512e 100644 --- a/src/model.py +++ b/src/model.py @@ -1,9 +1,11 @@ -from connector import JSONConnector, Connector +from config import Config +from connector import JSONConnector class Model: - def __init__(self, connector: Connector): - self.connector = connector + def __init__(self, config: Config): + self.connector = JSONConnector(config) + self.config = config def get_all(self): return self.connector.get_all() diff --git a/src/windows.py b/src/windows.py index 77e980a..16856a4 100644 --- a/src/windows.py +++ b/src/windows.py @@ -32,11 +32,11 @@ class Window(tk.Toplevel): class EditRecord(Window): - def __init__(self, parent, root: tk.Tk, record_id: int): + def __init__(self, parent, root: tk.Tk, record_id: int, config: Config): super().__init__(parent, root) self.bind("", self._update) - self.model = JSONConnector() + self.model = JSONConnector(config) record = self.model.get_by_id(record_id) @@ -86,10 +86,10 @@ class EditRecord(Window): class SettingsWindow(Window): - def __init__(self, parent, root: tk.Tk): + def __init__(self, parent, root: tk.Tk, config: Config): super().__init__(parent, root) self.geometry(f"500x330+{self.root.winfo_x() + 20}+{self.root.winfo_y() + 20}") - self.config = Config() + self.config = config self.json_file = tk.StringVar() self.csv_file = tk.StringVar()