def _create_or_update(self, mn_client, cn_client, data_object): """ Either update the specified pid if it already exists or create a new one. """ if not data_object: raise Exception("data object cannot be null") if not data_object.pid: raise Exception("data object must have a pid") if not data_object.fname: raise Exception("data object must have a file to write") if not data_object.meta: raise Exception("data object must have system metadata") curr_sysmeta = utils.get_sysmeta_by_pid(data_object.pid, True, cn_client, mn_client) # Create if not curr_sysmeta: with open(utils.expand_path(data_object.fname), "r") as f: try: return mn_client.create(data_object.pid, f, data_object.meta) except DataONEException as e: raise Exception("Unable to create Science Object on Member Node\n{0}".format(e.friendly_format())) # Update else: data_object.meta.serialVersion = curr_sysmeta.serialVersion + 1 with open(utils.expand_path(data_object.fname), "r") as f: try: return mn_client.update(data_object.pid, f, data_object.pid, data_object.meta) except DataONEException as e: raise Exception("Unable to update Science Object on Member Node\n{0}".format(e.friendly_format())) # Nothing good happened. return None
def _create_object(self, item, mn_client=None, **kwargs): """ Create an object in DataONE. """ path = utils.expand_path(item.fname) # cli_util.assert_file_exists(path) assert os.path.exists(path) if "format_id" in kwargs: del kwargs["format_id"] sysmeta = utils.create_sysmeta_from_path(item.pid, path, format_id=item.format_id, **kwargs) if mn_client is None: mn_client = utils.get_d1_mn_client() with open(path, "r") as f: try: result = mn_client.create(item.pid, f, sysmeta) print 'Created object "%s"' % item.pid return result except DataONEException as e: raise Exception("Unable to create Science Object on Member Node\n{0}".format(e.friendly_format()))