Dev #7

Merged
foefl merged 74 commits from dev into main 2026-07-31 14:19:01 +00:00
6 changed files with 271 additions and 65 deletions
Showing only changes of commit 449d401c04 - Show all commits
+32
View File
@@ -21,6 +21,38 @@ from wce_crm import constants, db
from wce_crm.backend import backend from wce_crm.backend import backend
from wce_crm.types import EntityIds, RecordingType from wce_crm.types import EntityIds, RecordingType
# %%
empty = tuple()
# not any(empty)
all(empty)
# %%
dic = {
"t1": "test1",
"t2": "test2",
"t3": "test3",
"t4": "test4",
}
filter_keys = frozenset(("t3", "t2"))
dic_in, dic_out = backend.split_dict(dic, filter_keys)
print(f"{dic_in=}")
print(f"{dic_out=}")
# %%
dic_update = {
"t5": "new",
"t6": "new_2",
}
dic_updated = backend.dic_deep_update(dic, dic_update)
print(f"{dic=}")
print(f"{dic_update=}")
print(f"{dic_updated=}")
# %% # %%
raw_ent_ids = EntityIds() raw_ent_ids = EntityIds()
db_ent_ids = EntityIds(un_id=3, an_id=2) db_ent_ids = EntityIds(un_id=3, an_id=2)
+47 -26
View File
@@ -2,8 +2,9 @@ from __future__ import annotations
import copy import copy
import datetime import datetime
from collections.abc import Container, Mapping
from pprint import pformat from pprint import pformat
from typing import TYPE_CHECKING, Any, cast from typing import TYPE_CHECKING, Any, TypeVar, cast
import polars as pl import polars as pl
import sqlalchemy as sa import sqlalchemy as sa
@@ -15,6 +16,7 @@ from wce_crm.constants import TIMEZONE_CEST
from wce_crm.data_models import ( from wce_crm.data_models import (
FIELD_DB_MAPPING_GRUNDERERFASSUNG_PERSONEN, FIELD_DB_MAPPING_GRUNDERERFASSUNG_PERSONEN,
FIELD_DB_MAPPING_GRUNDERERFASSUNG_UNTERNEHMEN, FIELD_DB_MAPPING_GRUNDERERFASSUNG_UNTERNEHMEN,
FIELD_DB_SPLIT_METADATEN,
Beratungsgespraech_Einzelgespraech, Beratungsgespraech_Einzelgespraech,
Beratungsgespraech_Vorgang, Beratungsgespraech_Vorgang,
InitRec, InitRec,
@@ -40,6 +42,9 @@ if TYPE_CHECKING:
from wce_crm.types import ConsId, ExtAnId, ExtMaId, RecId from wce_crm.types import ConsId, ExtAnId, ExtMaId, RecId
K = TypeVar("K")
V = TypeVar("V")
def _transform_for_gui_output( def _transform_for_gui_output(
data: pl.DataFrame, data: pl.DataFrame,
@@ -355,6 +360,30 @@ def initrec_comp_contact_person_search_get_info(
# return dict(row) # return dict(row)
def split_dict(
dic: dict[K, V],
split_keys: Container[K],
) -> tuple[dict[K, V], dict[K, V]]:
keys_in: dict[K, V] = {}
keys_out = copy.deepcopy(dic)
for check_key in dic:
if check_key in split_keys:
keys_in[check_key] = keys_out.pop(check_key)
return keys_in, keys_out
def dic_deep_update(
dic: dict[K, V],
data: Mapping[K, V],
) -> dict[K, V]:
dic_copy = copy.deepcopy(dic)
dic_copy.update(data)
return dic_copy
def _rename_db_data( def _rename_db_data(
db_data: dict[str, Any], db_data: dict[str, Any],
mapping: DualDict, mapping: DualDict,
@@ -379,18 +408,15 @@ def page_initrec_to_db(
with db.ENGINE.begin() as conn: with db.ENGINE.begin() as conn:
# person # person
dump_data = _rename_db_data( dump_data = dic_deep_update(data.form_data.person, data.form_data.metadata)
data.form_data.person, FIELD_DB_MAPPING_GRUNDERERFASSUNG_PERSONEN dump_data = _rename_db_data(dump_data, FIELD_DB_MAPPING_GRUNDERERFASSUNG_PERSONEN)
)
dump_data["geloescht"] = data.geloescht dump_data["geloescht"] = data.geloescht
if data.ids.pers_id is None: if data.ids.pers_id is None:
logger.debug("[InitRec -- backend] Insert...") logger.debug("[InitRec -- backend] Insert...")
stmt = sa.insert(db.t_grunderfassung_personen).returning( stmt = sa.insert(db.t_grunderfassung_personen).returning(
db.t_grunderfassung_personen.c.pers_id, db.t_grunderfassung_personen
db.t_grunderfassung_personen.c.aktualisiert,
db.t_grunderfassung_personen.c.geloescht,
) )
stmt_compiled = str(stmt.compile(db.ENGINE)) stmt_compiled = str(stmt.compile(db.ENGINE))
logger.debug( logger.debug(
@@ -409,10 +435,6 @@ def page_initrec_to_db(
) )
data.ids.pers_id = data_from_db["pers_id"] data.ids.pers_id = data_from_db["pers_id"]
data.geloescht = data_from_db["geloescht"]
data.form_data.person["Metadaten_aktualisierung"] = data_from_db[
"Metadaten_aktualisierung"
]
logger.debug("[AutoForm -- backend] Inserted InitRec Person successfully") logger.debug("[AutoForm -- backend] Inserted InitRec Person successfully")
@@ -421,10 +443,7 @@ def page_initrec_to_db(
stmt = ( stmt = (
db.t_grunderfassung_personen.update() db.t_grunderfassung_personen.update()
.where(db.t_grunderfassung_personen.c.pers_id == data.ids.pers_id) .where(db.t_grunderfassung_personen.c.pers_id == data.ids.pers_id)
.returning( .returning(db.t_grunderfassung_personen)
db.t_grunderfassung_personen.c.aktualisiert,
db.t_grunderfassung_personen.c.geloescht,
)
) )
ret = conn.execute(stmt, dump_data) ret = conn.execute(stmt, dump_data)
@@ -435,16 +454,22 @@ def page_initrec_to_db(
data_from_db, FIELD_DB_MAPPING_GRUNDERERFASSUNG_PERSONEN data_from_db, FIELD_DB_MAPPING_GRUNDERERFASSUNG_PERSONEN
) )
data.geloescht = data_from_db["geloescht"] # data.geloescht = data_from_db["geloescht"]
data.form_data.person["Metadaten_aktualisierung"] = data_from_db[ # data.form_data.person["Metadaten_aktualisierung"] = data_from_db[
"Metadaten_aktualisierung" # "Metadaten_aktualisierung"
] # ]
logger.debug( logger.debug(
"[InitRec -- backend] Updated InitRec Person with ID %d successfully", "[InitRec -- backend] Updated InitRec Person with ID %d successfully",
data.ids.pers_id, data.ids.pers_id,
) )
data.geloescht = data_from_db["geloescht"]
del data_from_db["geloescht"]
in_filter, out_filter = split_dict(data_from_db, FIELD_DB_SPLIT_METADATEN)
data.form_data.metadata = in_filter
data.form_data.person = out_filter
# company # company
if data.recording_type is RecordingType.WITH_COMPANY: if data.recording_type is RecordingType.WITH_COMPANY:
# insert into company table and add additional information # insert into company table and add additional information
@@ -475,11 +500,6 @@ def page_initrec_to_db(
stmt = sqlite_insert(db.t_zuordnung_personen_unternehmen).values( stmt = sqlite_insert(db.t_zuordnung_personen_unternehmen).values(
**dump_data, pers_id=data.ids.pers_id **dump_data, pers_id=data.ids.pers_id
) )
# dump_data["geloescht"] = data.geloescht
# logger.debug(
# "[InitRec -- backend] Company - additional info: Dump Data = \n%s",
# pformat(dump_data),
# )
stmt = stmt.on_conflict_do_update( stmt = stmt.on_conflict_do_update(
index_elements=["un_id", "pers_id"], index_elements=["un_id", "pers_id"],
@@ -571,10 +591,11 @@ def page_initrec_from_db(
) )
geloescht = data_person_table["geloescht"] geloescht = data_person_table["geloescht"]
del data_person_table["geloescht"] del data_person_table["geloescht"]
in_filter, out_filter = split_dict(data_person_table, FIELD_DB_SPLIT_METADATEN)
form_data = Page_InitRec_Form_Data( form_data = Page_InitRec_Form_Data(
metadata={}, metadata=in_filter,
person=data_person_table, person=out_filter,
company=data_company_table, company=data_company_table,
) )
+66 -18
View File
@@ -19,7 +19,7 @@ from pydantic import (
) )
from pydantic_core import ErrorDetails from pydantic_core import ErrorDetails
from wce_crm.form_defs import INITREC_COMP, INITREC_PERSON, FormField from wce_crm.form_defs import INITREC_COMP, INITREC_METADATEN, INITREC_PERSON, FormField
from wce_crm.types import ConsultingType, EntityIds, EntityType, RecordingType from wce_crm.types import ConsultingType, EntityIds, EntityType, RecordingType
if TYPE_CHECKING: if TYPE_CHECKING:
@@ -222,10 +222,22 @@ class Page_NewEntry_State(PageState[Module]):
session: Session session: Session
INITREC_REC_TO_ENTITIES: Final[dict[RecordingType, frozenset[EntityType]]] = { # TODO check removal
RecordingType.WITH_COMPANY: frozenset((EntityType.COMPANY, EntityType.PERSON)), # INITREC_REC_TO_ENTITIES: Final[dict[RecordingType, frozenset[EntityType]]] = {
RecordingType.WITHOUT_COMPANY: frozenset((EntityType.PERSON,)), # RecordingType.WITH_COMPANY: frozenset(
} # (
# EntityType.METADATA,
# EntityType.COMPANY,
# EntityType.PERSON,
# )
# ),
# RecordingType.WITHOUT_COMPANY: frozenset(
# (
# EntityType.METADATA,
# EntityType.PERSON,
# )
# ),
# }
@dc.dataclass(slots=True, kw_only=True) @dc.dataclass(slots=True, kw_only=True)
@@ -251,7 +263,16 @@ class Page_InitRec_State(PageState["InitRecForm"]):
# pydantic_models: dict[RecordingType, type[FlatBaseModel]] = dc.field(default_factory=dict) # pydantic_models: dict[RecordingType, type[FlatBaseModel]] = dc.field(default_factory=dict)
def __post_init__(self) -> None: def __post_init__(self) -> None:
relevant_entities = INITREC_REC_TO_ENTITIES[self.recording_type] # TODO check removal
# relevant_entities = INITREC_REC_TO_ENTITIES[self.recording_type]
relevant_entities = frozenset(
(
EntityType.METADATA,
EntityType.COMPANY,
EntityType.PERSON,
)
)
for ent_type in relevant_entities: for ent_type in relevant_entities:
initrec_form_state = Page_InitRec_Form_State( initrec_form_state = Page_InitRec_Form_State(
session=self.session, session=self.session,
@@ -483,11 +504,33 @@ FIELD_DB_MAPPING_GRUNDERERFASSUNG_PERSONEN: Final[DualDict[str, str]] = DualDict
Metadaten_erstellung="erstellt", Metadaten_erstellung="erstellt",
Metadaten_aktualisierung="aktualisiert", Metadaten_aktualisierung="aktualisiert",
) )
FIELD_DB_MAPPING_GRUNDERERFASSUNG_UNTERNEHMEN: Final[DualDict[str, str]] = DualDict( FIELD_DB_MAPPING_GRUNDERERFASSUNG_UNTERNEHMEN: Final[DualDict[str, str]] = DualDict(
Partnersuche__un_suche="un_id", Partnersuche__un_suche="un_id",
Partnersuche__person_suche="an_id", Partnersuche__person_suche="an_id",
) )
FIELD_DB_SPLIT_METADATEN: Final[frozenset[str]] = frozenset(
(
"Metadaten_erstellung",
"Metadaten_aktualisierung",
"Metadaten_nutzer",
"Metadaten_wiedereintrittsdatum",
"Grunderfassung_fallnummer",
"Grunderfassung_notiz",
)
)
class Grunderfassung_Metadaten(FlatBaseModel):
# displayed and handled separately, on database level included in 'Person'
Metadaten_erstellung: AwareDatetime | None = None
Metadaten_aktualisierung: AwareDatetime | None = None # see above
Metadaten_nutzer: str | None
Metadaten_wiedereintrittsdatum: datetime.date | None = None
Grunderfassung_fallnummer: str
Grunderfassung_notiz: str | None
class Grunderfassung_Unternehmen(FlatBaseModel): class Grunderfassung_Unternehmen(FlatBaseModel):
# default in SQLAlchemy with lambda and timezone-aware datetime # default in SQLAlchemy with lambda and timezone-aware datetime
@@ -502,12 +545,9 @@ class Grunderfassung_Unternehmen(FlatBaseModel):
class Grunderfassung_Personen(FlatBaseModel): class Grunderfassung_Personen(FlatBaseModel):
# default in SQLAlchemy with lambda and timezone-aware datetime # default in SQLAlchemy with lambda and timezone-aware datetime
Metadaten_erstellung: AwareDatetime | None = None # Metadaten_erstellung: AwareDatetime | None = None
Metadaten_aktualisierung: AwareDatetime | None = None # see above # Metadaten_aktualisierung: AwareDatetime | None = None # see above
Metadaten_nutzer: str | None # Metadaten_nutzer: str | None
Metadaten_wiedereintrittsdatum: datetime.date | None = None
Grunderfassung_fallnummer: str
Grunderfassung_notiz: str | None
Projektrelevanz: Grunderfassung_Projektrelevanz Projektrelevanz: Grunderfassung_Projektrelevanz
Kontaktperson: Grunderfassung_Kontaktperson Kontaktperson: Grunderfassung_Kontaktperson
@@ -694,12 +734,19 @@ class Beratungsgespraech_Einzelgespraech(BaseModel):
INITREC_CONFIGS: Final[dict[EntityType, Page_InitRec_Form_Config]] = { INITREC_CONFIGS: Final[dict[EntityType, Page_InitRec_Form_Config]] = {
EntityType.COMPANY: Page_InitRec_Form_Config( EntityType.METADATA: Page_InitRec_Form_Config(
pydantic_model=Grunderfassung_Unternehmen, pydantic_model=Grunderfassung_Metadaten,
ignored_keys=( ignored_keys=(
"Metadaten_erstellung", "Metadaten_erstellung",
"Metadaten_aktualisierung", "Metadaten_aktualisierung",
), ),
form_fields=INITREC_METADATEN,
add_buttons=False,
id_mapping={},
),
EntityType.COMPANY: Page_InitRec_Form_Config(
pydantic_model=Grunderfassung_Unternehmen,
ignored_keys=tuple(),
form_fields=INITREC_COMP, form_fields=INITREC_COMP,
add_buttons=False, add_buttons=False,
id_mapping={ id_mapping={
@@ -709,10 +756,11 @@ INITREC_CONFIGS: Final[dict[EntityType, Page_InitRec_Form_Config]] = {
), ),
EntityType.PERSON: Page_InitRec_Form_Config( EntityType.PERSON: Page_InitRec_Form_Config(
pydantic_model=Grunderfassung_Personen, pydantic_model=Grunderfassung_Personen,
ignored_keys=( ignored_keys=tuple(),
"Metadaten_erstellung", # ignored_keys=(
"Metadaten_aktualisierung", # "Metadaten_erstellung",
), # "Metadaten_aktualisierung",
# ),
form_fields=INITREC_PERSON, form_fields=INITREC_PERSON,
add_buttons=False, add_buttons=False,
id_mapping={}, id_mapping={},
+63 -17
View File
@@ -187,7 +187,7 @@ COUNTRY_LIST: Final[CountryList] = get_country_list_german()
GERMAN_STATE_LIST: Final[CountryList] = get_list_germany_states() GERMAN_STATE_LIST: Final[CountryList] = get_list_germany_states()
INITREC_COMP_SEARCH_HEAD = [ _INITREC_COMP_SEARCH_HEAD = [
FormField( FormField(
"Suche", "Suche",
FormFieldType.EXTENDED_DROPDOWN, FormFieldType.EXTENDED_DROPDOWN,
@@ -329,7 +329,7 @@ INITREC_COMP_SEARCH_HEAD = [
), ),
] ]
INITREC_CONTACT_PERSON = [ _INITREC_CONTACT_PERSON = [
# TODO check removal # TODO check removal
FormField( FormField(
"Name Unternehmen/Netzwerkpartner (vorausgefüllt von Suche)", "Name Unternehmen/Netzwerkpartner (vorausgefüllt von Suche)",
@@ -400,7 +400,7 @@ INITREC_CONTACT_PERSON = [
] ]
INITREC_MASTER_DATA = [ _INITREC_MASTER_DATA = [
FormField( FormField(
"Titel", "Titel",
FormFieldType.TEXT, FormFieldType.TEXT,
@@ -560,7 +560,7 @@ INITREC_MASTER_DATA = [
] ]
INITREC_ADDITIONAL_DATA = [ _INITREC_ADDITIONAL_DATA = [
FormField( FormField(
"Deutsch als Kommunikationssprache", "Deutsch als Kommunikationssprache",
FormFieldType.DROPDOWN, FormFieldType.DROPDOWN,
@@ -635,7 +635,7 @@ INITREC_ADDITIONAL_DATA = [
] ]
INITREC_SCHOOL = [ _INITREC_SCHOOL = [
FormField("Abschluss", FormFieldType.TEXT, required=False, key="SB_abschluss"), FormField("Abschluss", FormFieldType.TEXT, required=False, key="SB_abschluss"),
FormField( FormField(
"Abschlussgrad laut Dokument", "Abschlussgrad laut Dokument",
@@ -673,7 +673,7 @@ INITREC_SCHOOL = [
] ]
INITREC_HIGHER_EDUCATION = [ _INITREC_HIGHER_EDUCATION = [
FormField( FormField(
"Anerkennung", "Anerkennung",
FormFieldType.TEXT, FormFieldType.TEXT,
@@ -742,7 +742,7 @@ INITREC_HIGHER_EDUCATION = [
] ]
INITREC_WORK_EXPERIENCE = [ _INITREC_WORK_EXPERIENCE = [
FormField( FormField(
"Branche", "Branche",
FormFieldType.DROPDOWN, FormFieldType.DROPDOWN,
@@ -835,7 +835,7 @@ INITREC_WORK_EXPERIENCE = [
] ]
INITREC_LANGUAGES = [ _INITREC_LANGUAGES = [
FormField( FormField(
"Sprache", "Sprache",
FormFieldType.TEXT, FormFieldType.TEXT,
@@ -930,11 +930,11 @@ INITREC_COMP = [
FormFieldType.CUSTOM, FormFieldType.CUSTOM,
custom_widget="grunderfassung_unternehmen_suche", custom_widget="grunderfassung_unternehmen_suche",
key="Partnersuche", key="Partnersuche",
children=INITREC_COMP_SEARCH_HEAD, children=_INITREC_COMP_SEARCH_HEAD,
), ),
] ]
INITREC_PERSON = [ INITREC_METADATEN = [
FormField( FormField(
"Ersteintrag Datum", "Ersteintrag Datum",
FormFieldType.TEXT_DATETIME, FormFieldType.TEXT_DATETIME,
@@ -978,6 +978,52 @@ INITREC_PERSON = [
required=False, required=False,
key="Grunderfassung_notiz", key="Grunderfassung_notiz",
), ),
]
INITREC_PERSON = [
# FormField(
# "Ersteintrag Datum",
# FormFieldType.TEXT_DATETIME,
# required=False,
# key="Metadaten_erstellung",
# readonly=True,
# ignore_get_data=True,
# ),
# FormField(
# "Aktualisierung Datum",
# FormFieldType.TEXT_DATETIME,
# required=False,
# key="Metadaten_aktualisierung",
# readonly=True,
# ignore_get_data=True,
# ),
# FormField(
# "Aktualisierung Nutzer",
# FormFieldType.TEXT,
# required=False,
# key="Metadaten_nutzer",
# readonly=True,
# ignore_get_data=False,
# ),
# FormField(
# "Wiedereintrittsdatum",
# FormFieldType.DATE,
# required=False,
# key="Metadaten_wiedereintrittsdatum",
# readonly=False,
# ),
# FormField(
# "Fallnummer",
# FormFieldType.TEXT,
# required=True,
# key="Grunderfassung_fallnummer",
# ),
# FormField(
# "Notizen",
# FormFieldType.LONGTEXT,
# required=False,
# key="Grunderfassung_notiz",
# ),
FormField( FormField(
"Status && Projektrelevanz", "Status && Projektrelevanz",
FormFieldType.GROUP, FormFieldType.GROUP,
@@ -1009,42 +1055,42 @@ INITREC_PERSON = [
"Daten Kontaktperson", "Daten Kontaktperson",
FormFieldType.GROUP, FormFieldType.GROUP,
key="Kontaktperson", key="Kontaktperson",
children=INITREC_CONTACT_PERSON, children=_INITREC_CONTACT_PERSON,
), ),
FormField( FormField(
"Stammdaten", "Stammdaten",
FormFieldType.GROUP, FormFieldType.GROUP,
key="Stammdaten", key="Stammdaten",
children=INITREC_MASTER_DATA, children=_INITREC_MASTER_DATA,
), ),
FormField( FormField(
"Weitere Informationen", "Weitere Informationen",
FormFieldType.GROUP, FormFieldType.GROUP,
key="WeitereInfos", key="WeitereInfos",
children=INITREC_ADDITIONAL_DATA, children=_INITREC_ADDITIONAL_DATA,
), ),
FormField( FormField(
"Schulbildung", "Schulbildung",
FormFieldType.DYNAMIC_LIST, FormFieldType.DYNAMIC_LIST,
children=INITREC_SCHOOL, children=_INITREC_SCHOOL,
key="Schulbildung", key="Schulbildung",
), ),
FormField( FormField(
"Studium/Ausbildung", "Studium/Ausbildung",
FormFieldType.DYNAMIC_LIST, FormFieldType.DYNAMIC_LIST,
children=INITREC_HIGHER_EDUCATION, children=_INITREC_HIGHER_EDUCATION,
key="HoehereBildung", key="HoehereBildung",
), ),
FormField( FormField(
"Arbeitserfahrung", "Arbeitserfahrung",
FormFieldType.DYNAMIC_LIST, FormFieldType.DYNAMIC_LIST,
children=INITREC_WORK_EXPERIENCE, children=_INITREC_WORK_EXPERIENCE,
key="Arbeitserfahrung", key="Arbeitserfahrung",
), ),
FormField( FormField(
"Sprachkenntnisse", "Sprachkenntnisse",
FormFieldType.DYNAMIC_LIST, FormFieldType.DYNAMIC_LIST,
children=INITREC_LANGUAGES, children=_INITREC_LANGUAGES,
key="Sprachkenntnisse", key="Sprachkenntnisse",
), ),
] ]
+56 -4
View File
@@ -1616,6 +1616,11 @@ class InitRecForm(QWidget):
pformat(self.STATE.form_data), pformat(self.STATE.form_data),
) )
# TODO error catching? # TODO error catching?
logger_initrecform.info(
"[InitRecForm] Pydantic model name: %s",
self.STATE.cfg.pydantic_model.__name__,
)
model = self.cfg.pydantic_model(**self.STATE.form_data) model = self.cfg.pydantic_model(**self.STATE.form_data)
logger_initrecform.debug("[InitRecForm] Loaded to Pydantic.") logger_initrecform.debug("[InitRecForm] Loaded to Pydantic.")
logger_initrecform.debug("[InitRecForm] Convert to GUI structure...") logger_initrecform.debug("[InitRecForm] Convert to GUI structure...")
@@ -3097,6 +3102,12 @@ class CollapsibleBox(QWidget):
layout.addWidget(widget) layout.addWidget(widget)
self.setContentLayout(layout) self.setContentLayout(layout)
def set_open(
self,
open: bool,
) -> None:
self._on_toggle(open)
class Page_InitRec(QWidget): class Page_InitRec(QWidget):
back_main_requested = Signal() # back to main page back_main_requested = Signal() # back to main page
@@ -3247,6 +3258,28 @@ class Page_InitRec(QWidget):
# now we try to render the layout within the collapsable box # now we try to render the layout within the collapsable box
self.container_layout.addSpacing(20) self.container_layout.addSpacing(20)
# ** metadata
self.initrec_form_metadata_box = CollapsibleBox("Metadaten")
ent_type = EntityType.METADATA
self.initrec_form_metadata = InitRecForm(self.STATE.initrec_form_states[ent_type])
assert self.STATE.initrec_form_states[ent_type] is self.initrec_form_metadata.STATE
self.STATE.child_modules.append(self.initrec_form_metadata)
self.initrec_form_metadata_box.setContentWidget(self.initrec_form_metadata)
self.container_layout.addWidget(self.initrec_form_metadata_box)
# --- CUSTOM LOGIC ---
# ** 'Wiedereintrittsdatum' -> only relevant without company
search_res = search_widgets_by_key(
self.initrec_form_metadata.widget_registry, "wiedereintrittsdatum"
)
print(f">>>> {pformat(search_res)}")
assert len(search_res) == 1
field_wiedereintrittsdatum = search_res[0]["widget"]
assert isinstance(field_wiedereintrittsdatum, QDateEdit)
self.field_wiedereintrittsdatum = field_wiedereintrittsdatum
# ** person # ** person
self.initrec_form_person_box = CollapsibleBox("Angaben zur Person") self.initrec_form_person_box = CollapsibleBox("Angaben zur Person")
ent_type = EntityType.PERSON ent_type = EntityType.PERSON
@@ -3286,7 +3319,7 @@ class Page_InitRec(QWidget):
assert self.STATE.initrec_form_states[ent_type] is self.initrec_form_company.STATE assert self.STATE.initrec_form_states[ent_type] is self.initrec_form_company.STATE
target_idx = self.container_layout.indexOf(self.initrec_form_person_box) - 1 target_idx = self.container_layout.indexOf(self.initrec_form_person_box)
self.initrec_form_company_box.setContentWidget(self.initrec_form_company) self.initrec_form_company_box.setContentWidget(self.initrec_form_company)
self.container_layout.insertWidget(target_idx, self.initrec_form_company_box) self.container_layout.insertWidget(target_idx, self.initrec_form_company_box)
@@ -3321,9 +3354,13 @@ class Page_InitRec(QWidget):
self.company_profile_requested.emit(req_state) self.company_profile_requested.emit(req_state)
def _update_layout(self) -> None: def _update_layout(self) -> None:
self.initrec_form_metadata_box.set_open(True)
if self.STATE.recording_type is RecordingType.WITH_COMPANY: if self.STATE.recording_type is RecordingType.WITH_COMPANY:
# add company # add company
self.initrec_form_company_box.setVisible(True) self.initrec_form_company_box.setVisible(True)
self.initrec_form_metadata.top_level_form_layout.setRowVisible(
self.field_wiedereintrittsdatum, False
)
self.comp_profile_btn.setVisible(True) self.comp_profile_btn.setVisible(True)
if self.STATE.ids.valid(EntityType.COMPANY): if self.STATE.ids.valid(EntityType.COMPANY):
self.comp_profile_btn.setEnabled(True) self.comp_profile_btn.setEnabled(True)
@@ -3332,6 +3369,9 @@ class Page_InitRec(QWidget):
else: else:
self.initrec_form_company_box.setVisible(False) self.initrec_form_company_box.setVisible(False)
self.initrec_form_metadata.top_level_form_layout.setRowVisible(
self.field_wiedereintrittsdatum, True
)
self.comp_profile_btn.setVisible(False) self.comp_profile_btn.setVisible(False)
self.comp_profile_btn.setEnabled(False) self.comp_profile_btn.setEnabled(False)
@@ -3454,9 +3494,9 @@ class Page_InitRec(QWidget):
pers_id=5, pers_id=5,
) )
ids = EntityIds( # ids = EntityIds(
link_id=7, # link_id=7,
) # )
self.STATE.ids.update(ids, ignore_none=False) self.STATE.ids.update(ids, ignore_none=False)
if ids.empty(): if ids.empty():
@@ -3523,6 +3563,13 @@ class Page_InitRec(QWidget):
state.form_data = self.STATE.form_data.person state.form_data = self.STATE.form_data.person
if not update_only: if not update_only:
self.initrec_form_person.load_state(state) self.initrec_form_person.load_state(state)
case EntityType.METADATA:
state.form_data = self.STATE.form_data.metadata
logger_initrecform.info(
"[Page -- InitRec] Load METADATA from Pydantic model...\n%s",
pformat(self.STATE.form_data.metadata),
)
self.initrec_form_metadata.load_state(state)
case _: case _:
raise RuntimeError(f"Unspecified entity type {ent_type}") raise RuntimeError(f"Unspecified entity type {ent_type}")
@@ -3602,6 +3649,8 @@ class Page_InitRec(QWidget):
self.STATE.form_data.company = form_state.form_data self.STATE.form_data.company = form_state.form_data
case EntityType.PERSON: case EntityType.PERSON:
self.STATE.form_data.person = form_state.form_data self.STATE.form_data.person = form_state.form_data
case EntityType.METADATA:
self.STATE.form_data.metadata = form_state.form_data
case _: case _:
raise RuntimeError(f"Unspecified entity type {form_state.ent_type}") raise RuntimeError(f"Unspecified entity type {form_state.ent_type}")
@@ -3718,6 +3767,9 @@ class Page_InitRec(QWidget):
case EntityType.PERSON: case EntityType.PERSON:
val_data = state.cfg.pydantic_model(**self.STATE.form_data.person) val_data = state.cfg.pydantic_model(**self.STATE.form_data.person)
db_data.person = val_data.to_db(exclude=state.cfg.ignored_keys) db_data.person = val_data.to_db(exclude=state.cfg.ignored_keys)
case EntityType.METADATA:
val_data = state.cfg.pydantic_model(**self.STATE.form_data.metadata)
db_data.metadata = val_data.to_db(exclude=state.cfg.ignored_keys)
case _: case _:
raise RuntimeError(f"Unspecified entity type {ent_type}") raise RuntimeError(f"Unspecified entity type {ent_type}")
+7
View File
@@ -106,6 +106,13 @@ class EntityIds:
for field_name in self._field_names for field_name in self._field_names
if field_name in RELEVANT_ATTRIBUTES if field_name in RELEVANT_ATTRIBUTES
) )
elif ent_type is EntityType.METADATA:
RELEVANT_ATTRIBUTES = set()
relevant_fields = (
getattr(self, field_name)
for field_name in self._field_names
if field_name in RELEVANT_ATTRIBUTES
)
else: else:
raise RuntimeError(f"Unspecified entity type {ent_type}") raise RuntimeError(f"Unspecified entity type {ent_type}")