generated from dopt-python/py311
basic database interaction
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user