Coverage for icloudpy/services/reminders.py: 21%
43 statements
« prev ^ index » next coverage.py v7.6.10, created at 2024-12-30 19:31 +0000
« prev ^ index » next coverage.py v7.6.10, created at 2024-12-30 19:31 +0000
1"""Reminders service."""
2import json
3import time
4import uuid
5from datetime import datetime
7from tzlocal import get_localzone
10class RemindersService:
11 """The 'Reminders' iCloud service."""
13 def __init__(self, service_root, session, params):
14 self.session = session
15 self._params = params
16 self._service_root = service_root
18 self.lists = {}
19 self.collections = {}
21 self.refresh()
23 def refresh(self):
24 """Refresh data."""
25 params_reminders = dict(self._params)
26 params_reminders.update(
27 {
28 "clientVersion": "4.0",
29 "lang": "en-us",
30 "usertz": get_localzone().zone,
31 "dsid": self.session.service.data["dsInfo"]["dsid"],
32 },
33 )
35 # Open reminders
36 req = self.session.get(
37 self._service_root + "/rd/startup", params=params_reminders,
38 )
40 data = req.json()
42 self.lists = {}
43 self.collections = {}
44 for collection in data["Collections"]:
45 temp = []
46 self.collections[collection["title"]] = {
47 "guid": collection["guid"],
48 "ctag": collection["ctag"],
49 }
50 for reminder in data["Reminders"]:
52 if reminder["pGuid"] != collection["guid"]:
53 continue
55 if reminder.get("dueDate"):
56 due = datetime(
57 reminder["dueDate"][1],
58 reminder["dueDate"][2],
59 reminder["dueDate"][3],
60 reminder["dueDate"][4],
61 reminder["dueDate"][5],
62 )
63 else:
64 due = None
66 temp.append(
67 {
68 "title": reminder["title"],
69 "desc": reminder.get("description"),
70 "due": due,
71 },
72 )
73 self.lists[collection["title"]] = temp
75 def post(self, title, description="", collection=None, due_date=None):
76 """Adds a new reminder."""
77 pguid = "tasks"
78 if collection:
79 if collection in self.collections:
80 pguid = self.collections[collection]["guid"]
82 params_reminders = dict(self._params)
83 params_reminders.update(
84 {"clientVersion": "4.0", "lang": "en-us", "usertz": get_localzone().zone},
85 )
87 due_dates = None
88 if due_date:
89 due_dates = [
90 int(str(due_date.year) + str(due_date.month) + str(due_date.day)),
91 due_date.year,
92 due_date.month,
93 due_date.day,
94 due_date.hour,
95 due_date.minute,
96 ]
98 req = self.session.post(
99 self._service_root + "/rd/reminders/tasks",
100 data=json.dumps(
101 {
102 "Reminders": {
103 "title": title,
104 "description": description,
105 "pGuid": pguid,
106 "etag": None,
107 "order": None,
108 "priority": 0,
109 "recurrence": None,
110 "alarms": [],
111 "startDate": None,
112 "startDateTz": None,
113 "startDateIsAllDay": False,
114 "completedDate": None,
115 "dueDate": due_dates,
116 "dueDateIsAllDay": False,
117 "lastModifiedDate": None,
118 "createdDate": None,
119 "isFamily": None,
120 "createdDateExtended": int(time.time() * 1000),
121 "guid": str(uuid.uuid4()),
122 },
123 "ClientState": {"Collections": list(self.collections.values())},
124 },
125 ),
126 params=params_reminders,
127 )
128 return req.ok