mirror of
https://github.com/samsonjs/vdirsyncer.git
synced 2026-04-27 14:57:41 +00:00
Code deduplication
This commit is contained in:
parent
9f26c6450c
commit
5051e8949a
1 changed files with 30 additions and 68 deletions
|
|
@ -38,11 +38,17 @@ def _normalize_href(base, href, decoding_rounds=1):
|
||||||
|
|
||||||
|
|
||||||
class Discover(object):
|
class Discover(object):
|
||||||
|
_resourcetype = None
|
||||||
xml_home = None
|
_homeset_xml = None
|
||||||
xml_collection = None
|
_homeset_tag = None
|
||||||
|
_collection_xml = """
|
||||||
str_homeset = None
|
<d:propfind xmlns:d="DAV:">
|
||||||
|
<d:prop>
|
||||||
|
<d:resourcetype />
|
||||||
|
<d:displayname />
|
||||||
|
</d:prop>
|
||||||
|
</d:propfind>
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, session):
|
def __init__(self, session):
|
||||||
self.session = session
|
self.session = session
|
||||||
|
|
@ -85,51 +91,27 @@ class Discover(object):
|
||||||
headers = self.session.get_default_headers()
|
headers = self.session.get_default_headers()
|
||||||
headers['Depth'] = 0
|
headers['Depth'] = 0
|
||||||
response = self.session.request('PROPFIND', principal, headers=headers,
|
response = self.session.request('PROPFIND', principal, headers=headers,
|
||||||
data=self.xml_home,
|
data=self._homeset_xml,
|
||||||
is_subpath=False)
|
is_subpath=False)
|
||||||
|
|
||||||
root = etree.fromstring(response.content)
|
root = etree.fromstring(response.content)
|
||||||
for element in root.iter(self.str_homeset):
|
for element in root.iter(self._homeset_tag):
|
||||||
for homeset in element.iter():
|
for homeset in element.iter():
|
||||||
if homeset.tag.endswith('href'):
|
if homeset.tag.endswith('href'):
|
||||||
yield homeset.text
|
yield homeset.text
|
||||||
|
|
||||||
def _find_collections(self, home):
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
|
|
||||||
class CalDiscover(Discover):
|
|
||||||
|
|
||||||
xml_home = """
|
|
||||||
<d:propfind xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
|
|
||||||
<d:prop>
|
|
||||||
<c:calendar-home-set />
|
|
||||||
</d:prop>
|
|
||||||
</d:propfind>
|
|
||||||
"""
|
|
||||||
xml_collection = """
|
|
||||||
<d:propfind xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
|
|
||||||
<d:prop>
|
|
||||||
<d:resourcetype />
|
|
||||||
<d:displayname />
|
|
||||||
<c:supported-calendar-component-set />
|
|
||||||
</d:prop>
|
|
||||||
</d:propfind>
|
|
||||||
"""
|
|
||||||
str_homeset = '{*}calendar-home-set'
|
|
||||||
|
|
||||||
def _find_collections(self, home):
|
def _find_collections(self, home):
|
||||||
"""find all CalDAV collections under `home`"""
|
"""find all CalDAV collections under `home`"""
|
||||||
|
|
||||||
headers = self.session.get_default_headers()
|
headers = self.session.get_default_headers()
|
||||||
headers['Depth'] = 1
|
headers['Depth'] = 1
|
||||||
response = self.session.request('PROPFIND', home, headers=headers,
|
response = self.session.request('PROPFIND', home, headers=headers,
|
||||||
data=self.xml_collection,
|
data=self._collection_xml,
|
||||||
is_subpath=False)
|
is_subpath=False)
|
||||||
root = etree.XML(response.content)
|
root = etree.XML(response.content)
|
||||||
for response in root.iter('{*}response'):
|
for response in root.iter('{*}response'):
|
||||||
prop = response.find('{*}propstat/{*}prop')
|
prop = response.find('{*}propstat/{*}prop')
|
||||||
if prop.find('{*}resourcetype/{*}calendar') is None:
|
if prop.find('{*}resourcetype/{*}' + self._resourcetype) is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
displayname = prop.find('{*}displayname')
|
displayname = prop.find('{*}displayname')
|
||||||
|
|
@ -138,51 +120,31 @@ class CalDiscover(Discover):
|
||||||
'displayname': '' if displayname is None else displayname.text
|
'displayname': '' if displayname is None else displayname.text
|
||||||
}
|
}
|
||||||
|
|
||||||
component_set = prop.find('{*}supported-calendar-component-set')
|
|
||||||
if component_set is not None:
|
|
||||||
for one in component_set:
|
|
||||||
collection[one.get('name')] = True
|
|
||||||
|
|
||||||
yield collection
|
yield collection
|
||||||
|
|
||||||
|
|
||||||
|
class CalDiscover(Discover):
|
||||||
|
_resourcetype = 'calendar'
|
||||||
|
_homeset_xml = """
|
||||||
|
<d:propfind xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
|
||||||
|
<d:prop>
|
||||||
|
<c:calendar-home-set />
|
||||||
|
</d:prop>
|
||||||
|
</d:propfind>
|
||||||
|
"""
|
||||||
|
_homeset_tag = '{*}calendar-home-set'
|
||||||
|
|
||||||
|
|
||||||
class CardDiscover(Discover):
|
class CardDiscover(Discover):
|
||||||
xml_home = """
|
_resourcetype = 'addressbook'
|
||||||
|
_homeset_xml = """
|
||||||
<d:propfind xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
|
<d:propfind xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
|
||||||
<d:prop>
|
<d:prop>
|
||||||
<c:addressbook-home-set />
|
<c:addressbook-home-set />
|
||||||
</d:prop>
|
</d:prop>
|
||||||
</d:propfind>
|
</d:propfind>
|
||||||
"""
|
"""
|
||||||
xml_collection = """
|
_homeset_tag = '{*}addressbook-home-set'
|
||||||
<d:propfind xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:cardav">
|
|
||||||
<d:prop>
|
|
||||||
<d:resourcetype />
|
|
||||||
<c:addressbook />
|
|
||||||
</d:prop>
|
|
||||||
</d:propfind>
|
|
||||||
"""
|
|
||||||
str_homeset = '{*}addressbook-home-set'
|
|
||||||
|
|
||||||
def _find_collections(self, home):
|
|
||||||
"""find all CardDAV collections under `home`"""
|
|
||||||
headers = self.session.get_default_headers()
|
|
||||||
headers['Depth'] = 1
|
|
||||||
response = self.session.request('PROPFIND', home, headers=headers,
|
|
||||||
data=self.xml_collection,
|
|
||||||
is_subpath=False)
|
|
||||||
|
|
||||||
root = etree.XML(response.content)
|
|
||||||
for response in root.iter('{*}response'):
|
|
||||||
prop = response.find('{*}propstat/{*}prop')
|
|
||||||
if prop.find('{*}resourcetype/{*}addressbook') is None:
|
|
||||||
continue
|
|
||||||
|
|
||||||
displayname = prop.find('{*}displayname')
|
|
||||||
yield {
|
|
||||||
'href': response.find('{*}href').text,
|
|
||||||
'displayname': '' if displayname is None else displayname.text
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class DavSession(object):
|
class DavSession(object):
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue