docker-apps/radicale/webhooks/scripts/contactdates/addressbook.py

66 lines
2.5 KiB
Python

#!/usr/bin/env python3
from pprint import pprint
import vobject
from .types import Event
from .utils import parse_date
def read_contact_date_field(card, target: list[Event], field_name: str, target_field_name: str):
if field_name in card.contents:
for idx, component in enumerate(card.contents[field_name]): # datetime.date or string depending on format
field_id = f"{field_name}-{idx}"
omit_year = component.params.get("X-APPLE-OMIT-YEAR")
dt = parse_date(field_id, target_field_name, component.value, omit_year[0] if omit_year else False)
target.append(dt)
def read_contact_abdate_field(card, target: list[Event]):
grouped_fields = {}
field_name = "x-abdate"
field_name_2 = "x-ablabel"
if field_name in card.contents:
for component in card.contents[field_name]: # datetime.date or string depending on format
if component.group not in grouped_fields:
grouped_fields[component.group] = {}
grouped_fields[component.group]["value"] = component.value
if field_name_2 in card.contents:
for component in card.contents[field_name_2]: # datetime.date or string depending on format
if component.group not in grouped_fields:
grouped_fields[component.group] = {}
grouped_fields[component.group]["name"] = component.value
# if len(grouped_fields):
# pprint(card)
for group in grouped_fields:
f = grouped_fields[group]
# pprint(group)
# pprint(f)
if "name" in f and "value" in f:
target.append(parse_date(group, f["name"], f["value"]))
def read_contact(path: str) -> tuple[vobject.vCard, list[Event]]:
# print("---")
# with open(path, 'r') as file:
# print(file.read())
# print("---")
with open(path) as f:
card = vobject.readOne(f)
result = []
read_contact_date_field(card, result, "bday", "birthday")
read_contact_date_field(card, result, "anniversary", "anniversary")
read_contact_date_field(card, result, "x-anniversary", "anniversary")
# result["x-abdate"] = read_contact_date_field(card, "x-abdate") # need specific parsing. also see X-ABDATE;X-ABLABEL
read_contact_date_field(card, result, "x-anniversary", "anniversary")
read_contact_date_field(card, result, "x-evolution-anniversary", "anniversary") # also see X-EVOLUTION-SPOUSE
read_contact_abdate_field(card, result) # also see X-EVOLUTION-SPOUSE
return card, result