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