mirror of
https://github.com/skoelle/icloud-contacts-sync.git
synced 2026-09-17 15:30:24 +00:00
related contact detail
This commit is contained in:
+6
-6
@@ -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]:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user