prepare better DB interaction with reload

This commit is contained in:
2026-05-06 15:35:49 +02:00
parent 3dbc9ecfcb
commit c3462d3d3a
4 changed files with 365 additions and 76 deletions

View File

@@ -32,9 +32,12 @@ class SafeDateTime(TypeDecorator):
return None
md_kontaktliste = sql.MetaData()
md_crm = sql.MetaData()
# ---------- OLD "Kontaktliste" ----------
md_kontaktliste = sql.MetaData()
ext_kl_unternehmen: sql.Table = Table(
"Unternehmen",
md_kontaktliste,
@@ -107,6 +110,8 @@ def get_ext_kontaktliste(
df_kontaktliste = get_ext_kontaktliste(None)
# ----------------------------------------------------
ext_crm_master: sql.Table = Table(
"Master",
md_crm,
@@ -211,3 +216,82 @@ ext_crm_nutzer_schema: t.PolarsSchema = {
"wce_aktiv": pl.Boolean,
"wce_letzter_login": pl.Datetime,
}
ext_crm_contact_person: sql.Table = Table(
"Ansprechpartner",
md_crm,
Column("an_id", sql.Integer, nullable=False, unique=True),
Column("ma_id", sql.ForeignKey("Master.ma_id")),
Column("wce_id", sql.ForeignKey("Nutzer.wce_id")),
Column("st_id", sql.Integer, nullable=False),
Column("an_sachgebiet", sql.Text, nullable=True),
Column("an_anrede", sql.Text, nullable=True),
Column("an_titel", sql.Text, nullable=True),
Column("an_nachname", sql.Text, nullable=True),
Column("an_vorname", sql.Text, nullable=True),
Column("an_position", sql.Text, nullable=True),
Column("an_mail", sql.Text, nullable=True),
Column("an_festnetz", sql.Text, nullable=True),
Column("an_mobil", sql.Text, nullable=True),
Column("an_faxnummer", sql.Text, nullable=True),
Column("an_hauptansprechpartner", sql.Text, nullable=True),
Column("an_anrede_anschrift", sql.Text, nullable=True),
Column("an_bemerkung", sql.Text, nullable=True),
Column("an_aktualisierung_datum", SafeDateTime, nullable=True),
Column("an_aktualisierung_nutzer", sql.Text, nullable=True),
Column("an_letztes_kontaktdatum", SafeDateTime, nullable=True),
Column("an_ersteintrag_datum", SafeDateTime, nullable=True),
Column("an_archiviert", sql.Boolean, nullable=True, default=0),
)
ext_crm_contact_person_schema: t.PolarsSchema = {
"an_id": pl.UInt64,
"ma_id": pl.UInt64,
"wce_id": pl.UInt64,
"st_id": pl.UInt64,
"an_sachgebiet": pl.String,
"an_anrede": pl.String,
"an_titel": pl.String,
"an_nachname": pl.String,
"an_vorname": pl.String,
"an_position": pl.String,
"an_mail": pl.String,
"an_festnetz": pl.String,
"an_mobil": pl.String,
"an_faxnummer": pl.String,
"an_hauptansprechpartner": pl.String,
"an_anrede_anschrift": pl.String,
"an_bemerkung": pl.String,
"an_aktualisierung_datum": pl.Datetime,
"an_aktualisierung_nutzer": pl.String,
"an_letztes_kontaktdatum": pl.Datetime,
"an_ersteintrag_datum": pl.Datetime,
"an_archiviert": pl.Boolean,
}
def get_ext_crm_contact_person(
db_path: Path | None,
) -> pl.DataFrame:
if db_path is None:
ENV_PTH = os.environ.get("DOPT_DB_CRM", None)
if ENV_PTH is None:
raise ValueError("No database path provided or found as ENV var.")
db_path = Path(ENV_PTH)
if not db_path.exists():
raise FileNotFoundError(f"Database not found under >{db_path}<")
engine = sql.create_engine(f"sqlite:///{db_path}")
stmt = sql.select(ext_crm_contact_person)
df = pl.read_database(stmt, engine, schema_overrides=ext_crm_contact_person_schema)
# TODO Database seems to contain entries with invalid characters like \t or \n
df = df.with_columns(
pl.col(pl.String).str.replace_all(r"[\r\t\n]", " ").str.strip_chars(" ")
)
return df
df_contact_person = get_ext_crm_contact_person(None)