mirror of
https://github.com/skoelle/icloud-contacts-sync.git
synced 2026-09-17 15:30:24 +00:00
sync social_profiles fix
This commit is contained in:
+5
-5
@@ -31,7 +31,7 @@ templates = Jinja2Templates(directory="api/templates")
|
|||||||
|
|
||||||
def _row_to_contact_out(row: dict) -> dict:
|
def _row_to_contact_out(row: dict) -> dict:
|
||||||
row = dict(row)
|
row = dict(row)
|
||||||
for field in ["emails", "phones", "addresses", "urls", "categories"]:
|
for field in ["emails", "phones", "addresses", "urls", "social_profiles", "categories"]:
|
||||||
raw = row.get(field)
|
raw = row.get(field)
|
||||||
row[field] = json.loads(raw) if raw else []
|
row[field] = json.loads(raw) if raw else []
|
||||||
if not row.get("full_name"):
|
if not row.get("full_name"):
|
||||||
@@ -76,7 +76,7 @@ def list_contacts(
|
|||||||
|
|
||||||
cur.execute(
|
cur.execute(
|
||||||
f"""SELECT id, account, uid, full_name, given_name, family_name, organization,
|
f"""SELECT id, account, uid, full_name, given_name, family_name, organization,
|
||||||
job_title, birthday, notes, emails, phones, addresses, urls, categories, updated_at
|
job_title, birthday, notes, emails, phones, addresses, urls, social_profiles, categories, updated_at
|
||||||
FROM contacts {where_clause}{search_clause}
|
FROM contacts {where_clause}{search_clause}
|
||||||
ORDER BY full_name
|
ORDER BY full_name
|
||||||
LIMIT %s OFFSET %s""",
|
LIMIT %s OFFSET %s""",
|
||||||
@@ -98,7 +98,7 @@ def get_contact(contact_id: int, current_user: str = Depends(get_current_user)):
|
|||||||
with conn.cursor() as cur:
|
with conn.cursor() as cur:
|
||||||
cur.execute(
|
cur.execute(
|
||||||
f"""SELECT id, account, uid, full_name, given_name, family_name, organization,
|
f"""SELECT id, account, uid, full_name, given_name, family_name, organization,
|
||||||
job_title, birthday, notes, emails, phones, addresses, urls, categories, updated_at
|
job_title, birthday, notes, emails, phones, addresses, urls, social_profiles, categories, updated_at
|
||||||
FROM contacts {where_clause} {id_clause}""",
|
FROM contacts {where_clause} {id_clause}""",
|
||||||
params + [contact_id],
|
params + [contact_id],
|
||||||
)
|
)
|
||||||
@@ -121,7 +121,7 @@ def birthdays_today(current_user: str = Depends(get_current_user)):
|
|||||||
with conn.cursor() as cur:
|
with conn.cursor() as cur:
|
||||||
cur.execute(
|
cur.execute(
|
||||||
f"""SELECT id, account, uid, full_name, given_name, family_name, organization,
|
f"""SELECT id, account, uid, full_name, given_name, family_name, organization,
|
||||||
job_title, birthday, notes, emails, phones, addresses, urls, categories, updated_at
|
job_title, birthday, notes, emails, phones, addresses, urls, social_profiles, categories, updated_at
|
||||||
FROM contacts {where_clause} {month_day_clause}
|
FROM contacts {where_clause} {month_day_clause}
|
||||||
ORDER BY full_name""",
|
ORDER BY full_name""",
|
||||||
params + [today.month, today.day],
|
params + [today.month, today.day],
|
||||||
@@ -293,7 +293,7 @@ def web_contact(
|
|||||||
with conn.cursor() as cur:
|
with conn.cursor() as cur:
|
||||||
cur.execute(
|
cur.execute(
|
||||||
f"""SELECT id, account, uid, full_name, given_name, family_name, organization,
|
f"""SELECT id, account, uid, full_name, given_name, family_name, organization,
|
||||||
job_title, birthday, notes, emails, phones, addresses, urls, categories, updated_at
|
job_title, birthday, notes, emails, phones, addresses, urls, social_profiles, categories, updated_at
|
||||||
FROM contacts {where_clause} {id_clause}""",
|
FROM contacts {where_clause} {id_clause}""",
|
||||||
params + [contact_id],
|
params + [contact_id],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ class ContactOut(BaseModel):
|
|||||||
phones: list
|
phones: list
|
||||||
addresses: list
|
addresses: list
|
||||||
urls: list
|
urls: list
|
||||||
|
social_profiles: list
|
||||||
categories: list
|
categories: list
|
||||||
updated_at: str
|
updated_at: str
|
||||||
|
|
||||||
|
|||||||
@@ -277,6 +277,20 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if contact.social_profiles %}
|
||||||
|
<div class="section">
|
||||||
|
<div class="section-title">Soziale Profile</div>
|
||||||
|
<div class="section-list">
|
||||||
|
{% for sp in contact.social_profiles %}
|
||||||
|
<div class="section-item">
|
||||||
|
<span class="section-item-label">{{ sp.type }}{% if sp.username %} ({{ sp.username }}){% endif %}</span>
|
||||||
|
<span class="section-item-value"><a href="{{ sp.url }}" target="_blank">{{ sp.url }}</a></span>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if contact.categories %}
|
{% if contact.categories %}
|
||||||
<div class="section">
|
<div class="section">
|
||||||
<div class="section-title">Kategorien</div>
|
<div class="section-title">Kategorien</div>
|
||||||
|
|||||||
+16
-1
@@ -69,6 +69,21 @@ def parse_vcard(raw_text: str, account: str, etag: str | None = None) -> dict |
|
|||||||
urls = [{"type": _type_str(u), "value": u.value}
|
urls = [{"type": _type_str(u), "value": u.value}
|
||||||
for u in getattr(vcard, "url_list", [])]
|
for u in getattr(vcard, "url_list", [])]
|
||||||
|
|
||||||
|
social_profiles = []
|
||||||
|
for sp in vcard.contents.get("x-socialprofile", []):
|
||||||
|
params = getattr(sp, "params", {})
|
||||||
|
type_val = params.get("TYPE") or params.get("type") or "other"
|
||||||
|
if isinstance(type_val, list):
|
||||||
|
type_val = type_val[0] if type_val else "other"
|
||||||
|
username = params.get("X-USER") or params.get("x-user") or ""
|
||||||
|
if isinstance(username, list):
|
||||||
|
username = username[0] if username else ""
|
||||||
|
social_profiles.append({
|
||||||
|
"type": type_val,
|
||||||
|
"username": username,
|
||||||
|
"url": sp.value if sp.value else "",
|
||||||
|
})
|
||||||
|
|
||||||
categories = [c.strip() for c in vcard.categories.value] if hasattr(vcard, "categories") else []
|
categories = [c.strip() for c in vcard.categories.value] if hasattr(vcard, "categories") else []
|
||||||
|
|
||||||
birthday = str(vcard.bday.value)[:10] if hasattr(vcard, "bday") else None
|
birthday = str(vcard.bday.value)[:10] if hasattr(vcard, "bday") else None
|
||||||
@@ -100,7 +115,7 @@ def parse_vcard(raw_text: str, account: str, etag: str | None = None) -> dict |
|
|||||||
"phones": json.dumps(phones, ensure_ascii=False),
|
"phones": json.dumps(phones, ensure_ascii=False),
|
||||||
"addresses": json.dumps(addresses, ensure_ascii=False),
|
"addresses": json.dumps(addresses, ensure_ascii=False),
|
||||||
"urls": json.dumps(urls, ensure_ascii=False),
|
"urls": json.dumps(urls, ensure_ascii=False),
|
||||||
"social_profiles": json.dumps([], ensure_ascii=False),
|
"social_profiles": json.dumps(social_profiles, ensure_ascii=False),
|
||||||
"related_names": json.dumps([], ensure_ascii=False),
|
"related_names": json.dumps([], ensure_ascii=False),
|
||||||
"categories": json.dumps(categories, ensure_ascii=False),
|
"categories": json.dumps(categories, ensure_ascii=False),
|
||||||
"raw_vcard": raw_text,
|
"raw_vcard": raw_text,
|
||||||
|
|||||||
Reference in New Issue
Block a user