iPhone support, thank you Andrew

This commit is contained in:
Guillaume Ayoub 2011-01-07 15:25:05 +01:00
parent dcabf4249e
commit 039e868e5f
2 changed files with 39 additions and 43 deletions

View File

@ -216,7 +216,7 @@ class CalendarHTTPHandler(server.BaseHTTPRequestHandler):
xml_request = self.rfile.read(int(self.headers["Content-Length"])) xml_request = self.rfile.read(int(self.headers["Content-Length"]))
self._answer = xmlutils.propfind( self._answer = xmlutils.propfind(
self.path, xml_request, self._calendar, self.path, xml_request, self._calendar,
self.headers.get("depth", "infinity"), self) self.headers.get("depth", "infinity"))
self.send_response(client.MULTI_STATUS) self.send_response(client.MULTI_STATUS)
self.send_header("DAV", "1, calendar-access") self.send_header("DAV", "1, calendar-access")

View File

@ -79,7 +79,7 @@ def delete(path, calendar):
return ET.tostring(multistatus, config.get("encoding", "request")) return ET.tostring(multistatus, config.get("encoding", "request"))
def propfind(path, xml_request, calendar, depth, request): def propfind(path, xml_request, calendar, depth):
"""Read and answer PROPFIND requests. """Read and answer PROPFIND requests.
Read rfc4918-9.1 for info. Read rfc4918-9.1 for info.
@ -97,10 +97,8 @@ def propfind(path, xml_request, calendar, depth, request):
if depth == "0": if depth == "0":
items = [calendar] items = [calendar]
elif depth == "1":
items = [calendar] + calendar.events + calendar.todos
else: else:
# depth is infinity or not specified # depth is 1, infinity or not specified
# we limit ourselves to depth == 1 # we limit ourselves to depth == 1
items = [calendar] + calendar.events + calendar.todos items = [calendar] + calendar.events + calendar.todos
@ -111,7 +109,7 @@ def propfind(path, xml_request, calendar, depth, request):
multistatus.append(response) multistatus.append(response)
href = ET.Element(_tag("D", "href")) href = ET.Element(_tag("D", "href"))
href.text = path if is_calendar else "%s/%s" % (path, item.name) href.text = path if is_calendar else path + item.name
response.append(href) response.append(href)
propstat = ET.Element(_tag("D", "propstat")) propstat = ET.Element(_tag("D", "propstat"))
@ -122,42 +120,45 @@ def propfind(path, xml_request, calendar, depth, request):
for tag in props: for tag in props:
element = ET.Element(tag) element = ET.Element(tag)
if tag == _tag("D", "resourcetype"): if tag == _tag("D", "resourcetype") and is_calendar:
if is_calendar:
tag = ET.Element(_tag("C", "calendar")) tag = ET.Element(_tag("C", "calendar"))
element.append(tag) element.append(tag)
tag = ET.Element(_tag("D", "collection")) tag = ET.Element(_tag("D", "collection"))
element.append(tag) element.append(tag)
else:
tag = ET.Element(_tag("C", "comp"))
tag.set("name", element.tag)
element.append(tag)
elif tag == _tag("D", "owner"): elif tag == _tag("D", "owner"):
element.text = calendar.owner element.text = calendar.owner
elif tag == _tag("D", "getcontenttype"): elif tag == _tag("D", "getcontenttype"):
element.text = "text/calendar" element.text = "text/calendar"
elif tag == _tag("CS", "getctag") and is_calendar:
element.text = item.etag
elif tag == _tag("D", "getetag"): elif tag == _tag("D", "getetag"):
element.text = item.etag element.text = item.etag
elif tag == _tag("D", "displayname"): elif tag == _tag("D", "displayname") and is_calendar:
element.text = calendar.name element.text = calendar.name
elif tag == _tag("D", "supported-report-set"):
supported_report = ET.Element(_tag("D", "supported-report"))
report_set = ET.Element(_tag("D", "report"))
report_set.append(ET.Element(_tag("C", "calendar-multiget")))
supported_report.append(report_set)
element.append(supported_report)
elif tag == _tag("D", "principal-URL"): elif tag == _tag("D", "principal-URL"):
# TODO: use a real principal URL, read rfc3744-4.2 for info # TODO: use a real principal URL, read rfc3744-4.2 for info
element.text = "%s://%s%s" % ( tag = ET.Element(_tag("D", "href"))
request.server.PROTOCOL, request.headers["Host"], tag.text = path
request.path) element.append(tag)
elif tag == _tag("D", "principal-collection-set"):
tag = ET.Element(_tag("D", "href"))
tag.text = path
element.append(tag)
elif tag == _tag("C", "calendar-home-set"): elif tag == _tag("C", "calendar-home-set"):
tag = ET.Element(_tag("D", "href")) tag = ET.Element(_tag("D", "href"))
tag.text = "%s://%s%s" % ( tag.text = path
request.server.PROTOCOL, request.headers["Host"],
request.path)
element.append(tag) element.append(tag)
elif tag == _tag("C", "supported-calendar-component-set"):
comp = ET.Element(_tag("C", "comp"))
comp.set("name", "VTODO")
element.append(comp)
comp = ET.Element(_tag("C", "comp"))
comp.set("name", "VEVENT")
element.append(comp)
elif tag == _tag("D", "current-user-privilege-set"):
privilege = ET.Element(_tag("D", "privilege"))
privilege.append(ET.Element(_tag("D", "all")))
element.append(privilege)
prop.append(element) prop.append(element)
status = ET.Element(_tag("D", "status")) status = ET.Element(_tag("D", "status"))
@ -227,17 +228,12 @@ def report(path, xml_request, calendar):
prop = ET.Element(_tag("D", "prop")) prop = ET.Element(_tag("D", "prop"))
propstat.append(prop) propstat.append(prop)
if _tag("D", "getetag") in props: for tag in props:
element = ET.Element(_tag("D", "getetag")) element = ET.Element(tag)
if tag == _tag("D", "getetag"):
element.text = item.etag element.text = item.etag
prop.append(element) elif tag == _tag("C", "calendar-data"):
if isinstance(item, (ical.Event, ical.Todo)):
if _tag("C", "calendar-data") in props:
element = ET.Element(_tag("C", "calendar-data"))
if isinstance(item, ical.Event):
element.text = ical.serialize(
calendar.headers, calendar.timezones + [item])
elif isinstance(item, ical.Todo):
element.text = ical.serialize( element.text = ical.serialize(
calendar.headers, calendar.timezones + [item]) calendar.headers, calendar.timezones + [item])
prop.append(element) prop.append(element)