def teardown(self): p = url.make(self.principal.url) path = url.join(p, testcal_id) cal = Calendar(self.caldav, name="Yep", parent = self.principal, url = path) cal.delete()
def test_get_events_icloud(self): """ tests that some XML observed from the icloud returns 0 events found. """ xml = """ <multistatus xmlns="DAV:"> <response> <href>/17149682/calendars/testcalendar-485d002e-31b9-4147-a334-1d71503a4e2c/</href> <propstat> <prop> </prop> <status>HTTP/1.1 200 OK</status> </propstat> <propstat> <prop> <calendar-data xmlns="urn:ietf:params:xml:ns:caldav"/> </prop> <status>HTTP/1.1 404 Not Found</status> </propstat> </response> </multistatus> """ client = MockedDAVClient(xml) calendar = Calendar( client, url= '/17149682/calendars/testcalendar-485d002e-31b9-4147-a334-1d71503a4e2c/' ) assert_equal(len(calendar.events()), 0)
def teardown(self): p = url.make(self.principal.url) path = url.join(p, testcal_id) cal = Calendar(self.caldav, name="Yep", parent=self.principal, url=path) cal.delete()
def testDateSearch(self): """ ## ref https://github.com/python-caldav/caldav/issues/133 """ xml = """<xml><multistatus xmlns="DAV:"> <response> <href>/principals/calendar/[email protected]/963/43B060B3-A023-48ED-B9E7-6FFD38D5073E.ics</href> <propstat> <prop/> <status>HTTP/1.1 200 OK</status> </propstat> <propstat> <prop> <calendar-data xmlns="urn:ietf:params:xml:ns:caldav"/> <expand xmlns="urn:ietf:params:xml:ns:caldav"/> </prop> <status>HTTP/1.1 404 Not Found</status> </propstat> </response> <response> <href>/principals/calendar/[email protected]/963/114A4E50-8835-42E1-8185-8A97567B5C1A.ics</href> <propstat> <prop/> <status>HTTP/1.1 200 OK</status> </propstat> <propstat> <prop> <calendar-data xmlns="urn:ietf:params:xml:ns:caldav"/> <expand xmlns="urn:ietf:params:xml:ns:caldav"/> </prop> <status>HTTP/1.1 404 Not Found</status> </propstat> </response> <response> <href>/principals/calendar/[email protected]/963/C20A8820-7156-4DD2-AD1D-17105D923145.ics</href> <propstat> <prop/> <status>HTTP/1.1 200 OK</status> </propstat> <propstat> <prop> <calendar-data xmlns="urn:ietf:params:xml:ns:caldav"/> <expand xmlns="urn:ietf:params:xml:ns:caldav"/> </prop> <status>HTTP/1.1 404 Not Found</status> </propstat> </response> </multistatus></xml> """ client = MockedDAVClient(xml) calendar = Calendar( client, url='/principals/calendar/[email protected]/963/') results = calendar.date_search(datetime(2021, 2, 1), datetime(2021, 2, 7)) assert_equal(len(results), 3)
def testCreateCalendarAndEvent(self): c = self.principal.make_calendar(name="Yep", cal_id=self.testcal_id) # add event c.add_event(ev1) # c.events() should give a full list of events events = c.events() assert_equal(len(events), 1) # We should be able to access the calender through the URL c2 = Calendar(client=self.caldav, url=c.url) events2 = c2.events() assert_equal(len(events2), 1) assert_equal(events2[0].url, events[0].url)
def testDefaultClient(self): """When no client is given to a DAVObject, but the parent is given, parent.client will be used""" client = DAVClient(url="http://*****:*****@calendar.example:80/") calhome = CalendarSet(client, "http://*****:*****@calendar.example:80/me/") calendar = Calendar(parent=calhome) assert_equal(calendar.client, calhome.client)
def calendar(self, url): """ Instantiante a calendar by knowing its url. This method returns a :class:`caldav.Calendar` object, with higher-level methods for dealing with the calendar events. """ return Calendar(self, url)
def get_all_events(self, calendar: Calendar, start: datetime = None, end: datetime = None): """Get all events from nextcloud calendar. If the start is None the calendar returns all events. If the start and endtime are not None, we are getting all events from this time period. Args: calendar : The nextcloud calendar start: Optional; Search starttime for the events. If not set we get all events. Defaults to None. end: Optional; Search endtime for the events. Defaults to None. Returns: list: Returns a list with the events from the calendar. """ all_events = [] if start is None: return calendar.events() event_date = calendar.date_search(start=start, end=end) for event in event_date: event_start = event.instance.vevent.dtstart.value # for all day events if not isinstance(event_start, datetime): event.instance.vevent.dtstart.value = datetime.combine(event_start, datetime.min.time()) # Mycroft needs full lenght. pylint: disable=line-too-long if event.instance.vevent.dtstart.value.astimezone(self.local_tz) >= start.astimezone(self.local_tz): # Mycroft needs full lenght. pylint: disable=line-too-long all_events.append(event) if end is not None: all_events = [i for i in all_events if i.instance.vevent.dtstart.value.astimezone(self.local_tz) <= end.astimezone(self.local_tz)] # Mycroft needs full lenght. pylint: disable=line-too-long all_events.sort(key=lambda event: event.instance.vevent.dtstart.value.astimezone(self.local_tz)) # Mycroft needs full lenght. pylint: disable=line-too-long return all_events
def testCalendar(self): """ Principal.calendar() and CalendarSet.calendar() should create Calendar objects without initiating any communication with the server. Calendar.event() should create Event object without initiating any communication with the server. DAVClient.__init__ also doesn't do any communication Principal.__init__ as well, if the principal_url is given Principal.calendar_home_set needs to be set or the server will be queried """ cal_url = "http://*****:*****@calendar.example:80/" client = DAVClient(url=cal_url) principal = Principal(client, cal_url + "me/") principal.calendar_home_set = cal_url + "me/calendars/" # calendar_home_set is actually a CalendarSet object assert (isinstance(principal.calendar_home_set, CalendarSet)) calendar1 = principal.calendar(name="foo", cal_id="bar") calendar2 = principal.calendar_home_set.calendar(name="foo", cal_id="bar") calendar3 = principal.calendar(cal_id="bar") assert_equal(calendar1.url, calendar2.url) assert_equal(calendar1.url, calendar3.url) assert_equal(calendar1.url, "http://calendar.example:80/me/calendars/bar/") # principal.calendar_home_set can also be set to an object # This should be noop principal.calendar_home_set = principal.calendar_home_set calendar1 = principal.calendar(name="foo", cal_id="bar") assert_equal(calendar1.url, calendar2.url) # When building a calendar from a relative URL and a client, # the relative URL should be appended to the base URL in the client calendar1 = Calendar(client, 'someoneelse/calendars/main_calendar') calendar2 = Calendar( client, 'http://*****:*****@calendar.example:80/someoneelse/calendars/main_calendar' ) assert_equal(calendar1.url, calendar2.url)
def testPathWithEscapedCharacters(self): xml = b"""<D:multistatus xmlns:D="DAV:" xmlns:caldav="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/" xmlns:ical="http://apple.com/ns/ical/"> <D:response xmlns:carddav="urn:ietf:params:xml:ns:carddav" xmlns:cm="http://cal.me.com/_namespace/" xmlns:md="urn:mobileme:davservices"> <D:href>/some/caldav/root/133bahgr6ohlo9ungq0it45vf8%40group.calendar.google.com/events/</D:href> <D:propstat> <D:status>HTTP/1.1 200 OK</D:status> <D:prop> <caldav:supported-calendar-component-set> <caldav:comp name="VEVENT"/> </caldav:supported-calendar-component-set> </D:prop> </D:propstat> </D:response> </D:multistatus>""" client = MockedDAVClient(xml) assert_equal( Calendar( client=client, url= "https://somwhere.in.the.universe.example/some/caldav/root/133bahgr6ohlo9ungq0it45vf8%40group.calendar.google.com/events/" ).get_supported_components(), ['VEVENT'])
def test_supported_components(self): xml = """ <multistatus xmlns="DAV:"> <response xmlns="DAV:"> <href>/17149682/calendars/testcalendar-0da571c7-139c-479a-9407-8ce9ed20146d/</href> <propstat> <prop> <supported-calendar-component-set xmlns="urn:ietf:params:xml:ns:caldav"> <comp xmlns="urn:ietf:params:xml:ns:caldav" name="VEVENT"/> </supported-calendar-component-set> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> </multistatus>""" client = MockedDAVClient(xml) assert_equal( Calendar( client=client, url= "/17149682/calendars/testcalendar-0da571c7-139c-479a-9407-8ce9ed20146d/" ).get_supported_components(), ['VEVENT'])
def testBackwardCompatibility(self): """ Tobias Brox has done some API changes - but this thing should still be backward compatible. """ if not 'backwards_compatibility_url' in self.server_params: return caldav = DAVClient(self.server_params['backwards_compatibility_url']) principal = Principal( caldav, self.server_params['backwards_compatibility_url']) c = Calendar(caldav, name="Yep", parent=principal, id=testcal_id).save() assert_not_equal(c.url, None) c.set_properties([ dav.DisplayName("hooray"), ]) props = c.get_properties([ dav.DisplayName(), ]) assert_equal(props[dav.DisplayName.tag], "hooray") cc = Calendar(caldav, name="Yep", parent=principal).save() assert_not_equal(cc.url, None) cc.delete() e = Event(caldav, data=ev1, parent=c).save() assert_not_equal(e.url, None) ee = Event(caldav, url=url.make(e.url), parent=c) ee.load() assert_equal(e.instance.vevent.uid, ee.instance.vevent.uid) r = c.date_search(datetime(2006, 7, 13, 17, 00, 00), datetime(2006, 7, 15, 17, 00, 00)) assert_equal(e.instance.vevent.uid, r[0].instance.vevent.uid) assert_equal(len(r), 1) all = c.events() assert_equal(len(all), 1) e2 = Event(caldav, data=ev2, parent=c).save() assert_not_equal(e.url, None) tmp = c.event("*****@*****.**") assert_equal(e2.instance.vevent.uid, tmp.instance.vevent.uid) r = c.date_search(datetime(2007, 7, 13, 17, 00, 00), datetime(2007, 7, 15, 17, 00, 00)) assert_equal(len(r), 1) e.data = ev2 e.save() r = c.date_search(datetime(2007, 7, 13, 17, 00, 00), datetime(2007, 7, 15, 17, 00, 00)) for e in r: print(e.data) assert_equal(len(r), 1) e.instance = e2.instance e.save() r = c.date_search(datetime(2007, 7, 13, 17, 00, 00), datetime(2007, 7, 15, 17, 00, 00)) for e in r: print(e.data) assert_equal(len(r), 1)
def testBackwardCompatibility(self): """ Tobias Brox has done some API changes - but this thing should still be backward compatible. """ if not 'backwards_compatibility_url' in self.server_params: return caldav = DAVClient(self.server_params['backwards_compatibility_url']) principal = Principal(caldav, self.server_params['backwards_compatibility_url']) c = Calendar(caldav, name="Yep", parent = principal, id = testcal_id).save() assert_not_equal(c.url, None) c.set_properties([dav.DisplayName("hooray"),]) props = c.get_properties([dav.DisplayName(),]) assert_equal(props[dav.DisplayName.tag], "hooray") cc = Calendar(caldav, name="Yep", parent = principal).save() assert_not_equal(cc.url, None) cc.delete() e = Event(caldav, data = ev1, parent = c).save() assert_not_equal(e.url, None) ee = Event(caldav, url = url.make(e.url), parent = c) ee.load() assert_equal(e.instance.vevent.uid, ee.instance.vevent.uid) r = c.date_search(datetime(2006,7,13,17,00,00), datetime(2006,7,15,17,00,00)) assert_equal(e.instance.vevent.uid, r[0].instance.vevent.uid) assert_equal(len(r), 1) all = c.events() assert_equal(len(all), 1) e2 = Event(caldav, data = ev2, parent = c).save() assert_not_equal(e.url, None) tmp = c.event("*****@*****.**") assert_equal(e2.instance.vevent.uid, tmp.instance.vevent.uid) r = c.date_search(datetime(2007,7,13,17,00,00), datetime(2007,7,15,17,00,00)) assert_equal(len(r), 1) e.data = ev2 e.save() r = c.date_search(datetime(2007,7,13,17,00,00), datetime(2007,7,15,17,00,00)) for e in r: print e.data assert_equal(len(r), 1) e.instance = e2.instance e.save() r = c.date_search(datetime(2007,7,13,17,00,00), datetime(2007,7,15,17,00,00)) for e in r: print e.data assert_equal(len(r), 1)
def testCalendar(self): c = Calendar(self.caldav, name="Yep", parent = self.principal, id = testcal_id).save() assert_not_equal(c.url, None) # TODO: fail #props = c.get_properties([dav.DisplayName(),]) #assert_equal("Yep", props[dav.DisplayName.tag]) c.set_properties([dav.DisplayName("hooray"),]) props = c.get_properties([dav.DisplayName(),]) assert_equal(props[dav.DisplayName.tag], "hooray") print c cc = Calendar(self.caldav, name="Yep", parent = self.principal).save() assert_not_equal(cc.url, None) cc.delete() e = Event(self.caldav, data = ev1, parent = c).save() assert_not_equal(e.url, None) print e, e.data ee = Event(self.caldav, url = url.make(e.url), parent = c) ee.load() assert_equal(e.instance.vevent.uid, ee.instance.vevent.uid) r = c.date_search(datetime(2006,7,13,17,00,00), datetime(2006,7,15,17,00,00)) assert_equal(e.instance.vevent.uid, r[0].instance.vevent.uid) for e in r: print e.data assert_equal(len(r), 1) all = c.events() print all assert_equal(len(all), 1) e2 = Event(self.caldav, data = ev2, parent = c).save() assert_not_equal(e.url, None) tmp = c.event("*****@*****.**") assert_equal(e2.instance.vevent.uid, tmp.instance.vevent.uid) r = c.date_search(datetime(2006,7,13,17,00,00), datetime(2006,7,15,17,00,00)) for e in r: print e.data assert_equal(len(r), 1) e.data = ev2 e.save() r = c.date_search(datetime(2006,7,13,17,00,00), datetime(2006,7,15,17,00,00)) for e in r: print e.data assert_equal(len(r), 1) e.instance = e2.instance e.save() r = c.date_search(datetime(2006,7,13,17,00,00), datetime(2006,7,15,17,00,00)) for e in r: print e.data assert_equal(len(r), 1)
def testCalendar(self): c = Calendar(self.caldav, name="Yep", parent=self.principal, id=testcal_id).save() assert_not_equal(c.url, None) # TODO: fail #props = c.get_properties([DAVDisplayName(),]) #assert_equal("Yep", props[DAVDisplayName.tag]) c.set_properties([ dav.DisplayName("hooray"), ]) props = c.get_properties([ dav.DisplayName(), ]) assert_equal(props[dav.DisplayName.tag], "hooray") print c cc = Calendar(self.caldav, name="Yep", parent=self.principal).save() assert_not_equal(cc.url, None) cc.delete() e = Event(self.caldav, data=ev1, parent=c).save() assert_not_equal(e.url, None) print e, e.data ee = Event(self.caldav, url=url.make(e.url), parent=c) ee.load() assert_equal(e.instance.vevent.uid, ee.instance.vevent.uid) r = c.date_search(datetime(2006, 7, 13, 17, 00, 00), datetime(2006, 7, 15, 17, 00, 00)) assert_equal(e.instance.vevent.uid, r[0].instance.vevent.uid) for e in r: print e.data assert_equal(len(r), 1) all = c.events() assert_equal(len(all), 1) e2 = Event(self.caldav, data=ev2, parent=c).save() assert_not_equal(e.url, None) tmp = c.event("*****@*****.**") assert_equal(e2.instance.vevent.uid, tmp.instance.vevent.uid) r = c.date_search(datetime(2006, 7, 13, 17, 00, 00), datetime(2006, 7, 15, 17, 00, 00)) for e in r: print e.data assert_equal(len(r), 1) e.data = ev2 e.save() r = c.date_search(datetime(2006, 7, 13, 17, 00, 00), datetime(2006, 7, 15, 17, 00, 00)) for e in r: print e.data assert_equal(len(r), 1)