Implement a no_delete flag

See: https://github.com/pimutils/vdirsyncer/pull/1090
This commit is contained in:
Kai Herlemann 2023-11-29 21:12:08 +08:00 committed by Hugo Osvaldo Barrera
parent d1f93ea0be
commit 889e1f9ea2
5 changed files with 17 additions and 3 deletions

View file

@ -7,6 +7,7 @@ In alphabetical order:
- Christian Geier - Christian Geier
- Clément Mondon - Clément Mondon
- Corey Hinshaw - Corey Hinshaw
- Kai Herlemann
- Hugo Osvaldo Barrera - Hugo Osvaldo Barrera
- Julian Mehne - Julian Mehne
- Malte Kiefer - Malte Kiefer

View file

@ -12,6 +12,7 @@ may want to subscribe to `GitHub's tag feed
Version 0.19.3 Version 0.19.3
============== ==============
- Added a no_delete option to the storage configuration. :gh:`1090`
- Fix crash when running ``vdirsyncer repair`` on a collection. :gh:`1019` - Fix crash when running ``vdirsyncer repair`` on a collection. :gh:`1019`
- Add an option to request vCard v4.0. :gh:`1066` - Add an option to request vCard v4.0. :gh:`1066`

View file

@ -22,7 +22,7 @@ def test_get_storage_init_args():
from vdirsyncer.storage.memory import MemoryStorage from vdirsyncer.storage.memory import MemoryStorage
all, required = utils.get_storage_init_args(MemoryStorage) all, required = utils.get_storage_init_args(MemoryStorage)
assert all == {"fileext", "collection", "read_only", "instance_name"} assert all == {"fileext", "collection", "read_only", "instance_name", "no_delete"}
assert not required assert not required

View file

@ -67,6 +67,10 @@ class Storage(metaclass=StorageMeta):
# The machine-readable name of this collection. # The machine-readable name of this collection.
collection = None collection = None
#A value of False means storage does not support delete requests. A
#value of True mean the storage supports it.
no_delete = False
# A value of True means the storage does not support write-methods such as # A value of True means the storage does not support write-methods such as
# upload, update and delete. A value of False means the storage does # upload, update and delete. A value of False means the storage does
# support those methods. # support those methods.
@ -75,13 +79,19 @@ class Storage(metaclass=StorageMeta):
# The attribute values to show in the representation of the storage. # The attribute values to show in the representation of the storage.
_repr_attributes: list[str] = [] _repr_attributes: list[str] = []
def __init__(self, instance_name=None, read_only=None, collection=None): def __init__(self, instance_name=None, read_only=None, no_delete=None, collection=None):
if read_only is None: if read_only is None:
read_only = self.read_only read_only = self.read_only
if self.read_only and not read_only: if self.read_only and not read_only:
raise exceptions.UserError("This storage can only be read-only.") raise exceptions.UserError("This storage can only be read-only.")
self.read_only = bool(read_only) self.read_only = bool(read_only)
if no_delete is None:
no_delete = self.no_delete
if self.no_delete and not no_delete:
raise exceptions.UserError("Nothing can be deleted in this storage.")
self.no_delete = bool(no_delete)
if collection and instance_name: if collection and instance_name:
instance_name = f"{instance_name}/{collection}" instance_name = f"{instance_name}/{collection}"
self.instance_name = instance_name self.instance_name = instance_name

View file

@ -243,7 +243,9 @@ class Delete(Action):
async def _run_impl(self, a, b): async def _run_impl(self, a, b):
meta = self.dest.status.get_new(self.ident) meta = self.dest.status.get_new(self.ident)
if not self.dest.storage.read_only: if self.dest.storage.read_only or self.dest.storage.no_delete:
sync_logger.debug(f"Skipping deletion of item {self.ident} from {self.dest.storage}")
else:
sync_logger.info(f"Deleting item {self.ident} from {self.dest.storage}") sync_logger.info(f"Deleting item {self.ident} from {self.dest.storage}")
await self.dest.storage.delete(meta.href, meta.etag) await self.dest.storage.delete(meta.href, meta.etag)