From d99e09bb3c6ffba910343c7d7b4e8518586d1bb2 Mon Sep 17 00:00:00 2001 From: Kelvin Sarink Date: Sat, 18 Jun 2022 14:05:08 +0100 Subject: [PATCH] add version handling check for upload and remove not working --- datalad_dataverse/remote.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/datalad_dataverse/remote.py b/datalad_dataverse/remote.py index a7f5b0c..3f6829b 100644 --- a/datalad_dataverse/remote.py +++ b/datalad_dataverse/remote.py @@ -14,10 +14,9 @@ from datalad_dataverse.utils import ( get_native_api, + format_doi, ) -from datalad_dataverse.utils import format_doi - class DataverseRemote(SpecialRemote): @@ -28,10 +27,12 @@ def __init__(self, *args): self.configs['dlacredential'] = \ 'Identifier used to retrieve an API token from a local ' \ 'credential store' + self.configs['version'] = 'Dataverse dataset version' self._doi = None self._url = None self._api = None self._token = None + self._dataset_version = None def initremote(self): """ @@ -137,6 +138,14 @@ def api(self): return self._api + @property + def dataset_version(self): + if self._dataset_version is None: + self._dataset_version = self.annex.getconfig('version') + if len(self._dataset_version) == 0: + self._dataset_version = ":latest" + return self._dataset_version + def prepare(self): # trigger API instance in order to get possibly auth/connection errors # right away @@ -152,6 +161,8 @@ def checkpresent(self, key): return False def transfer_store(self, key, local_file): + if not self.dataset_version == ':latest': + raise RuntimeError('Cannot store files if a specific version is checked out!') ds_pid = self.doi datafile = Datafile() @@ -165,12 +176,12 @@ def transfer_retrieve(self, key, file): # this relies on having established the NativeApi in prepare() api_token=self._token, ) - dataset = self.api.get_dataset(identifier=self.doi) + dataset = self.api.get_dataset_version(identifier=self.doi, version=self.dataset_version) # http error handling dataset.raise_for_status() - files_list = dataset.json()['data']['latestVersion']['files'] + files_list = dataset.json()['data']['files'] # find the file we want to download file_id = None @@ -191,6 +202,8 @@ def transfer_retrieve(self, key, file): f.write(response.content) def remove(self, key): + if not self.dataset_version == ':latest': + raise RuntimeError('Cannot remove file if a specific version is checked out!') # get the dataset and a list of all files dataset = self.api.get_dataset(identifier=self.doi) # http error handling