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", [])
if not related:
return
uids = [r["value"] for r in related if r.get("value")]
if not uids:
names = list({r["value"] for r in related if r.get("value")})
if not names:
return
resolved = db.resolve_related_names(conn, contact["account"], uids)
resolved = db.resolve_related_names(conn, contact["account"], names)
for r in related:
uid = r.get("value", "")
info = resolved.get(uid)
name = r.get("value", "")
info = resolved.get(name)
if info:
r["id"] = info["id"]
r["name"] = info["name"]
else:
r["id"] = None
r["name"] = uid
r["name"] = name
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()
def resolve_related_names(conn, account: str, uids: list[str]) -> dict[str, dict]:
if not uids:
def resolve_related_names(conn, account: str, names: list[str]) -> dict[str, dict]:
if not names:
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:
cur.execute(
f"SELECT uid, id, full_name FROM contacts WHERE account = %s AND uid IN ({placeholders})",
[account] + uids,
f"SELECT full_name, id, given_name, family_name FROM contacts WHERE account = %s AND ({placeholders})",
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: