generated from dopt-python/py311
basic functionality of loading/saving for initial recording with new data model
This commit is contained in:
+120
-53
@@ -1622,7 +1622,6 @@ class InitRecForm(QWidget):
|
||||
logger_initrecform.debug("[InitRecForm] Loaded to Pydantic.")
|
||||
logger_initrecform.debug("[InitRecForm] Convert to GUI structure...")
|
||||
form_data_gui = model.to_gui()
|
||||
# TODO include set data in this method?
|
||||
self._set_data(form_data_gui)
|
||||
|
||||
def reset_form(self) -> None:
|
||||
@@ -2996,7 +2995,7 @@ class Page_NewEntry(QWidget):
|
||||
form_data=Page_InitRec_Form_Data(metadata={}, person={}, company={}),
|
||||
locked=False,
|
||||
)
|
||||
logger_gui.debug("[Page -- NewInitRec] State to call: %s", req_state)
|
||||
logger_gui.debug("[Page -- NewInitRec] State to call (IDs): %s", req_state.ids)
|
||||
self.new_initrec_requested.emit(req_state)
|
||||
|
||||
def _sync_state_to_GUI(self) -> None:
|
||||
@@ -3178,6 +3177,14 @@ class Page_InitRec(QWidget):
|
||||
)
|
||||
header_layout.addWidget(btn_state2gui)
|
||||
|
||||
btn_print_state = QPushButton("Print State")
|
||||
btn_print_state.clicked.connect(self._debug_print_state)
|
||||
btn_print_state.setFixedHeight(35)
|
||||
btn_print_state.setSizePolicy(
|
||||
QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed
|
||||
)
|
||||
header_layout.addWidget(btn_print_state)
|
||||
|
||||
# self.test_button = QPushButton("Initialisiere Laden")
|
||||
# self.test_button.clicked.connect(self._load_from_id)
|
||||
# self.test_button.setFixedHeight(35)
|
||||
@@ -3332,6 +3339,11 @@ class Page_InitRec(QWidget):
|
||||
self.container_layout.addStretch()
|
||||
self._update_layout()
|
||||
|
||||
def _debug_print_state(self) -> None:
|
||||
logger_initrecform.info(
|
||||
"[Page -- InitRec] Printing state IDs:\n%s", pformat(self.STATE.ids)
|
||||
)
|
||||
|
||||
def _update_layout(self) -> None:
|
||||
if self.STATE.recording_type is RecordingType.WITH_COMPANY:
|
||||
# add company
|
||||
@@ -3428,7 +3440,16 @@ class Page_InitRec(QWidget):
|
||||
self.delete_btn.setEnabled(False)
|
||||
|
||||
def _deletion_valid(self) -> bool:
|
||||
valid_id_states = (form.relevant_ids_set() for form in self.STATE.child_modules)
|
||||
# valid_id_states: list[bool] = []
|
||||
relevant_ent_types: set[EntityType] = {EntityType.METADATA, EntityType.PERSON}
|
||||
if self.STATE.recording_type is RecordingType.WITH_COMPANY:
|
||||
relevant_ent_types.add(EntityType.COMPANY)
|
||||
|
||||
valid_id_states = (
|
||||
form.relevant_ids_set()
|
||||
for form in self.STATE.child_modules
|
||||
if form.STATE.ent_type in relevant_ent_types
|
||||
)
|
||||
return all(valid_id_states)
|
||||
|
||||
def _delete_data(self) -> None:
|
||||
@@ -3465,18 +3486,50 @@ class Page_InitRec(QWidget):
|
||||
logger_initrecform.info("[Page -- InitRec] Load data method...")
|
||||
logger_initrecform.debug("[Page -- InitRec] Entity IDs: %s", ids)
|
||||
self._reset()
|
||||
|
||||
ids = EntityIds(
|
||||
# un_id=3,
|
||||
# an_id=7,
|
||||
pers_id=5,
|
||||
)
|
||||
|
||||
ids = EntityIds(
|
||||
link_id=7,
|
||||
)
|
||||
self.STATE.ids.update(ids, ignore_none=False)
|
||||
|
||||
if ids.empty():
|
||||
logger_initrecform.debug("[Page -- InitRec] Loading: No ID set. Do nothing!")
|
||||
return
|
||||
|
||||
# TODO add loading logic with backend call
|
||||
# !! just a dummy
|
||||
initrec: InitRec = InitRec(
|
||||
ids=ids,
|
||||
recording_type=RecordingType.WITHOUT_COMPANY,
|
||||
geloescht=None,
|
||||
form_data=Page_InitRec_Form_Data(
|
||||
metadata={},
|
||||
person={},
|
||||
company={},
|
||||
),
|
||||
)
|
||||
initrec = backend.page_initrec_from_db(ids)
|
||||
|
||||
# TODO re-enable later
|
||||
# if res.status != STATUS_HANDLER.SUCCESS:
|
||||
# logger_page_consulting.error(
|
||||
# (
|
||||
# "[Consulting Page] There were errors during the database "
|
||||
# "loading procedure."
|
||||
# ),
|
||||
# stack_info=True,
|
||||
# )
|
||||
|
||||
# exc_formatted = (
|
||||
# f"Exception: {res.status.ExceptionType}\nMessage: {res.status.message}"
|
||||
# )
|
||||
# msg_box = get_message_box(
|
||||
# QMessageBox.Icon.Warning,
|
||||
# "Laden fehlgeschlagen",
|
||||
# (
|
||||
# "Beim Laden der Daten ist ein Fehler aufgetreten. Details sind "
|
||||
# "unten angefügt."
|
||||
# ),
|
||||
# detailed_text=exc_formatted,
|
||||
# )
|
||||
# msg_box.exec()
|
||||
# return
|
||||
|
||||
self._load_from_pydantic(initrec, sync_to_GUI=False)
|
||||
|
||||
@@ -3487,28 +3540,31 @@ class Page_InitRec(QWidget):
|
||||
sync_to_GUI: bool = True,
|
||||
) -> None:
|
||||
logger_initrecform.info("[Page -- InitRec] Load from Pydantic model...")
|
||||
# TODO add logic to update internal state
|
||||
self.STATE.ids.update(data.ids)
|
||||
self.STATE.recording_type = data.recording_type
|
||||
self.STATE.form_data = data.form_data
|
||||
self.STATE.geloescht = True if data.geloescht else False
|
||||
|
||||
# set form data to correct initrec form states
|
||||
for ent_type, state in self.STATE.initrec_form_states.items():
|
||||
state.ids.update(self.STATE.ids)
|
||||
state.geloescht = self.STATE.geloescht
|
||||
|
||||
match ent_type:
|
||||
case EntityType.COMPANY:
|
||||
state.form_data = self.STATE.form_data.company
|
||||
# self.initrec_form_company.load_state(state)
|
||||
if (
|
||||
not update_only
|
||||
and self.STATE.recording_type is RecordingType.WITH_COMPANY
|
||||
):
|
||||
self.initrec_form_company.load_state(state)
|
||||
case EntityType.PERSON:
|
||||
state.form_data = self.STATE.form_data.person
|
||||
# self.initrec_form_person.load_state(state)
|
||||
if not update_only:
|
||||
self.initrec_form_person.load_state(state)
|
||||
case _:
|
||||
raise RuntimeError(f"Unspecified entity type {ent_type}")
|
||||
|
||||
if update_only:
|
||||
...
|
||||
else:
|
||||
...
|
||||
|
||||
if sync_to_GUI:
|
||||
self._sync_state_to_GUI(None)
|
||||
|
||||
@@ -3517,24 +3573,15 @@ class Page_InitRec(QWidget):
|
||||
section: Literal["content", "banners", "locking"] | None,
|
||||
) -> None:
|
||||
logger_page_initrec.debug(
|
||||
"[Page -- InitRec] Syncing state to GUI: State...\n%s", pformat(self.STATE)
|
||||
"[Page -- InitRec] Syncing state to GUI: State IDs: %s", self.STATE.ids
|
||||
)
|
||||
|
||||
if section is None or section == "content":
|
||||
self._update_layout()
|
||||
if not self.STATE.geloescht:
|
||||
self._load_database(self.STATE.ids)
|
||||
else:
|
||||
self._reset()
|
||||
|
||||
# initrec_form_state_person = Page_InitRec_Form_State(
|
||||
# session=self.STATE.session,
|
||||
# cfg=CONFIG_GRUNDERFASSUNG_PERSONEN,
|
||||
# ids=self.STATE.ids,
|
||||
# ent_type=RecordingType.WITHOUT_COMPANY,
|
||||
# locked=False,
|
||||
# )
|
||||
# self.initrec_form_person.load_state(initrec_form_state_person)
|
||||
self._update_layout()
|
||||
|
||||
if section is None or section == "banners":
|
||||
self._clear_info_banners()
|
||||
@@ -3546,13 +3593,14 @@ class Page_InitRec(QWidget):
|
||||
|
||||
if section is None or section == "locking":
|
||||
if self.STATE.locked:
|
||||
self.edit_buttons.set_modify_state(False, set_delete_btn=True)
|
||||
for form in self.STATE.child_modules:
|
||||
form.lock()
|
||||
self.edit_buttons.set_modify_state(False, set_delete_btn=True)
|
||||
else:
|
||||
self.edit_buttons.set_modify_state(True, set_delete_btn=False)
|
||||
for form in self.STATE.child_modules:
|
||||
form.unlock()
|
||||
self.edit_buttons.set_modify_state(True, set_delete_btn=False)
|
||||
self._activate_delete()
|
||||
|
||||
def _sync_GUI_to_state(self) -> None:
|
||||
logger_page_initrec.debug("[Page -- InitRec] Syncing GUI to state...")
|
||||
@@ -3641,7 +3689,13 @@ class Page_InitRec(QWidget):
|
||||
def save_data(self) -> None:
|
||||
logger_page_initrec.debug("[Page -- InitRec] Save button clicked...")
|
||||
|
||||
return
|
||||
logger_page_initrec.info("[Page -- InitRec] Syncing current state...")
|
||||
# state = self.get_state()
|
||||
self._sync_GUI_to_state()
|
||||
form_data = self.STATE.form_data
|
||||
assert form_data, "form data not set"
|
||||
logger_page_initrec.debug("[Page -- InitRec] Get form data\n%s", pformat(form_data))
|
||||
db_data = Page_InitRec_Form_Data(metadata={}, person={}, company={})
|
||||
|
||||
if self.STATE.ids.empty() and self.STATE.geloescht:
|
||||
logger_page_initrec.debug(
|
||||
@@ -3656,12 +3710,13 @@ class Page_InitRec(QWidget):
|
||||
)
|
||||
deleted_datetime = datetime.datetime.now(datetime.UTC)
|
||||
assert self.STATE.form_data, "cannot delete entry with uninitialised form data"
|
||||
to_db = InitRec(
|
||||
data_to_db = InitRec(
|
||||
ids=self.STATE.ids,
|
||||
recording_type=self.STATE.recording_type,
|
||||
geloescht=deleted_datetime,
|
||||
form_data={},
|
||||
form_data=db_data,
|
||||
)
|
||||
returned = self.cfg.to_db(to_db)
|
||||
returned = backend.page_initrec_to_db(data_to_db)
|
||||
self._load_from_pydantic(returned)
|
||||
msg_box = get_message_box(
|
||||
QMessageBox.Icon.Information,
|
||||
@@ -3679,33 +3734,45 @@ class Page_InitRec(QWidget):
|
||||
logger_page_initrec.error(
|
||||
"[Page -- InitRec] Error during GUI validation phase:\n%s", pformat(errors)
|
||||
)
|
||||
GUI_pydantic_validation_error_handling(errors)
|
||||
GUI_validation_error_handling(errors)
|
||||
self._enable_save()
|
||||
return
|
||||
|
||||
logger_page_initrec.info("[Page -- InitRec] Success! All data is valid")
|
||||
logger_page_initrec.info("[Page -- InitRec] Get form data call...")
|
||||
state = self.get_state()
|
||||
form_data = state.form_data
|
||||
assert form_data, "form data not set"
|
||||
|
||||
logger_page_initrec.debug("[Page -- InitRec] Get form data\n%s", pformat(form_data))
|
||||
|
||||
try:
|
||||
logger_page_initrec.debug("[Page -- InitRec] Call Pydantic...")
|
||||
validated_data = self.cfg.pydantic_model(**form_data)
|
||||
# validated_data = self.cfg.pydantic_model(**form_data)
|
||||
|
||||
for ent_type, state in self.STATE.initrec_form_states.items():
|
||||
logger_page_initrec.debug(
|
||||
"[Page -- InitRec] Ent type: %s, Current state CFG model: %s",
|
||||
ent_type,
|
||||
state.cfg.pydantic_model,
|
||||
)
|
||||
match ent_type:
|
||||
case EntityType.COMPANY:
|
||||
val_data = state.cfg.pydantic_model(**self.STATE.form_data.company)
|
||||
db_data.company = val_data.to_db(exclude=state.cfg.ignored_keys)
|
||||
case EntityType.PERSON:
|
||||
val_data = state.cfg.pydantic_model(**self.STATE.form_data.person)
|
||||
db_data.person = val_data.to_db(exclude=state.cfg.ignored_keys)
|
||||
case _:
|
||||
raise RuntimeError(f"Unspecified entity type {ent_type}")
|
||||
|
||||
except ValidationError as e:
|
||||
logger_page_initrec.error(
|
||||
"[Page -- InitRec] Error during Pydantic validation phase:\n%s",
|
||||
pformat(e.errors()),
|
||||
)
|
||||
pydantic_validation_error_handling(e)
|
||||
|
||||
else:
|
||||
if DEBUG_NO_DATABASE:
|
||||
return
|
||||
# !! this code is only called if the 'try' block was successful
|
||||
# save data to database
|
||||
db_data = validated_data.to_db(exclude=self.cfg.ignored_keys)
|
||||
# db_data = validated_data.to_db(exclude=self.cfg.ignored_keys)
|
||||
logger_page_initrec.debug(
|
||||
"[Page -- InitRec] Form data with 'exlude' (must be saved in the database):\n%s",
|
||||
pformat(db_data),
|
||||
@@ -3715,15 +3782,15 @@ class Page_InitRec(QWidget):
|
||||
deleted_datetime = datetime.datetime.now(datetime.UTC)
|
||||
try:
|
||||
# TODO change to result pattern
|
||||
to_db = InitRec(
|
||||
data_to_db = InitRec(
|
||||
ids=self.STATE.ids,
|
||||
# rec_id=self.STATE.rec_id,
|
||||
recording_type=self.STATE.recording_type,
|
||||
geloescht=deleted_datetime,
|
||||
form_data=db_data,
|
||||
)
|
||||
returned = self.cfg.to_db(to_db)
|
||||
returned = backend.page_initrec_to_db(data_to_db)
|
||||
|
||||
self._load_from_pydantic(returned)
|
||||
self._load_from_pydantic(returned, update_only=True, sync_to_GUI=False)
|
||||
self.update_triggered.emit()
|
||||
except Exception as err:
|
||||
msg_box = get_message_box(
|
||||
@@ -4958,7 +5025,7 @@ class Page_Consulting(QWidget):
|
||||
logger_page_consulting.error(
|
||||
"[Consulting Page] Error during GUI validation phase:\n%s", pformat(errors)
|
||||
)
|
||||
GUI_pydantic_validation_error_handling(errors)
|
||||
GUI_validation_error_handling(errors)
|
||||
self._enable_save()
|
||||
return
|
||||
|
||||
@@ -5964,7 +6031,7 @@ def pydantic_validation_error_handling(
|
||||
msg_box.exec()
|
||||
|
||||
|
||||
def GUI_pydantic_validation_error_handling(
|
||||
def GUI_validation_error_handling(
|
||||
errors: list[str],
|
||||
) -> None:
|
||||
error_text = "Bitte füllen Sie die folgenden Pflichtfelder aus:\n\n▸ " + "\n▸ ".join(
|
||||
|
||||
Reference in New Issue
Block a user