diff --git a/src/wce_crm/gui.py b/src/wce_crm/gui.py index ffe8475..0cae7d7 100644 --- a/src/wce_crm/gui.py +++ b/src/wce_crm/gui.py @@ -84,15 +84,6 @@ if not wce_crm.constants.Config.DEVELOPMENT_STATE: DEBUG_NO_DATABASE = False DEBUG_GET_SET = False -# TODO remove -# logger_gui = BASE_LOGGER.getChild("wce") -# logger_gui.setLevel(logging.DEBUG) -# logger_search_widget = logger_gui.getChild("search_widget") -# logger_search_widget.setLevel(logging.DEBUG) -# logger_get_data = logger_gui.getChild("get_data") -# logger_get_data.setLevel(logging.DEBUG) -# logger_auto_form = logger_gui.getChild("get_data_auto_form") -# logger_auto_form.setLevel(logging.DEBUG) QSS = """ *[styleClass="stempel"] { @@ -880,33 +871,6 @@ def reset_form( widget.setStyleSheet("") -# TODO: check removal -# def _insert_nested( -# target_dict: dict[str, Any], -# key_path: Sequence[str], -# value: Any, -# ): -# # keys 'a.b.c = 1' --> {'a': {'b': {'c': 1}}} -# for part in key_path[:-1]: -# target_dict = target_dict.setdefault(part, {}) -# target_dict[key_path[-1]] = value - - -# def _get_nested( -# target_dict: dict[str, Any], -# key_path: Sequence[str], -# ) -> Any: -# # keys 'a.b.c = 1' --> {'a': {'b': {'c': 1}}} -# current = target_dict -# for part in key_path: -# if isinstance(current, dict) and part in current: -# current = current[part] -# else: -# return None # path does not exist - -# return current - - @dc.dataclass(slots=True) class SubForm: entry_box: QWidget @@ -1010,21 +974,20 @@ def get_form_data( value = qt_date.toPython() elif isinstance(widget, QComboBox): value = widget.currentData() - elif isinstance(widget, DynamicListWidget): - # TODO add to other custom widgets - # this should be a list: each dynamic list contains a list - # of such dictionaries - value = widget.get_form_data() elif isinstance( - widget, (DynamicDropdownWidgetNumeric, DynamicDropdownWidgetOption, CustomWidget) + widget, + ( + DynamicListWidget, + DynamicDropdownWidgetNumeric, + DynamicDropdownWidgetOption, + CustomWidget, + ), ): # this is a special data structure with some assumptions of the widget's internals + # DynamicListWidget: this is a list -> each dynamic list contains a list + # of such dictionaries (handled below) value = widget.get_form_data() - # TODO: check removal - # logger_get_data.info("Key: %s", key) - # logger_get_data.info("Value: %s", value) - if isinstance(value, dict): raw_data.update(value) else: @@ -1099,10 +1062,6 @@ def set_form_data( if data_key not in filter_keys: continue - # TODO check removal - # key_path = key.split(COLUMN_SEP) - # value = _get_nested(data, key_path) - # value = data.get(key, None) if isinstance( widget, ( @@ -1231,44 +1190,6 @@ class Grunderfassung_Projektrelevanz(BaseModel): relevanz: str foerderperiode: str | None = None - # @field_validator("relevanz", mode="before") - # @classmethod - # def str_to_bool(cls, value: Any) -> Any: - # if isinstance(value, str): - # value = value.strip().lower() - - # if value == "ja": - # return True - # elif value == "nein": - # return False - - # raise ValueError("Wert muss 'ja', 'nein', True oder False sein.") - - # return value - - -# TODO remove -# class Grunderfassung_ProjektrelevanzStatus_Status(BaseModel): -# model_config = ConfigDict(str_strip_whitespace=True) - -# relevanz: bool -# foerderperiode: list[str | None] | None = None - -# @field_validator("relevanz", mode="before") -# @classmethod -# def str_to_bool(cls, value: Any) -> Any: -# if isinstance(value, str): -# value = value.strip().lower() - -# if value == "ja": -# return True -# elif value == "nein": -# return False - -# raise ValueError("Wert muss 'ja', 'nein', True oder False sein.") - -# return value - class Grunderfassung_Kontaktperson(BaseModel): model_config = ConfigDict(str_strip_whitespace=True) @@ -1835,10 +1756,9 @@ class AutoForm(QWidget): if lookup_id > 0: logger_auto_form.debug("Load from DB:") loaded_data = self.cfg.data_get(lookup_id) - # TODO remove loading from file (obsolete) else: - logger_auto_form.debug("Load from pickled object:") - loaded_data = load_pydantic_model_dict_db() + logger_auto_form.error("Loading: Lookup ID <= 0. Do nothing!") + return logger_auto_form.debug( "Loaded data dict:\n%s Passing to Pydantic...", pformat(loaded_data) @@ -1905,8 +1825,7 @@ class AutoForm(QWidget): if DEBUG_NO_DATABASE: return # !! this code is only called if the 'try' block was successful - # save_pydantic_model_dict_db(validated_data) - # TODO save data to database + # save data to database db_data = validated_data.to_db(exclude=self.cfg.ignored_keys) logger_auto_form.debug( ("Form data with 'exlude' (must be saved in the database):\n%s"), @@ -2058,24 +1977,9 @@ class DynamicListWidget(QWidget): return errors def get_form_data(self) -> list[dict[str, Any]]: - # TODO code cleansing - # raw_data = get_form_data(self.widget_registry) - # form_data = get_form_data(self.widget_registry) - # logger_get_data.debug( - # "\n\n\n------- Form data DynamicListWidget:\n%s", pformat(form_data) - # ) - logger_get_data.info("DynamicListWidget - SubForms") - # for sub_form in self.sub_forms: - # logger_get_data.info("SubForm index %d", sub_form.index) - # pprint_registry(sub_form.registry) - + logger_get_data.info("DynamicListWidget - Get Data") form_data = [get_form_data(sub.registry) for sub in self.sub_forms] - # ignored_keys: list[str] = [] - # for d in form_data: - # ignored_keys.extend(d.ignored_keys) - # data = [d.data for d in form_data] - logger_get_data.debug("##################") - logger_get_data.debug("Form data:\n%s", pformat(form_data)) + logger_get_data.debug("DynamicListWidget - Form data:\n%s", pformat(form_data)) return form_data @@ -2092,19 +1996,6 @@ class DynamicListWidget(QWidget): self.add_entry() return - # TODO check removal - # for sub_data in data: - # self.add_entry() - # current_sub_form = self.sub_forms[-1] - # registry_entries = search_widgets_by_key( - # self.widget_registry, f"-[{current_sub_form.index}]" - # ) - # for reg_entry in registry_entries: - # widget = reg_entry["widget"] - # field_def = reg_entry["form_field"] - - # value = sub_data[field_def.key] - # set_widget_value(widget, value) for sub_form_data in data: self.add_entry() current_sub_form = self.sub_forms[-1] @@ -2460,23 +2351,22 @@ class DynamicDropdownWidgetOption(QWidget): widget = self.widget_registry[key]["widget"] value = data[key] set_widget_value(widget, value) - # TODO need to get the correct index logger_get_data.debug("Value: %s", value) if value is None or value != self.trigger_value: num_subforms = 0 else: num_subforms = 1 del data[key] - # assert key in whole_registry, "key not in Dynamic DD Option" whole_registry = self._get_combined_registry(sub_forms_only=True) - logger_get_data.debug("[DynamicDD-Option] Whole widget registry:\n") - pprint_registry(whole_registry) + logger_get_data.debug("[DynamicDD-Option] Widget registry for subforms obtained") - logger_get_data.debug(">>>>>>>>> Call set_form_data for DynamicDropdown") - logger_get_data.debug("Data before set of subforms:%s", pformat(data)) + logger_get_data.debug( + "[DynamicDD-Option] -- set_form_data -- Data before set of subforms:\n%s", + pformat(data), + ) - assert len(self.sub_forms) == num_subforms, f"{len(self.sub_forms)=}" + assert len(self.sub_forms) == num_subforms if not self.sub_forms: return @@ -3465,21 +3355,18 @@ class PageFormCompany(QWidget): header_layout.addWidget(title) vert_layout.addWidget(header_container) - # --- HAUPTINHALT --- + # --- MAIN CONTENT --- container = QWidget() - # SCROLL-BEREICH + # SCROLL AREA scroll_area = QScrollArea() - scroll_area.setWidgetResizable( - True - ) # WICHTIG: Erlaubt dem Grid im Inneren, sich an die Breite anzupassen + scroll_area.setWidgetResizable(True) scroll_area.setMinimumWidth(700) scroll_area.setMaximumWidth(1000) scroll_area.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) - # Optional: Rahmen der ScrollArea entfernen, damit es "flacher" und moderner aussieht + # optional: remove frame to look more modern scroll_area.setFrameShape(QFrame.Shape.NoFrame) scroll_area.setWidget(container) - # vert_layout.addSpacing(20) vert_layout.addWidget(scroll_area) container_layout = QVBoxLayout(container) @@ -3487,13 +3374,11 @@ class PageFormCompany(QWidget): # --- AUTO FORM LAYOUT --- container_layout.addSpacing(20) - # title = QLabel("--- Automatische Form ---") - # title.setStyleSheet("font-size: 14px; font-style: italic;") # font-weight: bold; self.auto_form = AutoForm(cfg=CONFIG_GRUNDERFASSUNG_UNTERNEHMEN) container_layout.addWidget(self.auto_form) self.auto_form.save_clicked_form.connect(lambda: self.save_clicked_form.emit()) - container_layout.addSpacing(30) + container_layout.addSpacing(15) # --- CUSTOM LOGIC --- # 'Bundesland' only if 'Inland' selected in 'Stammdaten' @@ -3554,7 +3439,6 @@ def clear_layout( clear_layout(child.layout()) -# 2. Das Hauptfenster mit dem Grid-Layout class MainWindow(QMainWindow): def __init__(self): super().__init__() @@ -3668,7 +3552,6 @@ class MainWindow(QMainWindow): for col_idx, title in enumerate(headers): self.header_grid.addWidget(HeaderCell(title), self.current_row, col_idx) - # self.current_row += 1 self.update_grid() return main_widget