diff options
author | Lukas Fleischer <lfleischer@calcurse.org> | 2016-01-26 17:33:49 +0100 |
---|---|---|
committer | Lukas Fleischer <lfleischer@calcurse.org> | 2016-01-26 17:33:49 +0100 |
commit | 3dbfc7c1f5d9451dbf8fc37fc621c7cc80010214 (patch) | |
tree | e11a082318dc6d8ebd0d15aad6640dba47ad8447 | |
parent | 304ff8183674f70b278c177e1aceaa7f6f08d9e2 (diff) | |
download | calcurse-3dbfc7c1f5d9451dbf8fc37fc621c7cc80010214.zip |
calcurse-caldav: Use calendar-multiget to obtain ETag
Some CalDAV servers do not support calendar-query with a UID filter. Use
a calendar-multiget request to obtain the ETag of submitted objects
instead.
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
-rwxr-xr-x | contrib/caldav/calcurse-caldav.py | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/contrib/caldav/calcurse-caldav.py b/contrib/caldav/calcurse-caldav.py index 9b6d77e..9cdd255 100755 --- a/contrib/caldav/calcurse-caldav.py +++ b/contrib/caldav/calcurse-caldav.py @@ -118,19 +118,21 @@ def remote_query(cmd, path, additional_headers, body): return (headers, body) -def get_hrefmap(conn, uid=None): - if uid: - propfilter = ('<C:prop-filter name="UID">' + - '<C:text-match collation="i;octet" >%s</C:text-match>' + - '</C:prop-filter>') % (uid) +def get_hrefmap(conn, hrefs=[]): + if len(hrefs) > 0: + body = '<?xml version="1.0" encoding="utf-8" ?>' +\ + '<C:calendar-multiget xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">' +\ + '<D:prop><D:getetag /></D:prop>' + for href in hrefs: + body += '<D:href>{}</D:href>'.format(href) + body += '</C:calendar-multiget>' else: - propfilter = '' + body = '<?xml version="1.0" encoding="utf-8" ?>' +\ + '<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">' +\ + '<D:prop><D:getetag /></D:prop><C:filter>' +\ + '<C:comp-filter name="VCALENDAR"></C:comp-filter>' +\ + '</C:filter></C:calendar-query>' - body = '<?xml version="1.0" encoding="utf-8" ?>' +\ - '<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">' +\ - '<D:prop><D:getetag /></D:prop><C:filter>' +\ - '<C:comp-filter name="VCALENDAR">' + propfilter + '</C:comp-filter>' +\ - '</C:filter></C:calendar-query>' headers, body = remote_query("REPORT", path, {}, body) if not headers: return {} @@ -186,8 +188,9 @@ def save_syncdb(fn, syncdb): print("%s %s" % (etag, objhash), file=f) def push_object(conn, objhash): + href = path + objhash + ".ics" body = calcurse_export(objhash) - headers, body = remote_query("PUT", path + objhash + ".ics", {}, body) + headers, body = remote_query("PUT", href, {}, body) if not headers: return None @@ -197,9 +200,9 @@ def push_object(conn, objhash): if 'etag' in headerdict: etag = headerdict['etag'] while not etag: - hrefmap = get_hrefmap(conn, objhash) + hrefmap = get_hrefmap(conn, [href]) if len(hrefmap.keys()) > 0: - etag = hrefmap.keys()[0] + etag = next(iter(hrefmap.keys())) etag = etag.strip('"') return etag |