diff --git a/README.md b/README.md index e9bcc25c13962ede2210be00889309c16a16626c..aae03bf42200727fc9cdb044a6c148b01867e4cf 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,19 @@ If you haven't done yet: download the latest jupyter-openbis-extension from pip. pip install --upgrade jupyter-openbis-extension ``` +or, if you would like to develop: + +``` +$ git clone git@sissource.ethz.ch:sispub/jupyter-openbis-extension.git +$ cd jupyter-openbis-extension +$ virtualenv venv +$ source venv/bin/activate +(venv) $ pip install -e . +(venv) $ jupyter serverextension enable --py jupyter-openbis-extension +(venv) $ jupyter nbextension install --py jupyter-openbis-extension --user --symlink +(venv) $ jupyter nbextension enable jupyter-openbis-extension --user --py +``` + **Register the Jupyter server extension** which will communicate both with openBIS and the notebook: ``` @@ -159,4 +172,4 @@ Known nbextensions: notebook section jupyter-openbis-extension/dialog enabled - Validating: OK -``` \ No newline at end of file +``` diff --git a/jupyter-openbis-extension/server.py b/jupyter-openbis-extension/server.py index beccb3252d0e7b672813a35b9742c51e5d28fa6d..8c5fb7847e5163e223649e16222ea4c5429d91b9 100644 --- a/jupyter-openbis-extension/server.py +++ b/jupyter-openbis-extension/server.py @@ -2,7 +2,6 @@ from notebook.utils import url_path_join from notebook.base.handlers import IPythonHandler from pybis import Openbis import numpy as np - import os from urllib.parse import unquote import yaml @@ -31,8 +30,8 @@ def _load_configuration(paths, filename='openbis-connections.yaml'): config = yaml.safe_load(stream) for connection in config['connections']: connections.append(connection) - except yaml.YAMLexception as exc: - print(exc) + except yaml.YAMLexception as e: + print(e) return None return connections @@ -473,9 +472,14 @@ class DataSetTypesHandler(IPythonHandler): # and add it to the dataset collection for dt in dts: dataset_type = conn.openbis.get_dataset_type(dt['code']) - pa = dataset_type.get_propertyAssignments() - pa_dict = pa.to_dict(orient='records') - dt['propertyAssignments'] = pa_dict + pa = dataset_type.get_propertyAssignments(including_vocabulary=True) + pa_dicts = pa.to_dict(orient='records') + for pa_dict in pa_dicts: + if pa_dict['dataType'] == 'CONTROLLEDVOCABULARY': + terms = conn.openbis.get_terms(pa_dict['vocabulary']['code']) + pa_dict['terms'] = terms.df[['code','label','description','official','ordinal']].to_dict(orient='records') + + dt['propertyAssignments'] = pa_dicts self.write({ "dataSetTypes": dts @@ -483,6 +487,7 @@ class DataSetTypesHandler(IPythonHandler): return except Exception as e: + print(e) self.set_status(500) self.write({ "reason":'Could not fetch dataset-types: {}'.format(e) @@ -491,60 +496,112 @@ class DataSetTypesHandler(IPythonHandler): class DataSetUploadHandler(IPythonHandler): - """Handle the requests for /openbis/dataset/connection""" + """Handle the POST requests for /openbis/dataset/connection_name""" def upload_data(self, conn, data): if not conn.is_session_active(): try: conn.login() - except Exception as exc: + except Exception as e: + print(e) + self.set_status(500) self.write({ - "reason": 'connection to {} could not be established: {}'.format(conn.name, exc) + "reason": 'connection to {} could not be established: {}'.format(conn.name, e) }) return - try: - sample = conn.openbis.get_sample(data.get('sampleIdentifier')) - except Exception as exc: - self.set_status(404) - self.write({ - "reason" : 'No such sample: {}'.format(data.get('sampleIdentifier')) - }) - return + errors = [] + + sample = None + experiment = None + + if (data.get('sampleIdentifier')): + try: + sample = conn.openbis.get_sample(data.get('sampleIdentifier')) + except Exception as e: + print(e) + errors.append( + {"sampleIdentifier" : 'No such sample: {}'.format(data.get('sampleIdentifier')) } + ) + else: + errors.append( + {"sampleIdentifier": "please provide a sample identifier"} + ) + print("--------------_HERE_-----------1") + + if (data.get('experimentIdentifier')): + try: + experiment = conn.openbis.get_experiment(data.get('experimentIdentifier')) + except Exception as e: + print(e) + errors.append( + {"experimentIdentifier" : 'No such experiment: {}'.format(data.get('experimentIdentifier')) } + ) + print("--------------_HERE_-----------2") filenames = [] for filename in data.get('files'): filename = unquote(filename) - filenames.append(filename) + if os.path.isfile(filename): + filenames.append(filename) + else: + errors.append({ + "file": "File not found: {}".format(filename) + }) + print("--------------_HERE_-----------3") - try: - ds = conn.openbis.new_dataset( -# name = data.get('name'), -# description = data.get('description'), - type = data.get('type'), - sample = sample, - files = filenames - ) - except Exception as exc: - self.write({ - "reason": 'Error while creating the dataset: {}'.format(exc) + try: + dataset = conn.openbis.new_dataset( + type = data.get('type'), + sample = sample, + experiment = experiment, + files = filenames, + ) + except Exception as e: + print(e) + errors.append({ + "create": 'Error while creating the dataset: {}'.format(e) }) + print("--------------_HERE_-----------4") + + # write errors back if already occured + if errors: + self.set_status(500) + self.write({ "errors": errors }) return + print("--------------_HERE_-----------5") + + # try to set the properties + if (data.get('props')): + props = data.et('props') + for prop, value in props.items(): + try: + setattr(dataset.props, prop, value) + except Exception as e: + errors.append({ + "prop."+prop : e + }) + print("--------------_HERE_-----------6") try: - ds.save() - except Exception as exc: + dataset.save() + except Exception as e: + errors.append({ + "save": 'Error while saving the dataset: {}'.format(e) + }) + print("--------------_HERE_-----------7") + + # write errors back if they occured + if errors: + self.set_status(500) + self.write({ "errors": errors }) + else: + # ...or return a success message self.write({ - "reason": 'Error while saving the dataset: {}'.format(exc) + 'status': 200, + 'statusText': 'Jupyter Notebook was successfully uploaded to: {} with permId: {}'.format(conn.name, dataset.permId) }) - return - - - # return success message - self.write({ - 'status': 200, - 'statusText': 'Jupyter Notebook was successfully uploaded to: {} with permId: {}'.format(conn.name, ds.permId) - }) + print("--------------_HERE_-----------8") def post(self, **params): """Handle a request to /openbis/dataset/connection_name/permId @@ -560,4 +617,6 @@ class DataSetUploadHandler(IPythonHandler): return data = self.get_json_body() - results = self.upload_data(conn=conn,data=data) + print("Received DATA") + print(data) + self.upload_data(conn=conn,data=data) diff --git a/setup.py b/setup.py index d3942628b5236082ccf3c9c14312236185e60736..5eb05d0e8fa2ed017d3c0c8b07134ecc7377537e 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ setup( install_requires=[ 'jupyter-nbextensions-configurator', 'jupyter', - 'pybis', + 'pybis=>1.8.1', ], python_requires=">=3.3", classifiers=[