From 67ec278dcd3e60f79cd481a010e0f62bfdcfc858 Mon Sep 17 00:00:00 2001
From: vermeul <swen@ethz.ch>
Date: Fri, 2 Mar 2018 13:49:29 +0100
Subject: [PATCH] no longer errors when searching for entities (empty DataSet
 instead). Searching for groups allows code search

---
 src/python/PyBis/pybis/dataset.py |   7 +-
 src/python/PyBis/pybis/group.py   |   1 +
 src/python/PyBis/pybis/pybis.py   | 189 ++++++++++++++----------------
 3 files changed, 96 insertions(+), 101 deletions(-)

diff --git a/src/python/PyBis/pybis/dataset.py b/src/python/PyBis/pybis/dataset.py
index 5e506a25e4d..403629e635c 100644
--- a/src/python/PyBis/pybis/dataset.py
+++ b/src/python/PyBis/pybis/dataset.py
@@ -53,8 +53,7 @@ class DataSet(OpenBisObject):
             'add_attachment()', 'get_attachments()', 'download_attachments()',
             "get_files(start_folder='/')", 'file_list',
             'download(files=None, destination=None, wait_until_finished=True)', 
-            'status', 'archive()', 'unarchive()', 
-            'data'
+            'status', 'archive()', 'unarchive()' 
         ]
 
     def __setattr__(self, name, value):
@@ -166,6 +165,7 @@ class DataSet(OpenBisObject):
             queue.join()
 
         if VERBOSE: print("Files downloaded to: %s" % os.path.join(destination, self.permId))
+        return destination
 
     @property
     def folder(self):
@@ -261,6 +261,8 @@ class DataSet(OpenBisObject):
             experiment_identifier = self.experiment.identifier
 
         parentIds = self.parents
+        if parentIds is None:
+            parentIds = []
 
         dataset_type = self.type.code
         properties = self.props.all_nonempty()
@@ -308,7 +310,6 @@ class DataSet(OpenBisObject):
             # activate the ingestion plugin, as soon as the data is uploaded
             request = self._generate_plugin_request(dss=datastores['code'][0])
 
-            print(json.dumps(request))
             resp = self.openbis._post_request(self.openbis.reg_v1, request)
 
             if resp['rows'][0][0]['value'] == 'OK':
diff --git a/src/python/PyBis/pybis/group.py b/src/python/PyBis/pybis/group.py
index 129ab01e3ef..df022d398d6 100644
--- a/src/python/PyBis/pybis/group.py
+++ b/src/python/PyBis/pybis/group.py
@@ -1,6 +1,7 @@
 from .attribute import AttrHolder
 from .openbis_object import OpenBisObject 
 from .utils import VERBOSE
+from pandas import DataFrame
 
 class Group(OpenBisObject):
     """ Managing openBIS authorization groups
diff --git a/src/python/PyBis/pybis/pybis.py b/src/python/PyBis/pybis/pybis.py
index 594fa6df90e..084cf1d5d89 100644
--- a/src/python/PyBis/pybis/pybis.py
+++ b/src/python/PyBis/pybis/pybis.py
@@ -1106,11 +1106,11 @@ class Openbis:
         """
 
         criteria = []
-        for search_arg in ['code', 'description', 'registrator']:
+        for search_arg in ['code']:
+            # unfortunately, there aren't many search possibilities yet...
             if search_arg in search_args:
-                pass
-                #sub_crit = get_search_type_for_entity(search_arg)
-                #criteria.append(sub_crit)
+                if search_arg == 'code':
+                    criteria.append(_criteria_for_code(search_args[search_arg]))
 
         search_criteria = get_search_type_for_entity('authorizationGroup')
         search_criteria['criteria'] = criteria
@@ -1128,25 +1128,21 @@ class Openbis:
             ],
         }
         resp = self._post_request(self.as_v3, request)
-        if len(resp['objects']) == 0:
-            raise ValueError("No groups found!")
-
-        objects = resp['objects']
-        parse_jackson(objects)
 
-        groups = DataFrame(objects)
+        attrs = ['permId', 'code', 'description', 'users', 'registrator', 'registrationDate', 'modificationDate']
+        if len(resp['objects']) == 0:
+            groups = DataFrame(columns=attrs)
+        else:
+            objects = resp['objects']
+            parse_jackson(objects)
+            groups = DataFrame(objects)
 
-        groups['permId'] = groups['permId'].map(extract_permid)
-        groups['registrator'] = groups['registrator'].map(extract_person)
-        groups['users'] = groups['users'].map(extract_userId)
-        groups['registrationDate'] = groups['registrationDate'].map(format_timestamp)
-        groups['modificationDate'] = groups['modificationDate'].map(format_timestamp)
-        p = Things(
-            self, entity='group', 
-            df=groups[['permId', 'code', 'description', 'users', 'registrator', 'registrationDate', 'modificationDate']],
-            identifier_name='permId'
-        )
-        return p
+            groups['permId'] = groups['permId'].map(extract_permid)
+            groups['registrator'] = groups['registrator'].map(extract_person)
+            groups['users'] = groups['users'].map(extract_userId)
+            groups['registrationDate'] = groups['registrationDate'].map(format_timestamp)
+            groups['modificationDate'] = groups['modificationDate'].map(format_timestamp)
+        return Things(self, entity='group', df=groups[attrs], identifier_name='permId')
 
 
     def get_persons(self, **search_args):
@@ -1166,22 +1162,23 @@ class Openbis:
             ],
         }
         resp = self._post_request(self.as_v3, request)
+
+        attrs = ['permId', 'userId', 'firstName', 'lastName', 'email', 'space', 'registrationDate', 'active']
         if len(resp['objects']) == 0:
-            raise ValueError("No persons found!")
+            persons = DataFrame(columns=attrs)
+        else:
+            objects = resp['objects']
+            parse_jackson(objects)
 
-        objects = resp['objects']
-        parse_jackson(objects)
+            persons = DataFrame(resp['objects'])
+            persons['permId'] = persons['permId'].map(extract_permid)
+            persons['registrationDate'] = persons['registrationDate'].map(format_timestamp)
+            persons['space'] = persons['space'].map(extract_nested_permid)
 
-        persons = DataFrame(resp['objects'])
-        persons['permId'] = persons['permId'].map(extract_permid)
-        persons['registrationDate'] = persons['registrationDate'].map(format_timestamp)
-        persons['space'] = persons['space'].map(extract_nested_permid)
-        p = Things(
-            self, entity='person', 
-            df=persons[['permId', 'userId', 'firstName', 'lastName', 'email', 'space', 'registrationDate', 'active']],
-            identifier_name='permId'
+        return Things(
+            self, entity='person', df=persons[attrs], identifier_name='permId'
         )
-        return p
+
 
     get_users = get_persons # Alias
 
@@ -1240,18 +1237,16 @@ class Openbis:
                        ],
         }
         resp = self._post_request(self.as_v3, request)
-        if resp is not None:
+
+        attrs = ['code', 'description', 'registrationDate', 'modificationDate']
+        if len(resp['objects']) == 0:
+            spaces = DataFrame(columns=attrs)
+        else:
             spaces = DataFrame(resp['objects'])
             spaces['registrationDate'] = spaces['registrationDate'].map(format_timestamp)
             spaces['modificationDate'] = spaces['modificationDate'].map(format_timestamp)
-            sp = Things(
-                self,
-                'space',
-                spaces[['code', 'description', 'registrationDate', 'modificationDate']]
-            )
-            return sp
-        else:
-            raise ValueError("No spaces found!")
+        return Things(self, 'space', spaces[attrs])
+
 
     def get_space(self, code, only_data=False):
         """ Returns a Space object for a given identifier.
@@ -1356,8 +1351,8 @@ class Openbis:
                        fetchopts,
                        ],
         }
-
         resp = self._post_request(self.as_v3, request)
+
         attrs = ['identifier', 'permId', 'experiment', 'sample_type',
                  'registrator', 'registrationDate', 'modifier', 'modificationDate']
         if len(resp['objects']) == 0:
@@ -1381,8 +1376,7 @@ class Openbis:
                 samples[prop.upper()] = samples['properties'].map(lambda x: x.get(prop.upper(), ''))
                 attrs.append(prop.upper())
 
-        ss = samples[attrs]
-        return Things(self, 'sample', ss, 'identifier')
+        return Things(self, 'sample', samples[attrs], 'identifier')
 
     get_objects = get_samples # Alias
 
@@ -1436,32 +1430,31 @@ class Openbis:
             ],
         }
         resp = self._post_request(self.as_v3, request)
-        if len(resp['objects']) == 0:
-            raise ValueError("No experiments found!")
-
-        objects = resp['objects']
-        parse_jackson(objects)
-
-        experiments = DataFrame(objects)
-        experiments['registrationDate'] = experiments['registrationDate'].map(format_timestamp)
-        experiments['modificationDate'] = experiments['modificationDate'].map(format_timestamp)
-        experiments['project'] = experiments['project'].map(extract_code)
-        experiments['registrator'] = experiments['registrator'].map(extract_person)
-        experiments['modifier'] = experiments['modifier'].map(extract_person)
-        experiments['identifier'] = experiments['identifier'].map(extract_identifier)
-        experiments['permId'] = experiments['permId'].map(extract_permid)
-        experiments['type'] = experiments['type'].map(extract_code)
-
         attrs = ['identifier', 'permId', 'project', 'type',
                  'registrator', 'registrationDate', 'modifier', 'modificationDate']
+        if len(resp['objects']) == 0:
+            experiments = DataFrame(columns=attrs)
+        else:
+            objects = resp['objects']
+            parse_jackson(objects)
+
+            experiments = DataFrame(objects)
+            experiments['registrationDate'] = experiments['registrationDate'].map(format_timestamp)
+            experiments['modificationDate'] = experiments['modificationDate'].map(format_timestamp)
+            experiments['project'] = experiments['project'].map(extract_code)
+            experiments['registrator'] = experiments['registrator'].map(extract_person)
+            experiments['modifier'] = experiments['modifier'].map(extract_person)
+            experiments['identifier'] = experiments['identifier'].map(extract_identifier)
+            experiments['permId'] = experiments['permId'].map(extract_permid)
+            experiments['type'] = experiments['type'].map(extract_code)
 
         if props is not None:
             for prop in props:
                 experiments[prop.upper()] = experiments['properties'].map(lambda x: x.get(prop.upper(), ''))
                 attrs.append(prop.upper())
 
-        exps = experiments[attrs]
-        return Things(self, 'experiment', exps, 'identifier')
+        return Things(self, 'experiment', experiments[attrs], 'identifier')
+
 
     def get_datasets(self,
                      code=None, type=None, withParents=None, withChildren=None, status=None,
@@ -1517,23 +1510,24 @@ class Openbis:
                        ],
         }
         resp = self._post_request(self.as_v3, request)
+
+        attrs = ['permId', 'properties', 'type', 'experiment', 'sample', 'registrationDate', 'modificationDate', 'location']
+
         if len(resp['objects']) == 0:
-            raise ValueError("no datasets found!")
+            datasets = DataFrame(columns=attrs)
+        else:
+            objects = resp['objects']
+            parse_jackson(objects)
 
-        objects = resp['objects']
-        parse_jackson(objects)
+            datasets = DataFrame(objects)
+            datasets['registrationDate'] = datasets['registrationDate'].map(format_timestamp)
+            datasets['modificationDate'] = datasets['modificationDate'].map(format_timestamp)
+            datasets['experiment'] = datasets['experiment'].map(extract_nested_identifier)
+            datasets['sample'] = datasets['sample'].map(extract_nested_identifier)
+            datasets['type'] = datasets['type'].map(extract_code)
+            datasets['permId'] = datasets['code']
+            datasets['location'] = datasets['physicalData'].map(lambda x: x.get('location') if x else '')
 
-        datasets = DataFrame(objects)
-        datasets['registrationDate'] = datasets['registrationDate'].map(format_timestamp)
-        datasets['modificationDate'] = datasets['modificationDate'].map(format_timestamp)
-        datasets['experiment'] = datasets['experiment'].map(extract_nested_identifier)
-        datasets['sample'] = datasets['sample'].map(extract_nested_identifier)
-        datasets['type'] = datasets['type'].map(extract_code)
-        datasets['permId'] = datasets['code']
-        datasets['location'] = datasets['physicalData'].map(lambda x: x.get('location') if x else '')
-
-        attrs = ['permId', 'properties', 'type', 'experiment', 'sample', 'registrationDate', 'modificationDate',
-                 'location']
         if props is not None:
             for prop in props:
                 datasets[prop.upper()] = datasets['properties'].map(lambda x: x.get(prop.upper(), ''))
@@ -1541,6 +1535,7 @@ class Openbis:
 
         return Things(self, 'dataset', datasets[attrs], 'permId')
 
+
     def get_experiment(self, expId, withAttachments=False, only_data=False):
         """ Returns an experiment object for a given identifier (expId).
         """
@@ -1830,29 +1825,27 @@ class Openbis:
                        fetchopts,
                        ],
         }
-
         resp = self._post_request(self.as_v3, request)
-        objects = resp['objects']
-        if len(objects) == 0:
-            raise ValueError("No projects found!")
-            
-        parse_jackson(objects)
 
-        projects = DataFrame(objects)
-        if len(projects) is 0:
-            raise ValueError("No projects found!")
-
-        projects['registrationDate'] = projects['registrationDate'].map(format_timestamp)
-        projects['modificationDate'] = projects['modificationDate'].map(format_timestamp)
-        projects['leader'] = projects['leader'].map(extract_person)
-        projects['registrator'] = projects['registrator'].map(extract_person)
-        projects['modifier'] = projects['modifier'].map(extract_person)
-        projects['permId'] = projects['permId'].map(extract_permid)
-        projects['identifier'] = projects['identifier'].map(extract_identifier)
-
-        pros = projects[['identifier', 'permId', 'leader', 'registrator', 'registrationDate',
-                            'modifier', 'modificationDate']]
-        return Things(self, 'project', pros, 'identifier')
+        attrs = ['identifier', 'permId', 'leader', 'registrator', 'registrationDate', 'modifier', 'modificationDate']
+        if len(resp['objects']) == 0:
+            projects = DataFrame(columns=attrs)        
+        else:
+            objects = resp['objects']
+            parse_jackson(objects)
+
+            projects = DataFrame(objects)
+
+            projects['registrationDate'] = projects['registrationDate'].map(format_timestamp)
+            projects['modificationDate'] = projects['modificationDate'].map(format_timestamp)
+            projects['leader'] = projects['leader'].map(extract_person)
+            projects['registrator'] = projects['registrator'].map(extract_person)
+            projects['modifier'] = projects['modifier'].map(extract_person)
+            projects['permId'] = projects['permId'].map(extract_permid)
+            projects['identifier'] = projects['identifier'].map(extract_identifier)
+
+        return Things(self, 'project', projects[attrs], 'identifier')
+
 
     def _create_get_request(self, method_name, entity, permids, options):
 
-- 
GitLab