def __init__(self, client=None, url=None): """ url input is for backward compatibility and should normally be avoided. If url is not given, deduct principal path as well as calendar home set path from doing propfinds. """ self.client = client self._calendar_home_set = None ## backwards compatibility. if url is not None: self.url = client.url.join(URL.objectify(url)) else: self.url = self.client.url cup = self.get_properties([dav.CurrentUserPrincipal()]) self.url = self.client.url.join(URL.objectify(cup['{DAV:}current-user-principal']))
def __init__(self, client=None, url=None): """ Returns a Principal. Parameters: * client: a DAVClient() oject * url: Deprecated - for backwards compatibility purposes only. If url is not given, deduct principal path as well as calendar home set path from doing propfinds. """ self.client = client self._calendar_home_set = None ## backwards compatibility. if url is not None: self.url = client.url.join(URL.objectify(url)) else: self.url = self.client.url cup = self.get_properties([dav.CurrentUserPrincipal()]) self.url = self.client.url.join( URL.objectify(cup['{DAV:}current-user-principal']))
def test_xml_parsing(self): """ DAVResponse has quite some code to parse the XML received from the server. This test contains real XML received from various caldav servers, and the expected result from the parse methods. """ xml = """ <multistatus xmlns="DAV:"> <response xmlns="DAV:"> <href>/</href> <propstat> <prop> <current-user-principal xmlns="DAV:"> <href xmlns="DAV:">/17149682/principal/</href> </current-user-principal> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> </multistatus> """ expected_result = { '/': { '{DAV:}current-user-principal': '/17149682/principal/' } } assert_equal( MockedDAVResponse(xml).expand_simple_props( props=[dav.CurrentUserPrincipal()]), expected_result) xml = """ <multistatus xmlns="DAV:"> <response xmlns="DAV:"> <href>/17149682/principal/</href> <propstat> <prop> <calendar-home-set xmlns="urn:ietf:params:xml:ns:caldav"> <href xmlns="DAV:">https://p62-caldav.icloud.com:443/17149682/calendars/</href> </calendar-home-set> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> </multistatus>""" expected_result = { '/17149682/principal/': { '{urn:ietf:params:xml:ns:caldav}calendar-home-set': 'https://p62-caldav.icloud.com:443/17149682/calendars/' } } assert_equal( MockedDAVResponse(xml).expand_simple_props( props=[cdav.CalendarHomeSet()]), expected_result) xml = """ <multistatus xmlns="DAV:"> <response xmlns="DAV:"> <href>/</href> <propstat> <prop> <current-user-principal xmlns="DAV:"> <href xmlns="DAV:">/17149682/principal/</href> </current-user-principal> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> </multistatus>""" expected_result = { '/': { '{DAV:}current-user-principal': '/17149682/principal/' } } assert_equal( MockedDAVResponse(xml).expand_simple_props( props=[dav.CurrentUserPrincipal()]), expected_result) xml = """ <multistatus xmlns="DAV:"> <response> <href>/17149682/calendars/testcalendar-84439d0b-ce46-4416-b978-7b4009122c64/</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> <response> <href>/17149682/calendars/testcalendar-84439d0b-ce46-4416-b978-7b4009122c64/20010712T182145Z-123401%40example.com.ics</href> <propstat> <prop> <calendar-data xmlns="urn:ietf:params:xml:ns:caldav">BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Example Corp.//CalDAV Client//EN BEGIN:VEVENT UID:[email protected] DTSTAMP:20060712T182145Z DTSTART:20060714T170000Z DTEND:20060715T040000Z SUMMARY:Bastille Day Party END:VEVENT END:VCALENDAR </calendar-data> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> </multistatus> """ expected_result = { '/17149682/calendars/testcalendar-84439d0b-ce46-4416-b978-7b4009122c64/': { '{urn:ietf:params:xml:ns:caldav}calendar-data': None }, '/17149682/calendars/testcalendar-84439d0b-ce46-4416-b978-7b4009122c64/[email protected]': { '{urn:ietf:params:xml:ns:caldav}calendar-data': 'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//Example Corp.//CalDAV Client//EN\nBEGIN:VEVENT\nUID:[email protected]\nDTSTAMP:20060712T182145Z\nDTSTART:20060714T170000Z\nDTEND:20060715T040000Z\nSUMMARY:Bastille Day Party\nEND:VEVENT\nEND:VCALENDAR\n' } } assert_equal( MockedDAVResponse(xml).expand_simple_props( props=[cdav.CalendarData()]), expected_result) xml = """ <multistatus xmlns="DAV:"> <response xmlns="DAV:"> <href>/17149682/calendars/</href> <propstat> <prop> <resourcetype xmlns="DAV:"> <collection/> </resourcetype> <displayname xmlns="DAV:">Ny Test</displayname> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <response xmlns="DAV:"> <href>/17149682/calendars/06888b87-397f-11eb-943b-3af9d3928d42/</href> <propstat> <prop> <resourcetype xmlns="DAV:"> <collection/> <calendar xmlns="urn:ietf:params:xml:ns:caldav"/> </resourcetype> <displayname xmlns="DAV:">calfoo3</displayname> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <response xmlns="DAV:"> <href>/17149682/calendars/inbox/</href> <propstat> <prop> <resourcetype xmlns="DAV:"> <collection/> <schedule-inbox xmlns="urn:ietf:params:xml:ns:caldav"/> </resourcetype> </prop> <status>HTTP/1.1 200 OK</status> </propstat> <propstat> <prop> <displayname xmlns="DAV:"/> </prop> <status>HTTP/1.1 404 Not Found</status> </propstat> </response> <response xmlns="DAV:"> <href>/17149682/calendars/testcalendar-e2910e0a-feab-4b51-b3a8-55828acaa912/</href> <propstat> <prop> <resourcetype xmlns="DAV:"> <collection/> <calendar xmlns="urn:ietf:params:xml:ns:caldav"/> </resourcetype> <displayname xmlns="DAV:">Yep</displayname> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> </multistatus> """ expected_result = { '/17149682/calendars/': { '{DAV:}resourcetype': ['{DAV:}collection'], '{DAV:}displayname': 'Ny Test' }, '/17149682/calendars/06888b87-397f-11eb-943b-3af9d3928d42/': { '{DAV:}resourcetype': [ '{DAV:}collection', '{urn:ietf:params:xml:ns:caldav}calendar' ], '{DAV:}displayname': 'calfoo3' }, '/17149682/calendars/inbox/': { '{DAV:}resourcetype': [ '{DAV:}collection', '{urn:ietf:params:xml:ns:caldav}schedule-inbox' ], '{DAV:}displayname': None }, '/17149682/calendars/testcalendar-e2910e0a-feab-4b51-b3a8-55828acaa912/': { '{DAV:}resourcetype': [ '{DAV:}collection', '{urn:ietf:params:xml:ns:caldav}calendar' ], '{DAV:}displayname': 'Yep' } } assert_equal( MockedDAVResponse(xml).expand_simple_props( props=[dav.DisplayName()], multi_value_props=[dav.ResourceType()]), expected_result) xml = """ <multistatus xmlns="DAV:"> <response xmlns="DAV:"> <href>/17149682/calendars/testcalendar-f96b3bf0-09e1-4f3d-b891-3a25c99a2894/</href> <propstat> <prop> <getetag xmlns="DAV:">"kkkgopik"</getetag> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <response xmlns="DAV:"> <href>/17149682/calendars/testcalendar-f96b3bf0-09e1-4f3d-b891-3a25c99a2894/1761bf8c-6363-11eb-8fe4-74e5f9bfd8c1.ics</href> <propstat> <prop> <getetag xmlns="DAV:">"kkkgorwx"</getetag> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <response xmlns="DAV:"> <href>/17149682/calendars/testcalendar-f96b3bf0-09e1-4f3d-b891-3a25c99a2894/20010712T182145Z-123401%40example.com.ics</href> <propstat> <prop> <getetag xmlns="DAV:">"kkkgoqqu"</getetag> </prop> <status>HTTP/1.1 200 OK</status> </propstat> </response> <sync-token>HwoQEgwAAAh4yw8ntwAAAAAYAhgAIhUIopml463FieB4EKq9+NSn04DrkQEoAA==</sync-token> </multistatus> """ expected_results = { '/17149682/calendars/testcalendar-f96b3bf0-09e1-4f3d-b891-3a25c99a2894/': { '{DAV:}getetag': '"kkkgopik"', '{urn:ietf:params:xml:ns:caldav}calendar-data': None }, '/17149682/calendars/testcalendar-f96b3bf0-09e1-4f3d-b891-3a25c99a2894/1761bf8c-6363-11eb-8fe4-74e5f9bfd8c1.ics': { '{DAV:}getetag': '"kkkgorwx"', '{urn:ietf:params:xml:ns:caldav}calendar-data': None }, '/17149682/calendars/testcalendar-f96b3bf0-09e1-4f3d-b891-3a25c99a2894/[email protected]': { '{DAV:}getetag': '"kkkgoqqu"', '{urn:ietf:params:xml:ns:caldav}calendar-data': None } }