diff options
| author | P. Christeas <p_christ@hol.gr> | 2010-08-12 14:10:23 +0300 |
|---|---|---|
| committer | P. Christeas <p_christ@hol.gr> | 2010-08-12 14:10:23 +0300 |
| commit | 5df0b8cf8cc0ca5eb6af8428e5ba6a8c4bb38f34 (patch) | |
| tree | a6eec7b0d6a9068a69a4af48277a20ae67b592e8 /addons | |
| parent | 71c5192b080c2ee424c524e5a2b14d03b76be72b (diff) | |
Doc Webdav: at PUT, return feedback about created node.
Used in caldav, the final location of the node and its ETag must be
returned after creation.
bzr revid: p_christ@hol.gr-20100812111023-s6dv0g24enfghki9
Diffstat (limited to 'addons')
| -rw-r--r-- | addons/document_webdav/dav_fs.py | 29 | ||||
| -rw-r--r-- | addons/document_webdav/webdav_server.py | 13 |
2 files changed, 36 insertions, 6 deletions
diff --git a/addons/document_webdav/dav_fs.py b/addons/document_webdav/dav_fs.py index af8738ef0da..fe88906c557 100644 --- a/addons/document_webdav/dav_fs.py +++ b/addons/document_webdav/dav_fs.py @@ -522,7 +522,6 @@ class openerp_dav_handler(dav_interface): def put(self, uri, data, content_type=None): """ put the object into the filesystem """ self.parent.log_message('Putting %s (%d), %s'%( misc.ustr(uri), data and len(data) or 0, content_type)) - parent='/'.join(uri.split('/')[:-1]) cr, uid, pool,dbname, uri2 = self.get_cr(uri) if not dbname: if cr: cr.close() @@ -535,20 +534,44 @@ class openerp_dav_handler(dav_interface): objname = uri2[-1] ext = objname.find('.') >0 and objname.split('.')[1] or False + ret = None if not node: dir_node = self.uri2object(cr, uid, pool, uri2[:-1]) if not dir_node: cr.close() raise DAV_NotFound('Parent folder not found') - self._try_function(dir_node.create_child, (cr, objname, data), + newchild = self._try_function(dir_node.create_child, (cr, objname, data), "create %s" % objname, cr=cr) + if not newchild: + cr.commit() + cr.close() + raise DAV_Error(400, "Failed to create resource") + + uparts=urlparse.urlparse(uri) + fileloc = '/'.join(newchild.full_path()) + if isinstance(fileloc, unicode): + fileloc = fileloc.encode('utf-8') + # the uri we get is a mangled one, where the davpath has been removed + davpath = self.parent.get_davpath() + + surl = '%s://%s' % (uparts[0], uparts[1]) + uloc = urllib.quote(fileloc) + hurl = False + if uri != ('/'+uloc) and uri != (surl + '/' + uloc): + hurl = '%s%s/%s/%s' %(surl, davpath, dbname, uloc) + etag = False + try: + etag = str(newchild.get_etag(cr)) + except Exception, e: + self.parent.log_error("Cannot get etag for node: %s" % e) + ret = (hurl, etag) else: self._try_function(node.set_data, (cr, data), "save %s" % objname, cr=cr) cr.commit() cr.close() - return 201 + return ret def rmcol(self,uri): """ delete a collection """ diff --git a/addons/document_webdav/webdav_server.py b/addons/document_webdav/webdav_server.py index 34c255a2b3e..3cda2ccc6fe 100644 --- a/addons/document_webdav/webdav_server.py +++ b/addons/document_webdav/webdav_server.py @@ -214,13 +214,20 @@ class DAVHandler(HttpOptions, FixSendError, DAVRequestHandler): return self.send_status(ec) headers = {} + etag = None + if location and isinstance(location, tuple): + etag = location[1] + location = location[0] + # note that we have allowed for > 2 elems if location: headers['Location'] = location try: - etag = dc.get_prop(location or uri, "DAV:", "getetag") - headers['ETag'] = etag - except: + if not etag: + etag = dc.get_prop(location or uri, "DAV:", "getetag") + if etag: + headers['ETag'] = str(etag) + except Exception: pass self.send_body(None, '201', 'Created', '', headers=headers) |
