related contact detail

This commit is contained in:
2026-08-10 23:55:23 +02:00
parent 00e4e54599
commit debaf7dd62
2 changed files with 25 additions and 12 deletions
+6 -6
View File
@@ -70,19 +70,19 @@ def _enrich_related_names(conn, contact: dict) -> None:
related = contact.get("related_names", []) related = contact.get("related_names", [])
if not related: if not related:
return return
uids = [r["value"] for r in related if r.get("value")] names = list({r["value"] for r in related if r.get("value")})
if not uids: if not names:
return return
resolved = db.resolve_related_names(conn, contact["account"], uids) resolved = db.resolve_related_names(conn, contact["account"], names)
for r in related: for r in related:
uid = r.get("value", "") name = r.get("value", "")
info = resolved.get(uid) info = resolved.get(name)
if info: if info:
r["id"] = info["id"] r["id"] = info["id"]
r["name"] = info["name"] r["name"] = info["name"]
else: else:
r["id"] = None r["id"] = None
r["name"] = uid r["name"] = name
def _account_filter_clause(account_name: str | None) -> tuple[str, list]: def _account_filter_clause(account_name: str | None) -> tuple[str, list]:
+19 -6
View File
@@ -383,16 +383,29 @@ def get_groups_for_contact(conn, account: str, member_uid: str) -> list[dict]:
return cur.fetchall() return cur.fetchall()
def resolve_related_names(conn, account: str, uids: list[str]) -> dict[str, dict]: def resolve_related_names(conn, account: str, names: list[str]) -> dict[str, dict]:
if not uids: if not names:
return {} return {}
placeholders = ", ".join(["%s"] * len(uids)) conditions = []
params: list = [account]
for name in names:
conditions.append("full_name = %s")
params.append(name)
parts = name.strip().split()
if len(parts) >= 2:
conditions.append("(given_name = %s AND family_name = %s)")
params.extend([parts[0], parts[-1]])
placeholders = " OR ".join(conditions)
with conn.cursor() as cur: with conn.cursor() as cur:
cur.execute( cur.execute(
f"SELECT uid, id, full_name FROM contacts WHERE account = %s AND uid IN ({placeholders})", f"SELECT full_name, id, given_name, family_name FROM contacts WHERE account = %s AND ({placeholders})",
[account] + uids, params,
) )
return {row["uid"]: {"id": row["id"], "name": row["full_name"]} for row in cur.fetchall()} result = {}
for row in cur.fetchall():
fn = row["full_name"] or f"{row.get('given_name') or ''} {row.get('family_name') or ''}".strip()
result[fn] = {"id": row["id"], "name": fn}
return result
def get_group_count(conn, account: str | None) -> int: def get_group_count(conn, account: str | None) -> int: