diff --git a/radicale/__init__.py b/radicale/__init__.py index 18c2a3a..9d0d074 100644 --- a/radicale/__init__.py +++ b/radicale/__init__.py @@ -612,10 +612,7 @@ class Application: if tag: parent_item.set_meta({"tag": tag}) href = posixpath.basename(path.strip("/")) - if item: - new_item = parent_item.update(href, items[0]) - else: - new_item = parent_item.upload(href, items[0]) + new_item = parent_item.upload(href, items[0]) headers = {"ETag": new_item.etag} return client.CREATED, headers, None diff --git a/radicale/storage.py b/radicale/storage.py index f61d3c4..d102e6e 100644 --- a/radicale/storage.py +++ b/radicale/storage.py @@ -320,19 +320,9 @@ class BaseCollection: return self.get(href) is not None def upload(self, href, vobject_item): - """Upload a new item.""" + """Upload a new or replace an existing item.""" raise NotImplementedError - def update(self, href, vobject_item): - """Update an item. - - Functionally similar to ``delete`` plus ``upload``, but might bring - performance benefits on some storages when used cleverly. - - """ - self.delete(href) - self.upload(href, vobject_item) - def delete(self, href=None): """Delete an item. @@ -654,19 +644,6 @@ class Collection(BaseCollection): if not is_safe_filesystem_path_component(href): raise UnsafePathError(href) path = path_to_filesystem(self._filesystem_path, href) - if os.path.exists(path): - raise ComponentExistsError(href) - item = Item(self, vobject_item, href) - with self._atomic_write(path, newline="") as fd: - fd.write(item.serialize()) - return item - - def update(self, href, vobject_item): - if not is_safe_filesystem_path_component(href): - raise UnsafePathError(href) - path = path_to_filesystem(self._filesystem_path, href) - if not os.path.isfile(path): - raise ComponentNotFoundError(href) item = Item(self, vobject_item, href) with self._atomic_write(path, newline="") as fd: fd.write(item.serialize())