added entity ID container

This commit is contained in:
2026-07-22 15:26:15 +02:00
parent ffe38a4ee7
commit 6e04a7485a
4 changed files with 293 additions and 176 deletions
+44 -38
View File
@@ -24,7 +24,8 @@ from wce_crm.types import (
CompanyProfileConsultations, CompanyProfileConsultations,
ConsultingType, ConsultingType,
ContactPersonInfo, ContactPersonInfo,
InitRecType, EntityIds,
EntityType,
LinkingConsultationsEntryCompany, LinkingConsultationsEntryCompany,
LinkingConsultationsEntryPerson, LinkingConsultationsEntryPerson,
MainPageEntry, MainPageEntry,
@@ -160,7 +161,7 @@ def initrec_company_to_db(
dump_data["geloescht"] = auto_form_data.geloescht dump_data["geloescht"] = auto_form_data.geloescht
with db.ENGINE.begin() as conn: with db.ENGINE.begin() as conn:
if auto_form_data.rec_id is None: if auto_form_data.ids.un_id is None:
logger.debug("[AutoForm -- backend] Insert...") logger.debug("[AutoForm -- backend] Insert...")
stmt = db.grunderfassung_unternehmen.insert().returning( stmt = db.grunderfassung_unternehmen.insert().returning(
@@ -169,25 +170,23 @@ def initrec_company_to_db(
db.grunderfassung_unternehmen.c.geloescht, db.grunderfassung_unternehmen.c.geloescht,
) )
ret = conn.execute(stmt, dump_data) ret = conn.execute(stmt, dump_data)
if ret.rowcount == 0:
raise IOError("Entry was not inserted correctly")
from_db = ret.mappings().fetchall() from_db = ret.mappings().fetchall()
assert len(from_db) == 1, "expected excactly one returned row" assert len(from_db) == 1, "expected excactly one returned row"
data_from_db = from_db[0] data_from_db = from_db[0]
auto_form_data.rec_id = data_from_db["un_id"] auto_form_data.ids.un_id = data_from_db["un_id"]
auto_form_data.geloescht = data_from_db["geloescht"] auto_form_data.geloescht = data_from_db["geloescht"]
auto_form_data.db_data["Metadaten_aktualisierung"] = data_from_db[ auto_form_data.db_data["Metadaten_aktualisierung"] = data_from_db[
"Metadaten_aktualisierung" "Metadaten_aktualisierung"
] ]
logger.debug("[AutoForm -- backend] Inserted InitRec successfully") logger.debug("[AutoForm -- backend] Inserted InitRec Company successfully")
else: else:
logger.debug("[AutoForm -- backend] Update...") logger.debug("[AutoForm -- backend] Update...")
stmt = ( stmt = (
db.grunderfassung_unternehmen.update() db.grunderfassung_unternehmen.update()
.where(db.grunderfassung_unternehmen.c.un_id == auto_form_data.rec_id) .where(db.grunderfassung_unternehmen.c.un_id == auto_form_data.ids.un_id)
.returning( .returning(
db.grunderfassung_unternehmen.c.Metadaten_aktualisierung, db.grunderfassung_unternehmen.c.Metadaten_aktualisierung,
db.grunderfassung_unternehmen.c.geloescht, db.grunderfassung_unternehmen.c.geloescht,
@@ -204,8 +203,8 @@ def initrec_company_to_db(
] ]
logger.debug( logger.debug(
"[AutoForm -- backend] Updated InitRec with ID %d successfully", "[AutoForm -- backend] Updated InitRec Company with ID %d successfully",
auto_form_data.rec_id, auto_form_data.ids.un_id,
) )
return auto_form_data return auto_form_data
@@ -229,7 +228,8 @@ def initrec_company_from_db(
del data_from_db["geloescht"] del data_from_db["geloescht"]
return InitRec( return InitRec(
rec_id=id_, ids=EntityIds(un_id=id_),
# rec_id=id_, # TODO remove
geloescht=geloescht, geloescht=geloescht,
db_data=data_from_db, db_data=data_from_db,
) )
@@ -244,34 +244,39 @@ def initrec_person_to_db(
dump_data["geloescht"] = auto_form_data.geloescht dump_data["geloescht"] = auto_form_data.geloescht
with db.ENGINE.begin() as conn: with db.ENGINE.begin() as conn:
if auto_form_data.rec_id is None: if auto_form_data.ids.pers_id is None:
logger.debug("[AutoForm -- backend] Insert...") logger.debug("[AutoForm -- backend] Insert...")
stmt = db.grunderfassung_personen.insert().returning( stmt = sa.insert(db.grunderfassung_personen).returning(
db.grunderfassung_personen.c.pers_id, db.grunderfassung_personen.c.pers_id,
db.grunderfassung_personen.c.Metadaten_aktualisierung, db.grunderfassung_personen.c.Metadaten_aktualisierung,
db.grunderfassung_personen.c.geloescht, db.grunderfassung_personen.c.geloescht,
) )
stmt_compiled = str(stmt.compile(db.ENGINE))
logger.debug(
"[AutoForm -- backend] Data to insert:\nStatement: %s\n%s",
stmt_compiled,
pformat(dump_data),
)
ret = conn.execute(stmt, dump_data) ret = conn.execute(stmt, dump_data)
if ret.rowcount == 0:
raise IOError("Entry was not inserted correctly")
from_db = ret.mappings().fetchall() from_db = ret.mappings().fetchall()
assert len(from_db) == 1, "expected excactly one returned row" assert len(from_db) == 1, "expected excactly one returned row"
data_from_db = from_db[0] data_from_db = from_db[0]
auto_form_data.rec_id = data_from_db["un_id"] auto_form_data.ids.pers_id = data_from_db["pers_id"]
auto_form_data.geloescht = data_from_db["geloescht"] auto_form_data.geloescht = data_from_db["geloescht"]
auto_form_data.db_data["Metadaten_aktualisierung"] = data_from_db[ auto_form_data.db_data["Metadaten_aktualisierung"] = data_from_db[
"Metadaten_aktualisierung" "Metadaten_aktualisierung"
] ]
logger.debug("[AutoForm -- backend] Inserted InitRec successfully") logger.debug("[AutoForm -- backend] Inserted InitRec Person successfully")
else: else:
logger.debug("[AutoForm -- backend] Update...") logger.debug("[AutoForm -- backend] Update...")
stmt = ( stmt = (
db.grunderfassung_personen.update() db.grunderfassung_personen.update()
.where(db.grunderfassung_personen.c.pers_id == auto_form_data.rec_id) .where(db.grunderfassung_personen.c.pers_id == auto_form_data.ids.pers_id)
.returning( .returning(
db.grunderfassung_personen.c.Metadaten_aktualisierung, db.grunderfassung_personen.c.Metadaten_aktualisierung,
db.grunderfassung_personen.c.geloescht, db.grunderfassung_personen.c.geloescht,
@@ -288,8 +293,8 @@ def initrec_person_to_db(
] ]
logger.debug( logger.debug(
"[AutoForm -- backend] Updated InitRec with ID %d successfully", "[AutoForm -- backend] Updated InitRec Person with ID %d successfully",
auto_form_data.rec_id, auto_form_data.ids.pers_id,
) )
return auto_form_data return auto_form_data
@@ -313,33 +318,34 @@ def initrec_person_from_db(
del data_from_db["geloescht"] del data_from_db["geloescht"]
return InitRec( return InitRec(
rec_id=id_, ids=EntityIds(pers_id=id_),
# rec_id=id_, # TODO remove
geloescht=geloescht, geloescht=geloescht,
db_data=data_from_db, db_data=data_from_db,
) )
# TODO check removal # TODO check removal
# def initrec_company_get_initial_recording( def initrec_company_get_initial_recording(
# id_: RecId, id_: RecId,
# ) -> dict[str, Any]: ) -> dict[str, Any]:
# logger.debug("[Call backend] get_initial_recording") logger.debug("[Call backend] get_initial_recording")
# stmt = db.grunderfassung_unternehmen.select().where( stmt = db.grunderfassung_unternehmen.select().where(
# db.grunderfassung_unternehmen.c.un_id == id_ db.grunderfassung_unternehmen.c.un_id == id_
# ) )
# with db.ENGINE.connect() as conn: with db.ENGINE.connect() as conn:
# ret = conn.execute(stmt) ret = conn.execute(stmt)
# results = ret.mappings().all() results = ret.mappings().all()
# if not results: if not results:
# raise KeyError(f"Database ID {id_} not found") raise KeyError(f"Database ID {id_} not found")
# assert len(results) == 1, "more than one company initial recording obtained" assert len(results) == 1, "more than one company initial recording obtained"
# row = results[0] row = results[0]
# assert row, "row was not obtained" assert row, "row was not obtained"
# return dict(row) return dict(row)
# def initrec_company_delete_initial_recording( # def initrec_company_delete_initial_recording(
@@ -828,7 +834,7 @@ def _main_page_get_company_list() -> list[MainPageEntry]:
rec_id=rec_id, rec_id=rec_id,
display_name=display_name, display_name=display_name,
Metadaten_aktualisierung=datetime_akt, Metadaten_aktualisierung=datetime_akt,
type=InitRecType.COMPANY, type=EntityType.COMPANY,
) )
) )
@@ -865,7 +871,7 @@ def _main_page_get_person_list() -> list[MainPageEntry]:
rec_id=rec_id, rec_id=rec_id,
display_name=display_name, display_name=display_name,
Metadaten_aktualisierung=datetime_akt, Metadaten_aktualisierung=datetime_akt,
type=InitRecType.PERSON, type=EntityType.PERSON,
) )
) )
+58 -49
View File
@@ -19,10 +19,11 @@ from pydantic import (
from pydantic_core import ErrorDetails from pydantic_core import ErrorDetails
from wce_crm.form_defs import FormField from wce_crm.form_defs import FormField
from wce_crm.types import ConsId, ConsultingType, RecId, UserId from wce_crm.types import EntityIds
if TYPE_CHECKING: if TYPE_CHECKING:
from wce_crm.gui import Page_Consulting_ConsultingSession # noqa: F401 from wce_crm.gui import Page_Consulting_ConsultingSession # noqa: F401
from wce_crm.types import ConsId, ConsultingType, EntityType, RecId, UserId
ValidAge = Annotated[int, Field(ge=0, le=99)] ValidAge = Annotated[int, Field(ge=0, le=99)]
COLUMN_SEP: Final[str] = "__" COLUMN_SEP: Final[str] = "__"
@@ -74,33 +75,7 @@ def _parse_json(value: Any) -> str:
raise TypeError raise TypeError
# // GUI states and types # // interfaces
def set_page_state(
target: S,
source: S,
deep: bool = False,
) -> None:
"""
transfer all field values generically from 'source' to 'target'
"""
if not (dc.is_dataclass(target) and dc.is_dataclass(source)):
raise TypeError("Both source and atrget must be dataclasses")
if type(target) is not type(source):
raise TypeError("Both source and target must have the same type")
for field in dc.fields(source):
if field.name == "child_modules":
continue
new_value = getattr(source, field.name)
if deep:
new_value = copy.deepcopy(new_value)
setattr(target, field.name, new_value)
class WrapperModule(Protocol): class WrapperModule(Protocol):
def _sync_state_to_GUI(self, *args, **kwargs) -> None: def _sync_state_to_GUI(self, *args, **kwargs) -> None:
"""build states for all child modules and use their `load_state` method """build states for all child modules and use their `load_state` method
@@ -178,20 +153,47 @@ class Module(WrapperModule, Protocol):
# ) -> None: ... # ) -> None: ...
class AutoFormToDb(Protocol): class InitRecFormToDb(Protocol):
def __call__( def __call__(
self, self,
auto_form_data: InitRec, auto_form_data: InitRec,
) -> InitRec: ... ) -> InitRec: ...
class AutoFormFromDb(Protocol): class InitRecFormFromDb(Protocol):
def __call__( def __call__(
self, self,
id_: int, id_: int,
) -> InitRec: ... ) -> InitRec: ...
# // GUI states and types
def set_page_state(
target: S,
source: S,
deep: bool = False,
) -> None:
"""
transfer all field values generically from 'source' to 'target'
"""
if not (dc.is_dataclass(target) and dc.is_dataclass(source)):
raise TypeError("Both source and atrget must be dataclasses")
if type(target) is not type(source):
raise TypeError("Both source and target must have the same type")
for field in dc.fields(source):
if field.name == "child_modules":
continue
new_value = getattr(source, field.name)
if deep:
new_value = copy.deepcopy(new_value)
setattr(target, field.name, new_value)
@dc.dataclass(slots=True) @dc.dataclass(slots=True)
class Session: class Session:
user_id: UserId user_id: UserId
@@ -215,40 +217,45 @@ class Page_NewInitRec_State(PageState[Module]):
@dc.dataclass(slots=True, kw_only=True) @dc.dataclass(slots=True, kw_only=True)
class Page_InitRecCompany_State(PageState[Module]): class InitRecFormConfig:
session: Session
un_id: RecId | None = None
locked: bool
@dc.dataclass(slots=True, kw_only=True)
class AutoFormConfig:
model: type[FlatBaseModel] model: type[FlatBaseModel]
to_db: AutoFormToDb to_db: InitRecFormToDb
from_db: AutoFormFromDb from_db: InitRecFormFromDb
form_fields: Sequence[FormField] form_fields: Sequence[FormField]
ignored_keys: Iterable[str] = tuple() ignored_keys: Iterable[str] = tuple()
add_buttons: bool = True add_buttons: bool = True
@dc.dataclass(slots=True, kw_only=True) @dc.dataclass(slots=True, kw_only=True)
class AutoForm_State(PageState[Module]): class InitRecForm_State(PageState[Module]):
session: Session session: Session
cfg: AutoFormConfig cfg: InitRecFormConfig
rec_id: RecId | None = None ids: EntityIds
ent_type: EntityType
# rec_id: RecId | None = None
form_data: dict[str, Any] | None = None form_data: dict[str, Any] | None = None
locked: bool locked: bool
geloescht: bool = False geloescht: bool = False
@dc.dataclass(slots=True, kw_only=True) @dc.dataclass(slots=True, kw_only=True)
class Page_InitRecPerson_State(PageState[Module]): class Page_InitRecCompany_State(PageState[Module]):
session: Session session: Session
pers_id: RecId | None = None ids: EntityIds
un_id: RecId | None = None # un_id: RecId | None = None
locked: bool locked: bool
@dc.dataclass(slots=True, kw_only=True)
class Page_InitRecPerson_State(PageState[Module]):
session: Session
ids: EntityIds
# pers_id: RecId | None = None
# un_id: RecId | None = None
locked: bool
# TODO change to entity IDs
@dc.dataclass(slots=True, kw_only=True) @dc.dataclass(slots=True, kw_only=True)
class Page_Consulting_State(PageState[Module]): class Page_Consulting_State(PageState[Module]):
session: Session session: Session
@@ -264,6 +271,7 @@ class Page_Consulting_State(PageState[Module]):
locked: bool locked: bool
# TODO change to entity IDs
@dc.dataclass(slots=True, kw_only=True) @dc.dataclass(slots=True, kw_only=True)
class Page_Consulting_Linking_State(PageState[Module]): class Page_Consulting_Linking_State(PageState[Module]):
session: Session session: Session
@@ -279,7 +287,6 @@ class Page_Consulting_ConsultingSession_State(PageState[Module]):
nutzer_name: str # must be set with the session (always known) nutzer_name: str # must be set with the session (always known)
beratung_id: int | None # known and not known entries beratung_id: int | None # known and not known entries
zeitstempel: datetime.datetime | None = None zeitstempel: datetime.datetime | None = None
# dc.field(default_factory=lambda: datetime.datetime.now(tz=datetime.UTC))
ansprechpartner: str | None = None ansprechpartner: str | None = None
kommunikationsweg: str | None = None kommunikationsweg: str | None = None
thema_crm_matrix: str | None = ( thema_crm_matrix: str | None = (
@@ -301,7 +308,8 @@ class Page_Consulting_Table_State(PageState["Page_Consulting_ConsultingSession"]
@dc.dataclass(slots=True, kw_only=True) @dc.dataclass(slots=True, kw_only=True)
class Page_CompanyProfile_State(PageState[Module]): class Page_CompanyProfile_State(PageState[Module]):
session: Session session: Session
rec_id: RecId | None = None ids: EntityIds
# rec_id: RecId | None = None
# // Pydantic models # // Pydantic models
@@ -419,7 +427,8 @@ class FlatBaseModel(BaseModel):
# ** InitRec # ** InitRec
class InitRec(BaseModel): class InitRec(BaseModel):
rec_id: RecId | None ids: EntityIds
# rec_id: RecId | None
geloescht: AwareDatetime | None = None geloescht: AwareDatetime | None = None
db_data: dict[str, Any] db_data: dict[str, Any]
+142 -86
View File
@@ -84,13 +84,13 @@ from wce_crm.backend import backend
from wce_crm.constants import TIMEZONE_CEST from wce_crm.constants import TIMEZONE_CEST
from wce_crm.data_models import ( from wce_crm.data_models import (
COLUMN_SEP, COLUMN_SEP,
AutoForm_State,
AutoFormConfig,
Beratungsgespraech_Einzelgespraech, Beratungsgespraech_Einzelgespraech,
Beratungsgespraech_Vorgang, Beratungsgespraech_Vorgang,
Grunderfassung_Personen, Grunderfassung_Personen,
Grunderfassung_Unternehmen, Grunderfassung_Unternehmen,
InitRec, InitRec,
InitRecForm_State,
InitRecFormConfig,
Page_CompanyProfile_State, Page_CompanyProfile_State,
Page_Consulting_ConsultingSession_State, Page_Consulting_ConsultingSession_State,
Page_Consulting_Linking_State, Page_Consulting_Linking_State,
@@ -117,11 +117,17 @@ from wce_crm.logging import (
logger_gui, logger_gui,
logger_page_consulting, logger_page_consulting,
) )
from wce_crm.types import CompanyProfileConsultationEntry, ConsultingType, RecId from wce_crm.types import (
CompanyProfileConsultationEntry,
ConsultingType,
EntityIds,
EntityType,
RecId,
)
if TYPE_CHECKING: if TYPE_CHECKING:
from wce_crm.data_models import ( from wce_crm.data_models import (
AutoForm_State, InitRecForm_State,
Module, Module,
WrapperModule, WrapperModule,
) )
@@ -1370,14 +1376,14 @@ def search_widgets_by_key(
return hits return hits
class AutoForm(QWidget): class InitRecForm(QWidget):
"""a widget, which is managed by a code-defined field definition collection""" """a widget, which is managed by a code-defined field definition collection"""
update_triggered = Signal() # formular saved (data changed for front page) update_triggered = Signal() # formular saved (data changed for front page)
def __init__( def __init__(
self, self,
state: AutoForm_State, state: InitRecForm_State,
) -> None: ) -> None:
super().__init__() super().__init__()
self.STATE = state self.STATE = state
@@ -1519,7 +1525,8 @@ class AutoForm(QWidget):
index = int(self.id_field_input.text()) index = int(self.id_field_input.text())
except ValueError: except ValueError:
index = None index = None
self.STATE.rec_id = index self.STATE.ids.un_id = index
self.STATE.ids.pers_id = index
logger_gui.debug("[Auto-Form] Set index to %s, new state: %s", index, self.STATE) logger_gui.debug("[Auto-Form] Set index to %s, new state: %s", index, self.STATE)
def _disable_save(self) -> None: def _disable_save(self) -> None:
@@ -1539,13 +1546,13 @@ class AutoForm(QWidget):
self.save_btn.setText(self.edit_buttons.save_btn_txt_enabled) self.save_btn.setText(self.edit_buttons.save_btn_txt_enabled)
def _activate_delete(self) -> None: def _activate_delete(self) -> None:
if self.STATE.rec_id is not None: if self.STATE.ids.valid():
self.delete_btn.setEnabled(True) self.delete_btn.setEnabled(True)
else: else:
self.delete_btn.setEnabled(False) self.delete_btn.setEnabled(False)
def _delete_data(self) -> None: def _delete_data(self) -> None:
assert self.STATE.rec_id is not None, "deletion initialised despite no index set" assert self.STATE.ids.valid(), "deletion initialised despite IDs are not properly set"
confirm = get_user_confirmation( confirm = get_user_confirmation(
self, self,
"Löschen bestätigen", "Löschen bestätigen",
@@ -1592,7 +1599,9 @@ class AutoForm(QWidget):
logger_auto_form.debug("[Auto-Form] Set form data...") logger_auto_form.debug("[Auto-Form] Set form data...")
logger_auto_form.debug("[Auto-Form] Form data:\n%s", pformat(form_data)) logger_auto_form.debug("[Auto-Form] Form data:\n%s", pformat(form_data))
self._set_form_data(form_data) self._set_form_data(form_data)
self.STATE.rec_id = id_ self.STATE.ids.set_id(id_, self.STATE.ent_type)
# TODO remove
# self.STATE.rec_id = id_
self.STATE.form_data = self._get_form_data() self.STATE.form_data = self._get_form_data()
logger_auto_form.debug( logger_auto_form.debug(
"####### model dump vs get form data:\n%s\n\n%s", "####### model dump vs get form data:\n%s\n\n%s",
@@ -1602,7 +1611,9 @@ class AutoForm(QWidget):
def reset_form(self) -> None: def reset_form(self) -> None:
reset_form(self.widget_registry) reset_form(self.widget_registry)
self.STATE.rec_id = None self.STATE.ids.set_id(None, self.STATE.ent_type)
# TODO remove
# self.STATE.rec_id = None
self.STATE.form_data = None self.STATE.form_data = None
self.STATE.geloescht = False self.STATE.geloescht = False
@@ -1640,7 +1651,7 @@ class AutoForm(QWidget):
) -> None: ) -> None:
if section is None or section == "form": if section is None or section == "form":
if not self.STATE.geloescht: if not self.STATE.geloescht:
self._load_from_id(self.STATE.rec_id) self._load_from_id(self.STATE.ids.get_id(self.STATE.ent_type))
else: else:
self.reset_form() self.reset_form()
@@ -1666,12 +1677,12 @@ class AutoForm(QWidget):
def load_state( def load_state(
self, self,
new_state: AutoForm_State, new_state: InitRecForm_State,
) -> None: ) -> None:
set_page_state(self.STATE, new_state) set_page_state(self.STATE, new_state)
self._sync_state_to_GUI(None) self._sync_state_to_GUI(None)
def get_state(self) -> AutoForm_State: def get_state(self) -> InitRecForm_State:
self._sync_GUI_to_state() self._sync_GUI_to_state()
return self.STATE return self.STATE
@@ -1680,20 +1691,23 @@ class AutoForm(QWidget):
self, self,
data: InitRec, data: InitRec,
) -> None: ) -> None:
self.STATE.rec_id = data.rec_id ent_type = self.STATE.ent_type
self.STATE.ids.set_id(data.ids.get_id(ent_type), ent_type)
# self.STATE.rec_id = data.rec_id
self.STATE.form_data = None self.STATE.form_data = None
self.STATE.geloescht = True if data.geloescht else False self.STATE.geloescht = True if data.geloescht else False
self._sync_state_to_GUI(None) # TODO change to correct loading self._sync_state_to_GUI(None) # TODO change to correct loading
def save_data(self) -> None: def save_data(self) -> None:
if self.STATE.rec_id is None and self.STATE.geloescht: relevant_id = self.STATE.ids.get_id(self.STATE.ent_type)
if relevant_id is None and self.STATE.geloescht:
logger_auto_form.debug( logger_auto_form.debug(
"[Auto-Form] This was never saved in the database " "[Auto-Form] This was never saved in the database "
"and is marked for deletion - ignore." "and is marked for deletion - ignore."
) )
return return
elif self.STATE.rec_id is not None and self.STATE.geloescht: elif relevant_id is not None and self.STATE.geloescht:
logger_auto_form.debug( logger_auto_form.debug(
"[Auto-Form] This was saved in the database " "[Auto-Form] This was saved in the database "
"and is marked for deletion - fast path." "and is marked for deletion - fast path."
@@ -1701,7 +1715,8 @@ class AutoForm(QWidget):
deleted_datetime = datetime.datetime.now(datetime.UTC) deleted_datetime = datetime.datetime.now(datetime.UTC)
assert self.STATE.form_data, "cannot delete entry with uninitialised form data" assert self.STATE.form_data, "cannot delete entry with uninitialised form data"
to_db = InitRec( to_db = InitRec(
rec_id=self.STATE.rec_id, ids=self.STATE.ids,
# rec_id=self.STATE.rec_id, # TODO remove
geloescht=deleted_datetime, geloescht=deleted_datetime,
db_data={}, db_data={},
) )
@@ -1759,7 +1774,8 @@ class AutoForm(QWidget):
try: try:
# TODO change to result pattern # TODO change to result pattern
to_db = InitRec( to_db = InitRec(
rec_id=self.STATE.rec_id, ids=self.STATE.ids,
# rec_id=self.STATE.rec_id,
geloescht=deleted_datetime, geloescht=deleted_datetime,
db_data=db_data, db_data=db_data,
) )
@@ -2904,18 +2920,22 @@ class Page_NewInitRec(QWidget):
layout.addWidget(btn_consulting) layout.addWidget(btn_consulting)
def _request_initrec_company(self) -> None: def _request_initrec_company(self) -> None:
ids = EntityIds(type=EntityType.COMPANY)
req_state = Page_InitRecCompany_State( req_state = Page_InitRecCompany_State(
session=self.STATE.session, session=self.STATE.session,
un_id=None, ids=ids,
# un_id=None, # TODO remove
locked=False, locked=False,
) )
logger_gui.debug("[Page -- InitRec] State to call: %s", req_state) logger_gui.debug("[Page -- InitRec] State to call: %s", req_state)
self.company_requested.emit(req_state) self.company_requested.emit(req_state)
def _request_initrec_person(self) -> None: def _request_initrec_person(self) -> None:
ids = EntityIds(type=EntityType.PERSON)
req_state = Page_InitRecPerson_State( req_state = Page_InitRecPerson_State(
session=self.STATE.session, session=self.STATE.session,
pers_id=None, ids=ids,
# pers_id=None, # TODO remove
locked=False, locked=False,
) )
logger_gui.debug("[Page -- InitRec] State to call: %s", req_state) logger_gui.debug("[Page -- InitRec] State to call: %s", req_state)
@@ -2955,7 +2975,7 @@ class Page_NewInitRec(QWidget):
pass pass
CONFIG_GRUNDERFASSUNG_UNTERNEHMEN: Final[AutoFormConfig] = AutoFormConfig( CONFIG_GRUNDERFASSUNG_UNTERNEHMEN: Final[InitRecFormConfig] = InitRecFormConfig(
model=Grunderfassung_Unternehmen, model=Grunderfassung_Unternehmen,
to_db=backend.initrec_company_to_db, to_db=backend.initrec_company_to_db,
from_db=backend.initrec_company_from_db, from_db=backend.initrec_company_from_db,
@@ -2966,7 +2986,7 @@ CONFIG_GRUNDERFASSUNG_UNTERNEHMEN: Final[AutoFormConfig] = AutoFormConfig(
form_fields=INITREC_COMP, form_fields=INITREC_COMP,
) )
CONFIG_GRUNDERFASSUNG_PERSONEN: Final[AutoFormConfig] = AutoFormConfig( CONFIG_GRUNDERFASSUNG_PERSONEN: Final[InitRecFormConfig] = InitRecFormConfig(
model=Grunderfassung_Personen, model=Grunderfassung_Personen,
to_db=backend.initrec_person_to_db, to_db=backend.initrec_person_to_db,
from_db=backend.initrec_person_from_db, from_db=backend.initrec_person_from_db,
@@ -3036,8 +3056,8 @@ class Page_InitRecCompany(QWidget):
) )
self.comp_profile_btn.setFixedHeight(50) self.comp_profile_btn.setFixedHeight(50)
self.initrec_person_btn = QPushButton("Individualperson erfassen") self.initrec_person_btn = QPushButton("Individualperson erfassen/anzeigen")
self.initrec_person_btn.clicked.connect(self._request_inirec_person) self.initrec_person_btn.clicked.connect(self._request_initrec_person)
self.initrec_person_btn.setSizePolicy( self.initrec_person_btn.setSizePolicy(
QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed
) )
@@ -3079,13 +3099,16 @@ class Page_InitRecCompany(QWidget):
# --- AUTO FORM LAYOUT --- # --- AUTO FORM LAYOUT ---
container_layout.addSpacing(20) container_layout.addSpacing(20)
self.AUTO_FORM_CFG = CONFIG_GRUNDERFASSUNG_UNTERNEHMEN self.INITREC_FORM_CFG = CONFIG_GRUNDERFASSUNG_UNTERNEHMEN
auto_form_state = AutoForm_State( assert self.STATE.ids.ent_type is EntityType.COMPANY, "mismatch of entity types"
auto_form_state = InitRecForm_State(
session=self.STATE.session, session=self.STATE.session,
cfg=self.AUTO_FORM_CFG, cfg=self.INITREC_FORM_CFG,
ids=self.STATE.ids,
ent_type=EntityType.COMPANY,
locked=False, locked=False,
) )
self.auto_form = AutoForm(auto_form_state) self.auto_form = InitRecForm(auto_form_state)
container_layout.addWidget(self.auto_form) container_layout.addWidget(self.auto_form)
self.auto_form.update_triggered.connect(lambda: self.update_main_page.emit()) self.auto_form.update_triggered.connect(lambda: self.update_main_page.emit())
self.auto_form.update_triggered.connect(self._auto_form_updated) self.auto_form.update_triggered.connect(self._auto_form_updated)
@@ -3132,24 +3155,29 @@ class Page_InitRecCompany(QWidget):
self._sync_state_to_GUI("banners") self._sync_state_to_GUI("banners")
def _request_company_profile(self) -> None: def _request_company_profile(self) -> None:
assert self.STATE.un_id is not None, ( assert self.STATE.ids.un_id is not None, (
"requested company profile for a company which is not known (no ID)" "requested company profile for a company which is not known (no ID)"
) )
req_state = Page_CompanyProfile_State( req_state = Page_CompanyProfile_State(
session=self.STATE.session, session=self.STATE.session,
rec_id=self.STATE.un_id, # rec_id=self.STATE.un_id,
ids=self.STATE.ids,
) )
logger_gui.debug("[Page -- InitRec Company] State to call: %s", req_state) logger_gui.debug("[Page -- InitRec Company] State to call: %s", req_state)
self.company_profile_requested.emit(req_state) self.company_profile_requested.emit(req_state)
def _request_inirec_person(self) -> None: def _request_initrec_person(self) -> None:
assert self.STATE.un_id is not None, ( assert self.STATE.ids.un_id is not None, (
"requested initrec of person for a company which is not known (no ID)" "requested initrec of person for a company which is not known (no ID)"
) )
if not self.STATE.locked:
self.auto_form.save_data()
req_state = Page_InitRecPerson_State( req_state = Page_InitRecPerson_State(
session=self.STATE.session, session=self.STATE.session,
pers_id=None, ids=self.STATE.ids,
un_id=self.STATE.un_id, # pers_id=None, # TODO remove
# un_id=self.STATE.un_id,
locked=False, locked=False,
) )
logger_gui.debug("[Page -- InitRec Company] State to call: %s", req_state) logger_gui.debug("[Page -- InitRec Company] State to call: %s", req_state)
@@ -3160,13 +3188,16 @@ class Page_InitRecCompany(QWidget):
def _sync_state_to_GUI( def _sync_state_to_GUI(
self, self,
section: Literal["auto_form", "comp_profile", "banners"] | None, section: Literal["auto_form", "comp_profile", "initrec_person", "banners"] | None,
) -> None: ) -> None:
if section is None or section == "auto_form": if section is None or section == "auto_form":
auto_form_state = AutoForm_State( assert self.STATE.ids.ent_type is EntityType.COMPANY, "mismatch of entity types"
auto_form_state = InitRecForm_State(
session=self.STATE.session, session=self.STATE.session,
cfg=self.AUTO_FORM_CFG, cfg=self.INITREC_FORM_CFG,
rec_id=self.STATE.un_id, ids=self.STATE.ids,
ent_type=EntityType.COMPANY,
# rec_id=self.STATE.un_id, # TODO remove
form_data=None, form_data=None,
locked=self.STATE.locked, locked=self.STATE.locked,
) )
@@ -3174,14 +3205,20 @@ class Page_InitRecCompany(QWidget):
self.auto_form.load_state(auto_form_state) self.auto_form.load_state(auto_form_state)
if section is None or section == "comp_profile": if section is None or section == "comp_profile":
if self.STATE.un_id is None: if self.STATE.ids.valid():
self.comp_profile_btn.setEnabled(False)
else:
self.comp_profile_btn.setEnabled(True) self.comp_profile_btn.setEnabled(True)
else:
self.comp_profile_btn.setEnabled(False)
if section is None or section == "initrec_person":
if self.STATE.ids.un_id is not None:
self.initrec_person_btn.setEnabled(True)
else:
self.initrec_person_btn.setEnabled(False)
if section is None or section == "banners": if section is None or section == "banners":
self._clear_info_banners() self._clear_info_banners()
if self.STATE.un_id is None: if self.STATE.ids.un_id is None:
self._add_info_banner( self._add_info_banner(
text="⚠️ Dieser Eintrag ist noch nicht gespeichert.", text="⚠️ Dieser Eintrag ist noch nicht gespeichert.",
button_text="", button_text="",
@@ -3189,7 +3226,8 @@ class Page_InitRecCompany(QWidget):
def _sync_GUI_to_state(self) -> None: def _sync_GUI_to_state(self) -> None:
auto_form_state = self.auto_form.get_state() auto_form_state = self.auto_form.get_state()
self.STATE.un_id = auto_form_state.rec_id self.STATE.ids = auto_form_state.ids
# self.STATE.un_id = auto_form_state.rec_id # TODO remove
def load_state( def load_state(
self, self,
@@ -3291,12 +3329,14 @@ class Page_InitRecPerson(QWidget):
# --- AUTO FORM LAYOUT --- # --- AUTO FORM LAYOUT ---
container_layout.addSpacing(20) container_layout.addSpacing(20)
self.AUTO_FORM_CFG = CONFIG_GRUNDERFASSUNG_PERSONEN self.AUTO_FORM_CFG = CONFIG_GRUNDERFASSUNG_PERSONEN
auto_form_state = AutoForm_State( auto_form_state = InitRecForm_State(
session=self.STATE.session, session=self.STATE.session,
cfg=self.AUTO_FORM_CFG, cfg=self.AUTO_FORM_CFG,
ids=self.STATE.ids,
ent_type=EntityType.PERSON,
locked=False, locked=False,
) )
self.auto_form = AutoForm(auto_form_state) self.auto_form = InitRecForm(auto_form_state)
container_layout.addWidget(self.auto_form) container_layout.addWidget(self.auto_form)
self.auto_form.update_triggered.connect(lambda: self.update_triggered.emit()) self.auto_form.update_triggered.connect(lambda: self.update_triggered.emit())
self.auto_form.update_triggered.connect(self._auto_form_updated) self.auto_form.update_triggered.connect(self._auto_form_updated)
@@ -3376,10 +3416,12 @@ class Page_InitRecPerson(QWidget):
section: Literal["auto_form", "banners"] | None, section: Literal["auto_form", "banners"] | None,
) -> None: ) -> None:
if section is None or section == "auto_form": if section is None or section == "auto_form":
auto_form_state = AutoForm_State( auto_form_state = InitRecForm_State(
session=self.STATE.session, session=self.STATE.session,
cfg=self.AUTO_FORM_CFG, cfg=self.AUTO_FORM_CFG,
rec_id=self.STATE.pers_id, ids=self.STATE.ids,
ent_type=EntityType.PERSON,
# rec_id=self.STATE.pers_id, # TODO remove
form_data=None, form_data=None,
locked=self.STATE.locked, locked=self.STATE.locked,
) )
@@ -3387,7 +3429,7 @@ class Page_InitRecPerson(QWidget):
if section is None or section == "banners": if section is None or section == "banners":
self._clear_info_banners() self._clear_info_banners()
if self.STATE.pers_id is None: if self.STATE.ids.pers_id is None:
self._add_info_banner( self._add_info_banner(
text="⚠️ Dieser Eintrag ist noch nicht gespeichert.", text="⚠️ Dieser Eintrag ist noch nicht gespeichert.",
button_text="", button_text="",
@@ -3395,7 +3437,8 @@ class Page_InitRecPerson(QWidget):
def _sync_GUI_to_state(self) -> None: def _sync_GUI_to_state(self) -> None:
auto_form_state = self.auto_form.get_state() auto_form_state = self.auto_form.get_state()
self.STATE.pers_id = auto_form_state.rec_id self.STATE.ids = auto_form_state.ids
# self.STATE.ids.pers_id = auto_form_state.rec_id # TODO remove
def load_state( def load_state(
self, self,
@@ -3420,9 +3463,7 @@ class Page_InitRecPerson(QWidget):
class Page_CompanyProfile(QWidget): class Page_CompanyProfile(QWidget):
back_main_requested = Signal() # back to main page back_main_requested = Signal() # back to main page
back_requested = Signal( back_requested = Signal() # back to init rec (bool: reset yes/no)
Page_InitRecCompany_State
) # back to init rec (bool: reset yes/no)
# TODO update should trigger something else # TODO update should trigger something else
# more like listening to 'child' ("Beratungen") # more like listening to 'child' ("Beratungen")
# update_triggered = Signal() # form saved (data changed for front page) # update_triggered = Signal() # form saved (data changed for front page)
@@ -3473,7 +3514,8 @@ class Page_CompanyProfile(QWidget):
back_btn_main.setMinimumWidth(200) back_btn_main.setMinimumWidth(200)
back_btn_main.setMaximumWidth(200) back_btn_main.setMaximumWidth(200)
back_btn_step = QPushButton("← Zurück") back_btn_step = QPushButton("← Zurück")
back_btn_step.clicked.connect(self._request_initrec_company) # back_btn_step.clicked.connect(self._request_initrec_company) # TODO remove
back_btn_step.clicked.connect(lambda: self.back_requested.emit())
back_btn_step.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) back_btn_step.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
back_btn_step.setMinimumWidth(200) back_btn_step.setMinimumWidth(200)
back_btn_step.setMaximumWidth(200) back_btn_step.setMaximumWidth(200)
@@ -3688,26 +3730,26 @@ class Page_CompanyProfile(QWidget):
target_idx = target_layout.count() - 1 target_idx = target_layout.count() - 1
target_layout.insertWidget(target_idx, dummy_click_cell) target_layout.insertWidget(target_idx, dummy_click_cell)
def _request_initrec_company(self) -> None: # def _request_initrec_company(self) -> None:
req_state = Page_InitRecCompany_State( # req_state = Page_InitRecCompany_State(
session=self.STATE.session, # session=self.STATE.session,
un_id=self.STATE.rec_id, # un_id=self.STATE.rec_id,
locked=True, # locked=True,
) # )
logger_gui.debug("[Page Company Profile] State to call: %s", req_state) # logger_gui.debug("[Page Company Profile] State to call: %s", req_state)
self.back_requested.emit(req_state) # self.back_requested.emit(req_state)
def _request_new_consulting( def _request_new_consulting(
self, self,
cons_type: ConsultingType, cons_type: ConsultingType,
) -> None: ) -> None:
assert self.STATE.rec_id is not None, ( assert self.STATE.ids.un_id is not None, (
"tried to call consulting from comp profile without set ID" "tried to call consulting from comp profile without set ID"
) )
new_state = Page_Consulting_State( new_state = Page_Consulting_State(
session=self.STATE.session, session=self.STATE.session,
vorgang_id=None, vorgang_id=None,
un_id=self.STATE.rec_id, un_id=self.STATE.ids.un_id,
beratungs_typ=cons_type, beratungs_typ=cons_type,
locked=False, locked=False,
) )
@@ -3717,13 +3759,13 @@ class Page_CompanyProfile(QWidget):
self, self,
data: CompanyProfileConsultationEntry, data: CompanyProfileConsultationEntry,
) -> None: ) -> None:
assert self.STATE.rec_id is not None, ( assert self.STATE.ids.un_id is not None, (
"tried to call consulting from comp profile without set ID" "tried to call consulting from comp profile without set ID"
) )
new_state = Page_Consulting_State( new_state = Page_Consulting_State(
session=self.STATE.session, session=self.STATE.session,
vorgang_id=data.cons_id, vorgang_id=data.cons_id,
un_id=self.STATE.rec_id, un_id=self.STATE.ids.un_id,
beratungs_typ=data.cons_type, beratungs_typ=data.cons_type,
locked=True, locked=True,
) )
@@ -3745,9 +3787,11 @@ class Page_CompanyProfile(QWidget):
widget.deleteLater() widget.deleteLater()
def _update_consultations(self) -> None: def _update_consultations(self) -> None:
if self.STATE.rec_id is None: if self.STATE.ids.un_id is None:
return return
consultations = backend.companyprofile_page_get_consultations(un_id=self.STATE.rec_id) consultations = backend.companyprofile_page_get_consultations(
un_id=self.STATE.ids.un_id
)
logger_gui.debug( logger_gui.debug(
"[Page -- Company Profile] Consultations: %s", pformat(consultations) "[Page -- Company Profile] Consultations: %s", pformat(consultations)
@@ -3785,7 +3829,7 @@ class Page_CompanyProfile(QWidget):
self.add_btn_individual.setEnabled(True) self.add_btn_individual.setEnabled(True)
def _sync_state_to_GUI(self) -> None: def _sync_state_to_GUI(self) -> None:
if self.STATE.rec_id is None: if self.STATE.ids.un_id is None:
# just clear and do nothing else # just clear and do nothing else
logger_gui.debug("just reset, ID is None") logger_gui.debug("just reset, ID is None")
self.table_master_data.reset() self.table_master_data.reset()
@@ -3794,7 +3838,7 @@ class Page_CompanyProfile(QWidget):
return return
self._enable_add_btns() self._enable_add_btns()
init_rec = backend.initrec_company_get_initial_recording(self.STATE.rec_id) init_rec = backend.initrec_company_get_initial_recording(self.STATE.ids.un_id)
ma_id = cast("ExtMaId", init_rec["Partnersuche__un_suche"]) ma_id = cast("ExtMaId", init_rec["Partnersuche__un_suche"])
assert ma_id is not None, "no ma_id obtained" assert ma_id is not None, "no ma_id obtained"
comp_info = backend.initrec_comp_search_get_info(ma_id) comp_info = backend.initrec_comp_search_get_info(ma_id)
@@ -3809,16 +3853,18 @@ class Page_CompanyProfile(QWidget):
self.set_company_name(data["Name:"]) self.set_company_name(data["Name:"])
self.update_current_page() self.update_current_page()
def _sync_GUI_to_state(self) -> None: ... def _sync_GUI_to_state(self) -> None:
pass
def validate(self) -> None: ... def validate(self) -> None:
pass
def load_state( def load_state(
self, self,
new_state: Page_CompanyProfile_State, new_state: Page_CompanyProfile_State,
) -> None: ) -> None:
logger_gui.debug("Called function to load with ID: %s", new_state.rec_id) logger_gui.debug("Called function to load with IDs: %s", pformat(new_state.ids))
self.STATE.rec_id = new_state.rec_id self.STATE.ids = new_state.ids
self._sync_state_to_GUI() self._sync_state_to_GUI()
@@ -4015,7 +4061,7 @@ class MasterDataFormWidget(QWidget):
class Page_Consulting(QWidget): class Page_Consulting(QWidget):
back_main_requested = Signal() # back to main page back_main_requested = Signal() # back to main page
back_requested = Signal(bool) # back to init rec (bool: reset yes/no) back_requested = Signal() # back to init rec (bool: reset yes/no)
# TODO update should trigger something else # TODO update should trigger something else
# more like listening to 'child' ("Beratungen") # more like listening to 'child' ("Beratungen")
update_triggered = Signal() # form saved (data changed for front page) update_triggered = Signal() # form saved (data changed for front page)
@@ -4057,7 +4103,7 @@ class Page_Consulting(QWidget):
back_btn_main.setMinimumWidth(200) back_btn_main.setMinimumWidth(200)
back_btn_main.setMaximumWidth(200) back_btn_main.setMaximumWidth(200)
back_btn_step = QPushButton("← Zurück") back_btn_step = QPushButton("← Zurück")
back_btn_step.clicked.connect(lambda: self.back_requested.emit(False)) back_btn_step.clicked.connect(lambda: self.back_requested.emit())
back_btn_step.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) back_btn_step.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
back_btn_step.setMinimumWidth(200) back_btn_step.setMinimumWidth(200)
back_btn_step.setMaximumWidth(200) back_btn_step.setMaximumWidth(200)
@@ -5792,30 +5838,36 @@ class MainWindow(QMainWindow):
self.new_initrec_select.consulting_requested.connect(self.show_page_consulting) self.new_initrec_select.consulting_requested.connect(self.show_page_consulting)
self.stack.addWidget(self.new_initrec_select) self.stack.addWidget(self.new_initrec_select)
# SITE: 'Grunderfassung Unternehmen' # SITE: 'Grunderfassung Unternehmen'
ids = EntityIds(type=EntityType.COMPANY)
initrec_company_state = Page_InitRecCompany_State( initrec_company_state = Page_InitRecCompany_State(
session=self.STATE.session, locked=False session=self.STATE.session, ids=ids, locked=False
) )
self.initrec_company = Page_InitRecCompany(initrec_company_state) self.initrec_company = Page_InitRecCompany(initrec_company_state)
self.initrec_company.back_main_requested.connect(self.show_main_page) self.initrec_company.back_main_requested.connect(self.show_main_page)
self.initrec_company.back_requested.connect(self.show_new_entry_select) self.initrec_company.back_requested.connect(self.simple_go_back)
self.initrec_company.update_main_page.connect(self.update_grid) self.initrec_company.update_main_page.connect(self.update_grid)
self.initrec_company.initrec_person_requested.connect(self.show_page_initrec_person) self.initrec_company.initrec_person_requested.connect(self.show_page_initrec_person)
self.initrec_company.company_profile_requested.connect(self.show_page_company_profile) self.initrec_company.company_profile_requested.connect(self.show_page_company_profile)
self.stack.addWidget(self.initrec_company) self.stack.addWidget(self.initrec_company)
# SITE: 'Grunderfassung Person' # SITE: 'Grunderfassung Person'
ids = EntityIds(type=EntityType.PERSON)
initrec_person_state = Page_InitRecPerson_State( initrec_person_state = Page_InitRecPerson_State(
session=self.STATE.session, locked=False session=self.STATE.session, ids=ids, locked=False
) )
self.initrec_person = Page_InitRecPerson(initrec_person_state) self.initrec_person = Page_InitRecPerson(initrec_person_state)
self.initrec_person.back_main_requested.connect(self.show_main_page) self.initrec_person.back_main_requested.connect(self.show_main_page)
self.initrec_person.back_requested.connect(self.show_new_entry_select) self.initrec_person.back_requested.connect(self.simple_go_back)
self.initrec_person.update_triggered.connect(self.update_grid) self.initrec_person.update_triggered.connect(self.update_grid)
self.stack.addWidget(self.initrec_person) self.stack.addWidget(self.initrec_person)
# SITE: 'Unternehmensprofil' # SITE: 'Unternehmensprofil'
comp_profile_state = Page_CompanyProfile_State(session=self.STATE.session) comp_profile_state = Page_CompanyProfile_State(
session=self.STATE.session, ids=EntityIds()
)
self.company_profile = Page_CompanyProfile(comp_profile_state) self.company_profile = Page_CompanyProfile(comp_profile_state)
self.company_profile.back_main_requested.connect(self.show_main_page) self.company_profile.back_main_requested.connect(self.show_main_page)
self.company_profile.back_requested.connect(self.show_page_initrec_company) # TODO remove
# self.company_profile.back_requested.connect(self.show_page_initrec_company)
self.company_profile.back_requested.connect(self.simple_go_back)
self.company_profile.consulting_requested.connect(self.show_page_consulting) self.company_profile.consulting_requested.connect(self.show_page_consulting)
self.stack.addWidget(self.company_profile) self.stack.addWidget(self.company_profile)
# SITE: 'Beratungsgespräch' # SITE: 'Beratungsgespräch'
@@ -5947,18 +5999,22 @@ class MainWindow(QMainWindow):
data: types.MainPageEntry, data: types.MainPageEntry,
): ):
target: QWidget target: QWidget
if data.type is types.InitRecType.COMPANY: if data.type is types.EntityType.COMPANY:
ids = EntityIds(un_id=data.rec_id, type=EntityType.COMPANY)
new_state = Page_InitRecCompany_State( new_state = Page_InitRecCompany_State(
session=self.STATE.session, session=self.STATE.session,
un_id=data.rec_id, ids=ids,
# un_id=data.rec_id, # TODO remove
locked=True, locked=True,
) )
self.initrec_company.load_state(new_state) self.initrec_company.load_state(new_state)
target = self.initrec_company target = self.initrec_company
elif data.type is types.InitRecType.PERSON: elif data.type is types.EntityType.PERSON:
ids = EntityIds(pers_id=data.rec_id, type=EntityType.PERSON)
new_state = Page_InitRecPerson_State( new_state = Page_InitRecPerson_State(
session=self.STATE.session, session=self.STATE.session,
pers_id=data.rec_id, ids=ids,
# pers_id=data.rec_id, # TODO remove
locked=True, locked=True,
) )
self.initrec_person.load_state(new_state) self.initrec_person.load_state(new_state)
+49 -3
View File
@@ -18,7 +18,7 @@ ExtAnId: TypeAlias = int
PolarsSchema: TypeAlias = dict[str, type["pl.DataType"]] PolarsSchema: TypeAlias = dict[str, type["pl.DataType"]]
class InitRecType(enum.IntEnum): class EntityType(enum.IntEnum):
COMPANY = enum.auto() COMPANY = enum.auto()
PERSON = enum.auto() PERSON = enum.auto()
@@ -28,10 +28,56 @@ class ConsultingType(enum.StrEnum):
INDIVIDUAL = enum.auto() INDIVIDUAL = enum.auto()
@dc.dataclass(slots=True) @dc.dataclass(slots=True, kw_only=True)
class EntityIds: class EntityIds:
un_id: RecId | None = None un_id: RecId | None = None
pers_id: RecId | None = None pers_id: RecId | None = None
type: dc.InitVar[EntityType | None] = None
_ent_type: EntityType | None = dc.field(init=False)
def __post_init__(self, type: EntityType | None) -> None:
self._ent_type = type
@property
def ent_type(self) -> EntityType | None:
return self._ent_type
def any(self) -> bool:
return self.un_id is not None or self.pers_id is not None
def all(self) -> bool:
return self.un_id is not None and self.pers_id is not None
def valid(self) -> bool:
if self.ent_type is None:
raise TypeError("Initrec type not defined. Can not determine valid state.")
elif self.ent_type is EntityType.COMPANY:
return self.all()
elif self.ent_type is EntityType.PERSON:
return self.any()
else:
raise RuntimeError(
f"Unknown initrec type {self.ent_type}. This is not supported."
)
def set_id(
self,
id_: RecId | None,
ent_type: EntityType,
) -> None:
if ent_type is EntityType.COMPANY:
self.un_id = id_
elif ent_type is EntityType.PERSON:
self.pers_id = id_
def get_id(
self,
ent_type: EntityType,
) -> RecId | None:
if ent_type is EntityType.COMPANY:
return self.un_id
elif ent_type is EntityType.PERSON:
return self.pers_id
# // database interaction data structures # // database interaction data structures
@@ -94,7 +140,7 @@ class MainPageEntry:
rec_id: RecId rec_id: RecId
display_name: str display_name: str
Metadaten_aktualisierung: datetime.datetime Metadaten_aktualisierung: datetime.datetime
type: InitRecType type: EntityType
@dc.dataclass(slots=True) @dc.dataclass(slots=True)