Coverage for icloudpy/services/reminders.py: 21%

43 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2024-04-12 14:26 +0000

1"""Reminders service.""" 

2import json 

3import time 

4import uuid 

5from datetime import datetime 

6 

7from tzlocal import get_localzone 

8 

9 

10class RemindersService: 

11 """The 'Reminders' iCloud service.""" 

12 

13 def __init__(self, service_root, session, params): 

14 self.session = session 

15 self._params = params 

16 self._service_root = service_root 

17 

18 self.lists = {} 

19 self.collections = {} 

20 

21 self.refresh() 

22 

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 ) 

34 

35 # Open reminders 

36 req = self.session.get( 

37 self._service_root + "/rd/startup", params=params_reminders 

38 ) 

39 

40 data = req.json() 

41 

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"]: 

51 

52 if reminder["pGuid"] != collection["guid"]: 

53 continue 

54 

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 

65 

66 temp.append( 

67 { 

68 "title": reminder["title"], 

69 "desc": reminder.get("description"), 

70 "due": due, 

71 } 

72 ) 

73 self.lists[collection["title"]] = temp 

74 

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"] 

81 

82 params_reminders = dict(self._params) 

83 params_reminders.update( 

84 {"clientVersion": "4.0", "lang": "en-us", "usertz": get_localzone().zone} 

85 ) 

86 

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 ] 

97 

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