Specs stay at repo root (cross-VM). Move deploy and code into logical projects with README per domain, updated manifest.yaml, and symlinks at legacy paths for VM122 backward compatibility.
94 lines
2.7 KiB
Python
94 lines
2.7 KiB
Python
"""Persistência vm123_identity_map — Spec 027 data-model."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from datetime import datetime, timezone
|
|
from typing import Any
|
|
|
|
|
|
def _now() -> str:
|
|
return datetime.now(timezone.utc).isoformat()
|
|
|
|
|
|
def init_schema(conn) -> None:
|
|
conn.executescript(
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS vm123_identity_map (
|
|
desk_username TEXT PRIMARY KEY,
|
|
desk_role TEXT NOT NULL,
|
|
foss_staff_id TEXT,
|
|
odoo_uid INTEGER,
|
|
openpanel_username TEXT,
|
|
provision_json TEXT,
|
|
provisioned_at TEXT,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
"""
|
|
)
|
|
|
|
|
|
def get_map(conn, desk_username: str) -> dict[str, Any] | None:
|
|
row = conn.execute(
|
|
"SELECT * FROM vm123_identity_map WHERE desk_username = ?",
|
|
(desk_username.strip().lower(),),
|
|
).fetchone()
|
|
if not row:
|
|
return None
|
|
out = dict(row)
|
|
if out.get("provision_json"):
|
|
try:
|
|
out["provision"] = json.loads(out["provision_json"])
|
|
except json.JSONDecodeError:
|
|
out["provision"] = {}
|
|
return out
|
|
|
|
|
|
def upsert_map(
|
|
conn,
|
|
*,
|
|
desk_username: str,
|
|
desk_role: str,
|
|
foss_staff_id: str | None = None,
|
|
odoo_uid: int | None = None,
|
|
openpanel_username: str | None = None,
|
|
provision: dict | None = None,
|
|
) -> dict[str, Any]:
|
|
user = desk_username.strip().lower()
|
|
now = _now()
|
|
existing = get_map(conn, user)
|
|
prov_json = json.dumps(provision or {}, ensure_ascii=False)
|
|
if existing:
|
|
conn.execute(
|
|
"""
|
|
UPDATE vm123_identity_map SET
|
|
desk_role = ?, foss_staff_id = COALESCE(?, foss_staff_id),
|
|
odoo_uid = COALESCE(?, odoo_uid),
|
|
openpanel_username = COALESCE(?, openpanel_username),
|
|
provision_json = ?, updated_at = ?,
|
|
provisioned_at = COALESCE(provisioned_at, ?)
|
|
WHERE desk_username = ?
|
|
""",
|
|
(
|
|
desk_role,
|
|
foss_staff_id,
|
|
odoo_uid,
|
|
openpanel_username,
|
|
prov_json,
|
|
now,
|
|
now,
|
|
user,
|
|
),
|
|
)
|
|
else:
|
|
conn.execute(
|
|
"""
|
|
INSERT INTO vm123_identity_map
|
|
(desk_username, desk_role, foss_staff_id, odoo_uid, openpanel_username,
|
|
provision_json, provisioned_at, updated_at)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
""",
|
|
(user, desk_role, foss_staff_id, odoo_uid, openpanel_username, prov_json, now, now),
|
|
)
|
|
conn.commit()
|
|
return get_map(conn, user) or {}
|