Doc Webdav: at PUT, return feedback about created node.
authorP. Christeas <p_christ@hol.gr>
Thu, 12 Aug 2010 11:10:23 +0000 (14:10 +0300)
committerP. Christeas <p_christ@hol.gr>
Thu, 12 Aug 2010 11:10:23 +0000 (14:10 +0300)
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

addons/document_webdav/dav_fs.py
addons/document_webdav/webdav_server.py

index af8738e..fe88906 100644 (file)
@@ -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 """
index 34c255a..3cda2cc 100644 (file)
@@ -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)