basic database interaction

This commit is contained in:
2026-05-26 12:17:57 +02:00
parent 76a9bd4329
commit 5b2ca4f694
3 changed files with 214 additions and 98 deletions

View File

@@ -21,6 +21,7 @@ from typing_extensions import override
import babel
from dopt_basics.logging import BASE_LOGGER, setup_logging
from pydantic import (
AwareDatetime,
BaseModel,
ConfigDict,
EmailStr,
@@ -76,7 +77,9 @@ logger.setLevel(logging.DEBUG)
logger_search_widget = logger.getChild("search_widget")
logger_search_widget.setLevel(logging.DEBUG)
logger_get_data = logger.getChild("get_data")
logger_get_data.setLevel(logging.DEBUG)
logger_get_data.setLevel(logging.INFO)
logger_get_data_auto_form = logger.getChild("get_data_auto_form")
logger_get_data_auto_form.setLevel(logging.DEBUG)
QSS = """
*[styleClass="stempel"] {
@@ -770,8 +773,8 @@ def reset_form(
# TODO check if this behaviour is correct in other contexts, deactivated because of
# TODO company search widget
if form_field.readonly:
continue
# if form_field.readonly:
# continue
if isinstance(widget, QLineEdit):
widget.clear()
@@ -987,6 +990,7 @@ def set_widget_value(
if isinstance(widget, QLineEdit):
if isinstance(value, datetime.datetime):
value = value.astimezone()
value = value.strftime(DATETIME_FMT)
elif isinstance(value, datetime.date):
value = value.strftime(DATE_FMT)
@@ -1110,8 +1114,8 @@ def validate_form_data(
class Grunderfassung_Unternehmen(FlatBaseModel):
# default in SQLAlchemy with lambda and timezone-aware datetime)
Metadaten_erstellung: datetime.datetime | None = None
Metadaten_aktualisierung: datetime.datetime | None = None # see above
Metadaten_erstellung: AwareDatetime | None = None
Metadaten_aktualisierung: AwareDatetime | None = None # see above
Metadaten_nutzer: str | None
Grunderfassung_fallnummer: str
Grunderfassung_notiz: str | None
@@ -1722,7 +1726,7 @@ class AutoForm(QWidget):
if DEBUG:
self.test_button = QPushButton("Initialisiere Laden")
self.test_button.clicked.connect(self.on_load_clicked)
self.test_button.clicked.connect(self.load_data)
self.test_button.setFixedHeight(50)
self.test_button.setSizePolicy(
QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed
@@ -1731,6 +1735,19 @@ class AutoForm(QWidget):
button = QPushButton("GET DATA")
button.clicked.connect(self.get_form_data)
self.main_layout.addWidget(button)
id_field_layout = QHBoxLayout()
id_field_layout.setContentsMargins(0, 0, 0, 0)
id_field_layout.setSpacing(5)
id_field_label = QLabel("ID Datenbank:")
self.id_field_input = QLineEdit()
id_field_layout.addWidget(id_field_label)
id_field_layout.addWidget(self.id_field_input)
self.main_layout.addLayout(id_field_layout)
button_db_index = QPushButton("Setze DB Index")
button_db_index.clicked.connect(self._set_db_index)
self.main_layout.addWidget(button_db_index)
self.main_layout.addSpacing(10)
self.top_level_form_layout = QFormLayout()
@@ -1771,10 +1788,16 @@ class AutoForm(QWidget):
self.layout_btn.addWidget(self.reset_btn)
self.ignored_keys = ignored_keys
self.current_id: int = -1
# test button
# self.main_layout.addSpacing(10)
# self.main_layout.addWidget(self.test_button)
def _set_db_index(self) -> None:
index = int(self.id_field_input.text())
self.current_id = index
logger.debug("Set index to %d", self.current_id)
def _disable_save(self) -> None:
self.save_btn.setEnabled(False)
self.save_btn.setText(self.save_btn_txt_disabled)
@@ -1787,20 +1810,36 @@ class AutoForm(QWidget):
QTimer.singleShot(timeout + 1, lambda: self.save_btn.setShortcut("Ctrl+S"))
self.save_btn.setText(self.save_btn_txt_enabled)
def on_load_clicked(self) -> None:
def load_data(
self,
lookup_id: int | None = None,
) -> None:
# TODO change logic to database backend
logger_get_data.info(">>>> LOAD CLICKED")
loaded_data = load_pydantic_model_dict_db()
logger_get_data.debug("Loaded data dict. Passing to Pydantic...")
if lookup_id is None or lookup_id == 0:
lookup_id = self.current_id
self.reset_form()
logger_get_data_auto_form.debug("Lookup ID: %d", lookup_id)
if lookup_id > 0:
logger_get_data_auto_form.debug("Load from DB:")
loaded_data = be_init_rec.get_initial_recording(lookup_id)
else:
logger_get_data_auto_form.debug("Load from pickled object:")
loaded_data = load_pydantic_model_dict_db()
logger_get_data_auto_form.debug(
"Loaded data dict:\n%s Passing to Pydantic...", pformat(loaded_data)
)
model = Grunderfassung_Unternehmen(**loaded_data)
logger_get_data.debug("Loaded to Pydantic.")
logger_get_data.debug("Convert to GUI structure...")
logger_get_data_auto_form.debug("Loaded to Pydantic.")
logger_get_data_auto_form.debug("Convert to GUI structure...")
form_data = model.to_gui()
logger_get_data.debug("Set form data...")
logger_get_data.debug("Form data:\n%s", pformat(form_data))
# logger_get_data.debug("Widget registry:\n")
# pprint_registry(self.widget_registry)
logger_get_data_auto_form.debug("Set form data...")
# logger_get_data_auto_form.debug("Form data:\n%s", pformat(form_data))
self.set_form_data(form_data)
self.current_id = lookup_id
def on_save_clicked(self) -> None:
self._disable_save()
@@ -1827,8 +1866,7 @@ class AutoForm(QWidget):
try:
validated_data = Grunderfassung_Unternehmen(**form_data)
# # TODO remove
# validated_data.Metadaten_erstellung = datetime.datetime.now()
# # TODO add user?
# logger.debug("%s", pformat(validated_data.model_dump()))
except ValidationError as e:
# catch errors and show them in GUI
@@ -1854,8 +1892,8 @@ class AutoForm(QWidget):
QMessageBox.warning(self, "Eingabefehler", "\n".join(fehler_texte))
else:
# !! this code is only called if the 'try' block was successful
self.reset_form()
save_pydantic_model_dict_db(validated_data)
# save_pydantic_model_dict_db(validated_data)
# TODO save data to database
logger.info(
"\n\n>>>>>>>>>>>>> Form data without 'exlude':\n%s",
@@ -1869,7 +1907,16 @@ class AutoForm(QWidget):
),
pformat(validated_data.to_db(exclude=self.ignored_keys)),
)
db_data = validated_data.to_db(exclude=self.ignored_keys)
if self.current_id < 0:
logger.debug("Insert triggered")
be_init_rec.insert_initial_recording(db_data)
else:
logger.debug("Update triggered")
be_init_rec.update_initial_recording(self.current_id, db_data)
logger_get_data.info("Data saved successfully")
self.reset_form()
finally:
# always re-enable save, even if error occurred
self._enable_save()
@@ -1880,6 +1927,7 @@ class AutoForm(QWidget):
def reset_form(self) -> None:
reset_form(self.widget_registry)
self.current_id = -1
def get_form_data(self) -> dict[str, Any]:
form_data = get_form_data(self.widget_registry)