-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathsubmission_ws.py
61 lines (48 loc) · 2.48 KB
/
submission_ws.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import os
import requests
from ebi_eva_common_pyutils.logger import AppLogger
from requests import HTTPError
from retry import retry
from eva_sub_cli import SUBMISSION_WS_VAR
from eva_sub_cli.auth import get_auth
class SubmissionWSClient(AppLogger):
"""
Python client for interfacing with the Submission WS API.
"""
def __init__(self, username=None, password=None):
self.auth = get_auth(username, password)
self.base_url = self._submission_ws_url
SUBMISSION_WS_URL = 'https://www.ebi.ac.uk/eva/webservices/submission-ws/v1/'
SUBMISSION_INITIATE_PATH = 'submission/initiate'
SUBMISSION_UPLOADED_PATH = 'submission/{submissionId}/uploaded'
SUBMISSION_STATUS_PATH = 'submission/{submissionId}/status'
@property
def _submission_ws_url(self):
"""Retrieve the base URL for the submission web services.
In order of preference from the environment variable or the hardcoded value."""
if os.environ.get(SUBMISSION_WS_VAR):
return os.environ.get(SUBMISSION_WS_VAR)
else:
return self.SUBMISSION_WS_URL
def _submission_initiate_url(self):
return os.path.join(self.base_url, self.SUBMISSION_INITIATE_PATH)
def _submission_uploaded_url(self, submission_id):
return os.path.join(self.base_url, self.SUBMISSION_UPLOADED_PATH.format(submissionId=submission_id))
def _submission_status_url(self, submission_id):
return os.path.join(self.base_url, self.SUBMISSION_STATUS_PATH.format(submissionId=submission_id))
def mark_submission_uploaded(self, submission_id, metadata_json):
response = requests.put(self._submission_uploaded_url(submission_id),
headers={'Accept': 'application/json', 'Authorization': 'Bearer ' + self.auth.token},
json=metadata_json)
response.raise_for_status()
return response.json()
def initiate_submission(self):
response = requests.post(self._submission_initiate_url(), headers={'Accept': 'application/json',
'Authorization': 'Bearer ' + self.auth.token})
response.raise_for_status()
return response.json()
@retry(exceptions=(HTTPError,), tries=3, delay=2, backoff=1.2, jitter=(1, 3))
def get_submission_status(self, submission_id):
response = requests.get(self._submission_status_url(submission_id))
response.raise_for_status()
return response.text