Coverage for icloudpy/services/calendar.py: 20%

44 statements  

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

1"""Calendar service.""" 

2from calendar import monthrange 

3from datetime import datetime 

4 

5from tzlocal import get_localzone 

6 

7 

8class CalendarService: 

9 """ 

10 The 'Calendar' iCloud service, connects to iCloud and returns events. 

11 """ 

12 

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

14 self.session = session 

15 self.params = params 

16 self._service_root = service_root 

17 self._calendar_endpoint = f"{self._service_root}/ca" 

18 self._calendar_refresh_url = f"{self._calendar_endpoint}/events" 

19 self._calendar_event_detail_url = f"{self._calendar_endpoint}/eventdetail" 

20 self._calendars = f"{self._calendar_endpoint}/startup" 

21 

22 self.response = {} 

23 

24 def get_event_detail(self, pguid, guid): 

25 """ 

26 Fetches a single event's details by specifying a pguid 

27 (a calendar) and a guid (an event's ID). 

28 """ 

29 params = dict(self.params) 

30 params.update( 

31 { 

32 "lang": "en-us", 

33 "usertz": get_localzone().zone, 

34 "dsid": self.session.service.data["dsInfo"]["dsid"], 

35 } 

36 ) 

37 url = f"{self._calendar_event_detail_url}/{pguid}/{guid}" 

38 req = self.session.get(url, params=params) 

39 self.response = req.json() 

40 return self.response["Event"][0] 

41 

42 def refresh_client(self, from_dt=None, to_dt=None): 

43 """ 

44 Refreshes the CalendarService endpoint, ensuring that the 

45 event data is up-to-date. If no 'from_dt' or 'to_dt' datetimes 

46 have been given, the range becomes this month. 

47 """ 

48 today = datetime.today() 

49 _, last_day = monthrange(today.year, today.month) 

50 if not from_dt: 

51 from_dt = datetime(today.year, today.month, 1) 

52 if not to_dt: 

53 to_dt = datetime(today.year, today.month, last_day) 

54 params = dict(self.params) 

55 params.update( 

56 { 

57 "lang": "en-us", 

58 "usertz": get_localzone().zone, 

59 "startDate": from_dt.strftime("%Y-%m-%d"), 

60 "endDate": to_dt.strftime("%Y-%m-%d"), 

61 "dsid": self.session.service.data["dsInfo"]["dsid"], 

62 } 

63 ) 

64 req = self.session.get(self._calendar_refresh_url, params=params) 

65 self.response = req.json() 

66 

67 def events(self, from_dt=None, to_dt=None): 

68 """ 

69 Retrieves events for a given date range, by default, this month. 

70 """ 

71 self.refresh_client(from_dt, to_dt) 

72 return self.response.get("Event") 

73 

74 def calendars(self): 

75 """ 

76 Retrieves calendars of this month. 

77 """ 

78 today = datetime.today() 

79 _, last_day = monthrange(today.year, today.month) 

80 from_dt = datetime(today.year, today.month, 1) 

81 to_dt = datetime(today.year, today.month, last_day) 

82 params = dict(self.params) 

83 params.update( 

84 { 

85 "lang": "en-us", 

86 "usertz": get_localzone().zone, 

87 "startDate": from_dt.strftime("%Y-%m-%d"), 

88 "endDate": to_dt.strftime("%Y-%m-%d"), 

89 "dsid": self.session.service.data["dsInfo"]["dsid"], 

90 } 

91 ) 

92 req = self.session.get(self._calendars, params=params) 

93 self.response = req.json() 

94 return self.response["Collection"]