generated from dopt-python/py311
config based auto-generated form
This commit is contained in:
@@ -481,6 +481,39 @@ class CustomForm(Protocol):
|
|||||||
def validate_form_data(self) -> list[str]: ...
|
def validate_form_data(self) -> list[str]: ...
|
||||||
|
|
||||||
|
|
||||||
|
class AutoFormInsert(Protocol):
|
||||||
|
def __call__(
|
||||||
|
self,
|
||||||
|
data: dict[str, Any],
|
||||||
|
) -> None: ...
|
||||||
|
|
||||||
|
|
||||||
|
class AutoFormUpdate(Protocol):
|
||||||
|
def __call__(
|
||||||
|
self,
|
||||||
|
id_: int,
|
||||||
|
data: dict[str, Any],
|
||||||
|
) -> None: ...
|
||||||
|
|
||||||
|
|
||||||
|
class AutoFormGet(Protocol):
|
||||||
|
def __call__(
|
||||||
|
self,
|
||||||
|
id_: int,
|
||||||
|
) -> dict[str, Any]: ...
|
||||||
|
|
||||||
|
|
||||||
|
@dc.dataclass(slots=True)
|
||||||
|
class AutoFormConfig:
|
||||||
|
model: type[FlatBaseModel]
|
||||||
|
data_insert: AutoFormInsert
|
||||||
|
data_update: AutoFormUpdate
|
||||||
|
data_get: AutoFormGet
|
||||||
|
form_fields: Sequence[FormField]
|
||||||
|
ignored_keys: Iterable[str] = tuple()
|
||||||
|
add_buttons: bool = True
|
||||||
|
|
||||||
|
|
||||||
class CustomWidget(QWidget):
|
class CustomWidget(QWidget):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@@ -904,12 +937,6 @@ def update_sub_forms(
|
|||||||
del widget_registry[key]
|
del widget_registry[key]
|
||||||
|
|
||||||
|
|
||||||
@dc.dataclass(slots=True)
|
|
||||||
class FormData:
|
|
||||||
data: dict[str, Any]
|
|
||||||
ignored_keys: Iterable[str]
|
|
||||||
|
|
||||||
|
|
||||||
def get_form_data(
|
def get_form_data(
|
||||||
widget_registry: WidgetRegistry,
|
widget_registry: WidgetRegistry,
|
||||||
filter_keys: Container[str] = tuple(),
|
filter_keys: Container[str] = tuple(),
|
||||||
@@ -1682,11 +1709,10 @@ def search_widgets_by_key(
|
|||||||
class AutoForm(QWidget):
|
class AutoForm(QWidget):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
form_fields: Sequence[FormField],
|
cfg: AutoFormConfig,
|
||||||
add_buttons: bool = True,
|
|
||||||
ignored_keys: Iterable[str] = tuple(),
|
|
||||||
) -> None:
|
) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
self.cfg = cfg
|
||||||
self.setStyleSheet("""
|
self.setStyleSheet("""
|
||||||
QGroupBox {
|
QGroupBox {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
@@ -1754,7 +1780,7 @@ class AutoForm(QWidget):
|
|||||||
self.main_layout.addLayout(self.top_level_form_layout)
|
self.main_layout.addLayout(self.top_level_form_layout)
|
||||||
self.top_level_form_layout.setSpacing(10)
|
self.top_level_form_layout.setSpacing(10)
|
||||||
|
|
||||||
self.form_fields = form_fields
|
self.form_fields = self.cfg.form_fields
|
||||||
self.widget_registry: WidgetRegistry = {}
|
self.widget_registry: WidgetRegistry = {}
|
||||||
|
|
||||||
_build_ui_recursively(
|
_build_ui_recursively(
|
||||||
@@ -1764,7 +1790,7 @@ class AutoForm(QWidget):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# buttons (save and reset)
|
# buttons (save and reset)
|
||||||
self.add_buttons = add_buttons
|
self.add_buttons = self.cfg.add_buttons
|
||||||
if self.add_buttons:
|
if self.add_buttons:
|
||||||
self.layout_btn = QHBoxLayout()
|
self.layout_btn = QHBoxLayout()
|
||||||
self.main_layout.addLayout(self.layout_btn)
|
self.main_layout.addLayout(self.layout_btn)
|
||||||
@@ -1787,7 +1813,7 @@ class AutoForm(QWidget):
|
|||||||
self.reset_btn.clicked.connect(self.reset_form)
|
self.reset_btn.clicked.connect(self.reset_form)
|
||||||
self.layout_btn.addWidget(self.reset_btn)
|
self.layout_btn.addWidget(self.reset_btn)
|
||||||
|
|
||||||
self.ignored_keys = ignored_keys
|
# self.ignored_keys = ignored_keys
|
||||||
self.current_id: int = -1
|
self.current_id: int = -1
|
||||||
# test button
|
# test button
|
||||||
# self.main_layout.addSpacing(10)
|
# self.main_layout.addSpacing(10)
|
||||||
@@ -1824,7 +1850,8 @@ class AutoForm(QWidget):
|
|||||||
|
|
||||||
if lookup_id > 0:
|
if lookup_id > 0:
|
||||||
logger_get_data_auto_form.debug("Load from DB:")
|
logger_get_data_auto_form.debug("Load from DB:")
|
||||||
loaded_data = be_init_rec.get_initial_recording(lookup_id)
|
loaded_data = self.cfg.data_get(lookup_id)
|
||||||
|
# loaded_data = be_init_rec.get_initial_recording(lookup_id)
|
||||||
else:
|
else:
|
||||||
logger_get_data_auto_form.debug("Load from pickled object:")
|
logger_get_data_auto_form.debug("Load from pickled object:")
|
||||||
loaded_data = load_pydantic_model_dict_db()
|
loaded_data = load_pydantic_model_dict_db()
|
||||||
@@ -1865,7 +1892,7 @@ class AutoForm(QWidget):
|
|||||||
logger.debug("------------>>>>>>>>> Call Pydantic")
|
logger.debug("------------>>>>>>>>> Call Pydantic")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
validated_data = Grunderfassung_Unternehmen(**form_data)
|
validated_data = self.cfg.model(**form_data)
|
||||||
# # TODO add user?
|
# # TODO add user?
|
||||||
# logger.debug("%s", pformat(validated_data.model_dump()))
|
# logger.debug("%s", pformat(validated_data.model_dump()))
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
@@ -1905,15 +1932,17 @@ class AutoForm(QWidget):
|
|||||||
"\n\n>>>>>>>>>>>>> Form data with 'exlude' "
|
"\n\n>>>>>>>>>>>>> Form data with 'exlude' "
|
||||||
"(must be saved in the database):\n%s"
|
"(must be saved in the database):\n%s"
|
||||||
),
|
),
|
||||||
pformat(validated_data.to_db(exclude=self.ignored_keys)),
|
pformat(validated_data.to_db(exclude=self.cfg.ignored_keys)),
|
||||||
)
|
)
|
||||||
db_data = validated_data.to_db(exclude=self.ignored_keys)
|
db_data = validated_data.to_db(exclude=self.cfg.ignored_keys)
|
||||||
if self.current_id < 0:
|
if self.current_id < 0:
|
||||||
logger.debug("Insert triggered")
|
logger.debug("Insert triggered")
|
||||||
be_init_rec.insert_initial_recording(db_data)
|
self.cfg.data_insert(db_data)
|
||||||
|
# be_init_rec.insert_initial_recording(db_data)
|
||||||
else:
|
else:
|
||||||
logger.debug("Update triggered")
|
logger.debug("Update triggered")
|
||||||
be_init_rec.update_initial_recording(self.current_id, db_data)
|
self.cfg.data_update(self.current_id, db_data)
|
||||||
|
# be_init_rec.update_initial_recording(self.current_id, db_data)
|
||||||
|
|
||||||
logger_get_data.info("Data saved successfully")
|
logger_get_data.info("Data saved successfully")
|
||||||
self.reset_form()
|
self.reset_form()
|
||||||
@@ -3283,6 +3312,18 @@ FORM_FIELDS = [
|
|||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
CONFIG_GRUNDERFASSUNG_UNTERNEHMEN: Final[AutoFormConfig] = AutoFormConfig(
|
||||||
|
model=Grunderfassung_Unternehmen,
|
||||||
|
data_insert=be_init_rec.insert_initial_recording,
|
||||||
|
data_update=be_init_rec.update_initial_recording,
|
||||||
|
data_get=be_init_rec.get_initial_recording,
|
||||||
|
ignored_keys=(
|
||||||
|
"Metadaten_erstellung",
|
||||||
|
"Metadaten_aktualisierung",
|
||||||
|
),
|
||||||
|
form_fields=FORM_FIELDS,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class SearchFormPage(QWidget):
|
class SearchFormPage(QWidget):
|
||||||
back_main_requested = Signal() # Signal für den Zurück-Button
|
back_main_requested = Signal() # Signal für den Zurück-Button
|
||||||
@@ -3427,15 +3468,7 @@ class SearchFormPage(QWidget):
|
|||||||
title.setStyleSheet("font-size: 14px; font-style: italic;") # font-weight: bold;
|
title.setStyleSheet("font-size: 14px; font-style: italic;") # font-weight: bold;
|
||||||
container_layout.addWidget(title)
|
container_layout.addWidget(title)
|
||||||
# container_layout.addWidget(MyFormPart(FORM_FIELD_DEF, "Test-Gruppe"))
|
# container_layout.addWidget(MyFormPart(FORM_FIELD_DEF, "Test-Gruppe"))
|
||||||
container_layout.addWidget(
|
container_layout.addWidget(AutoForm(cfg=CONFIG_GRUNDERFASSUNG_UNTERNEHMEN))
|
||||||
AutoForm(
|
|
||||||
FORM_FIELDS,
|
|
||||||
ignored_keys=(
|
|
||||||
"Metadaten_erstellung",
|
|
||||||
"Metadaten_aktualisierung",
|
|
||||||
),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
container_layout.addSpacing(30)
|
container_layout.addSpacing(30)
|
||||||
|
|
||||||
|
|||||||
@@ -150,12 +150,12 @@ def insert_initial_recording(
|
|||||||
|
|
||||||
|
|
||||||
def update_initial_recording(
|
def update_initial_recording(
|
||||||
erfassung_id: int,
|
id_: int,
|
||||||
data: dict[str, Any],
|
data: dict[str, Any],
|
||||||
) -> None:
|
) -> None:
|
||||||
stmt = (
|
stmt = (
|
||||||
db.grunderfassung_unternehmen.update()
|
db.grunderfassung_unternehmen.update()
|
||||||
.where(db.grunderfassung_unternehmen.c.erfassung_id == erfassung_id)
|
.where(db.grunderfassung_unternehmen.c.erfassung_id == id_)
|
||||||
.values(data)
|
.values(data)
|
||||||
)
|
)
|
||||||
with db.ENGINE.begin() as conn:
|
with db.ENGINE.begin() as conn:
|
||||||
@@ -163,16 +163,16 @@ def update_initial_recording(
|
|||||||
|
|
||||||
|
|
||||||
def get_initial_recording(
|
def get_initial_recording(
|
||||||
erfassung_id: int,
|
id_: int,
|
||||||
) -> dict[str, Any]:
|
) -> dict[str, Any]:
|
||||||
stmt = db.grunderfassung_unternehmen.select().where(
|
stmt = db.grunderfassung_unternehmen.select().where(
|
||||||
db.grunderfassung_unternehmen.c.erfassung_id == erfassung_id
|
db.grunderfassung_unternehmen.c.erfassung_id == id_
|
||||||
)
|
)
|
||||||
with db.ENGINE.begin() as conn:
|
with db.ENGINE.begin() as conn:
|
||||||
ret = conn.execute(stmt)
|
ret = conn.execute(stmt)
|
||||||
|
|
||||||
row = ret.fetchone()
|
row = ret.fetchone()
|
||||||
if row is None:
|
if row is None:
|
||||||
raise KeyError(f"Database ID {erfassung_id} not found")
|
raise KeyError(f"Database ID {id_} not found")
|
||||||
|
|
||||||
return row._asdict()
|
return row._asdict()
|
||||||
|
|||||||
Reference in New Issue
Block a user