From 894702384ddd4b861e484af183673f6ef18ed95f Mon Sep 17 00:00:00 2001 From: Vuillaume <thomas.vuillaume@lapp.in2p3.fr> Date: Mon, 18 Oct 2021 15:26:39 +0000 Subject: [PATCH] Fix fetch user entries --- eossr/api/zenodo/__init__.py | 18 +++++++++++++----- eossr/scripts/eossr_upload_repository.py | 6 ++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/eossr/api/zenodo/__init__.py b/eossr/api/zenodo/__init__.py index 374cdbe8..685ca43e 100644 --- a/eossr/api/zenodo/__init__.py +++ b/eossr/api/zenodo/__init__.py @@ -93,8 +93,9 @@ class ZenodoAPI: :return: request.get method """ url = f"{self.api_url}/deposit/depositions" - - return requests.get(url, params=self.parameters) + answer = requests.get(url, params=self.parameters) + http_status.ZenodoHTTPStatus(answer.status_code, answer.json()) + return answer def create_new_entry(self): """ @@ -126,7 +127,9 @@ class ZenodoAPI: # To fetch any other entry, already published, use: url = f"{self.api_url}/records/{entry_id}" - return requests.get(url, params=self.parameters) + req = requests.get(url, params=self.parameters) + http_status.ZenodoHTTPStatus(req.status_code, req.json()) + return req def upload_file_entry(self, entry_id, name_file, path_file): """ @@ -523,7 +526,7 @@ class ZenodoAPI: def get_user_records(self): """Finds all the records associated with a user (defined by the zenodo token)""" request = self.fetch_user_entries() - return [Record(hit) for hit in request.json()] + return [Record(hit) for hit in request.json() if hit['state'] == 'done'] def find_similar_records(self, record): """ @@ -562,6 +565,11 @@ class Record: for k in ['id', 'metadata']: if k not in data.keys(): raise ValueError(f"key {k} not present in data") + # list of keys mandatory to create a Zenodo entry. + # Other keys are either optional, or can be hidden in case of Closed Access entries. + for meta_key in ['title', 'description', 'creators', 'doi', 'publication_date', 'access_right']: + if meta_key not in data['metadata'].keys(): + raise ValueError(f"Mandatory key {meta_key} not in data['metadata']") self.data = data def __str__(self): @@ -594,7 +602,7 @@ class Record: return self.data['metadata']['relations']['version'][0]['last_child']['pid_value'] def get_last_version(self): - if self.data['metadata']['relations']['version'][0]['is_last']: + if 'relations' not in self.data['metadata'] or self.data['metadata']['relations']['version'][0]['is_last']: return self else: record_id = self.last_version_id diff --git a/eossr/scripts/eossr_upload_repository.py b/eossr/scripts/eossr_upload_repository.py index 31c1b657..999d71a6 100644 --- a/eossr/scripts/eossr_upload_repository.py +++ b/eossr/scripts/eossr_upload_repository.py @@ -7,6 +7,7 @@ import argparse import json from pathlib import Path from distutils.util import strtobool +from copy import deepcopy from eossr.api.zenodo import ZenodoAPI, Record, SimilarRecordError from eossr.metadata.codemeta2zenodo import converter from eossr.utils import zip_repository @@ -64,11 +65,12 @@ def upload(zenodo_token, sandbox_flag, upload_directory, record_id=None, zip_roo else: raise FileNotFoundError("No metadata provided") - metadata_for_check = {'metadata': metadata} + metadata_for_check = {'metadata': deepcopy(metadata)} metadata_for_check['id'] = 1 # fake id to create fake record + metadata_for_check['metadata']['doi'] = 1 # fake doi to create fake record record = Record(metadata_for_check) - # Searches for similar records + ## Searches for similar records similar_records = zenodo.find_similar_records(record) if similar_records and not force_new_record and not record_id: raise SimilarRecordError( -- GitLab