Sfoglia il codice sorgente

Expose low level MOVE operation in storage.BaseCollection

Unrud 9 anni fa
parent
commit
23582c8208
2 ha cambiato i file con 21 aggiunte e 6 eliminazioni
  1. 1 6
      radicale/__init__.py
  2. 20 0
      radicale/storage.py

+ 1 - 6
radicale/__init__.py

@@ -496,12 +496,7 @@ class Application:
             if not to_collection:
                 return client.CONFLICT, {}, None
             to_href = posixpath.basename(to_path.strip("/"))
-            if path.strip("/") != to_path.strip("/"):
-                if to_item:
-                    to_collection.update(to_href, item.item)
-                else:
-                    to_collection.upload(to_href, item.item)
-                item.collection.delete(item.href)
+            self.Collection.move(item, to_collection, to_href)
             return client.CREATED, {}, None
 
     def do_OPTIONS(self, environ, path, content, user):

+ 20 - 0
radicale/storage.py

@@ -265,6 +265,26 @@ class BaseCollection:
         """
         raise NotImplementedError
 
+    @classmethod
+    def move(cls, item, to_collection, to_href):
+        """Move an object.
+
+        ``item`` is the item to move.
+
+        ``to_collection`` is the target collection.
+
+        ``to_href`` is the target name in ``to_collection``. An item with the
+        same name might already exist.
+
+        """
+        if item.collection.path == to_collection.path and item.href == to_href:
+            return
+        if to_collection.has(to_href):
+            to_collection.update(to_href, item.item)
+        else:
+            to_collection.upload(to_href, item.item)
+        item.collection.delete(item.href)
+
     @property
     def etag(self):
         return get_etag(self.serialize())