Skip to content

Commit 164879e

Browse files
committed
Adding upload_preview method for dataset
1 parent af79abc commit 164879e

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

pyclowder/api/v2/datasets.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import tempfile
1010

1111
import requests
12+
from requests_toolbelt.multipart.encoder import MultipartEncoder
1213

1314
from pyclowder.client import ClowderClient
1415
from pyclowder.collections import get_datasets, get_child_collections, delete as delete_collection
@@ -233,3 +234,85 @@ def upload_metadata(connector, client, datasetid, metadata):
233234
verify=connector.ssl_verify if connector else True)
234235
result.raise_for_status()
235236

237+
def upload_preview(connector, client, datasetid, previewfile, previewmetadata=None, preview_mimetype=None,
238+
visualization_name=None, visualization_description=None, visualization_config_data=None,
239+
visualization_component_id=None):
240+
"""Upload visualization to Clowder.
241+
242+
Keyword arguments:
243+
connector -- connector information, used to get missing parameters and send status updates
244+
client -- ClowderClient containing authentication credentials
245+
datsetid -- the dataset that is currently being processed
246+
previewfile -- the file containing the preview
247+
previewmetadata -- any metadata to be associated with preview, can contain a section_id
248+
to indicate the section this preview should be associated with.
249+
preview_mimetype -- (optional) MIME type of the preview file. By default, this is obtained from the
250+
file itself and this parameter can be ignored. E.g. 'application/vnd.clowder+custom+xml'
251+
"""
252+
253+
connector.message_process({"type": "dataset", "id": datasetid}, "Uploading dataset preview.")
254+
logger = logging.getLogger(__name__)
255+
256+
preview_id = None
257+
visualization_config_id = None
258+
259+
if os.path.exists(previewfile):
260+
261+
# upload visualization URL
262+
visualization_config_url = '%s/api/v2/visualizations/config' % client.host
263+
264+
if visualization_config_data is None:
265+
visualization_config_data = dict()
266+
267+
payload = json.dumps({
268+
"resource": {
269+
"collection": "dataset",
270+
"resource_id": datasetid
271+
},
272+
"client": client.host,
273+
"parameters": visualization_config_data,
274+
"visualization_mimetype": preview_mimetype,
275+
"visualization_component_id": visualization_component_id
276+
})
277+
278+
headers = {
279+
"X-API-KEY": client.key,
280+
"Content-Type": "application/json"
281+
}
282+
283+
response = connector.post(visualization_config_url, headers=headers, data=payload,
284+
verify=connector.ssl_verify if connector else True)
285+
286+
if response.status_code == 200:
287+
visualization_config_id = response.json()['id']
288+
logger.debug("Uploaded visualization config ID = [%s]", visualization_config_id)
289+
else:
290+
logger.error("An error occurred when uploading visualization config to dataset: " + datasetid)
291+
292+
if visualization_config_id is not None:
293+
294+
# upload visualization URL
295+
visualization_url = '%s/api/v2/visualizations?name=%s&description=%s&config=%s' % (
296+
client.host, visualization_name, visualization_description, visualization_config_id)
297+
298+
filename = os.path.basename(previewfile)
299+
if preview_mimetype is not None:
300+
multipart_encoder_object = MultipartEncoder(
301+
fields={'file': (filename, open(previewfile, 'rb'), preview_mimetype)})
302+
else:
303+
multipart_encoder_object = MultipartEncoder(fields={'file': (filename, open(previewfile, 'rb'))})
304+
headers = {'X-API-KEY': client.key,
305+
'Content-Type': multipart_encoder_object.content_type}
306+
response = connector.post(visualization_url, data=multipart_encoder_object, headers=headers,
307+
verify=connector.ssl_verify if connector else True)
308+
309+
if response.status_code == 200:
310+
preview_id = response.json()['id']
311+
logger.debug("Uploaded visualization data ID = [%s]", preview_id)
312+
else:
313+
logger.error("An error occurred when uploading the visualization data to dataset: " + datasetid)
314+
else:
315+
logger.error("Visualization data file not found")
316+
317+
return preview_id
318+

0 commit comments

Comments
 (0)