def get(self, id, *args, **kw): """ Display the form by it's id """ # check plugin id plug = None try: plug = putil.get_plugin_byId(id) except: tg.abort(400, "Bad plugin identifier") debug('get plugin %s' % id) # get the plugin obj = plug info = obj.info form = info.get('output')() desc = info.get('description') debug('params = %s' % kw, 1) # bioscript parameters bs_private = {} if 'bs_private' in kw: bs_private = json.loads(kw['bs_private']) debug("get bs private parameters %s" % bs_private, 2) if 'prefill' in bs_private: prefill_fields(info.get('in'), form, bs_private['prefill'], kw) # {'bs_private': {'app': pp, 'cfg': handler.job.bioscript_config, 'prefill': prefill}}) # add some private parameters from BioScript pp = {'id': id} # if user is a serviec, add the key & the mail in the authentication user = util.get_user(tg.request) if user.is_service: pp['mail'] = user.email pp['key'] = user.key bs_private['pp'] = pp # prepare form output main_proxy = tg.config.get('main.proxy') widget = form(action=main_proxy + tg.url('/plugins/validate', {'id': id})).req() widget.value = {'bs_private': json.dumps(bs_private), 'key': user.key} debug('display plugin with bs_private : %s' % bs_private) debug('vaaalue : %s' % widget.value) debug(user) return {'page': 'plugin', 'desc': desc, 'title': info.get('title'), 'widget': widget}
def plugin_job(username, inputs_directory, outputs_directory, plugin_info, user_parameters, service_callback, bioscript_callback, **form_parameters): task_id = plugin_job.request.id if service_callback is not None: callback_service(service_callback, plugin_info['generated_id'], task_id, 'RUNNING', additional=user_parameters) debug('task launched') # get plugin class plugin = util.get_plugin_byId(plugin_info['generated_id']) if plugin is None: raise Exception('Plugin not found by the worker.') debug('plugin operation start') plugin._start_timer() results = [] # call plugin with form parameters try: ret = plugin(**form_parameters) results = [{'is_file': False, 'value': ret }] except Exception as e: if service_callback is not None: user_parameters.update({'error': e}) callback_service(service_callback, plugin_info['generated_id'], task_id, 'FAILED', additional=user_parameters) raise # mkdir output directory out = os.path.join(outputs_directory, task_id) debug('mkdir out path : %s' % out) try: os.mkdir(out) except OSError, e: if e.errno == errno.EEXIST: io.rm(out) os.mkdir(out)
def validate(self, **kw): """ plugin parameters validation """ user = util.get_user(tg.request) debug('Got request validation from user %s' % user) if not 'bs_private' in kw: tg.abort(400, "Plugin identifier not found in the request.") debug('params %s' % kw, 1) bs_private = copy.deepcopy(json.loads(kw['bs_private'])) debug('private %s' % bs_private, 1) plugin_id = bs_private['pp']['id'] if plugin_id is None: tg.abort(400, "Plugin identifier not found in the request.") # check plugin id plug = putil.get_plugin_byId(plugin_id) if plug is None: tg.abort(400, "Bad plugin identifier") # get plugin form output obj = plug info = obj.info form = info.get('output')() # callback for jsonP callback = kw.get('callback', 'callback') # get the plugin from the database plugin_db = DBSession.query(Plugin).filter(Plugin.generated_id == obj.unique_id()).first() plugin_request = _log_form_request(plugin_id=plugin_db.id, user=user, parameters=kw) if 'prefill' in bs_private: prefill_fields(info.get('in'), form, bs_private['prefill'], kw, replace_value=False) debug('prefill in validation', 3) del bs_private['prefill'] # validation try: form = form().req() form.validate(kw) except (tw2.core.ValidationError, Invalid) as e: main_proxy = tg.config.get('main.proxy') e.widget.action = main_proxy + tg.url('plugins/index', {'id': plugin_id}) debug('private after validation failed %s' % bs_private, 1) #value = {'bs_private': json.dumps(bs_private)} #debug('value %s' % value) #e.widget.value = value plugin_request.status = 'FAILED' plugin_request.error = str(e) DBSession.add(plugin_request) return jsonp_response(**{'validation': 'failed', 'desc': info.get('description'), 'title': info.get('title'), 'widget': e.widget.display(), 'callback': callback}) debug('Validation pass') #if the validation passes, remove private parameters from the request del kw['bs_private'] if 'key' in kw: del kw['key'] # fetch form files try: inputs_directory = filemanager.fetch(user, obj, kw) except Exception as e: plugin_request.status = 'FAILED' plugin_request.error = str(e) DBSession.add(plugin_request) import sys import traceback etype, value, tb = sys.exc_info() traceback.print_exception(etype, value, tb) return jsonp_response(**{'validation': 'success', 'desc': info.get('description'), 'title': info.get('title'), 'error': 'error while fetching files : ' + str(e), 'callback': callback}) debug('Files fetched') # get output directory to write results outputs_directory = filemanager.temporary_directory(constants.paths['data']) service_callback = None debug(user) if user.is_service: debug('is service', 1) # def out_path(service_name): o = services.service_manager.get(user.name, constants.SERVICE_RESULT_ROOT_PARAMETER) if o: outputs_directory = o service_callback = services.service_manager.get(user.name, constants.SERVICE_CALLBACK_URL_PARAMETER) debug('Output dir = %s' % outputs_directory) # get user parameters from the request user_parameters = bs_private.get('app', "{}") debug('get user parameters : %s' % user_parameters, 1) # get response config from the request resp_config = bs_private.get('cfg', None) plugin_info = {'title': info['title'], 'plugin_id': plugin_db.id, 'generated_id': plugin_db.generated_id, 'description': info['description'], 'path': info['path'], 'in': info['in'], 'out': info['out'], 'meta': info['meta']} # call plugin process bioscript_callback = tg.config.get('main.proxy') + '/' + tg.url('plugins/callback_results') async_res = tasks.plugin_job.delay(user.name, inputs_directory, outputs_directory, plugin_info, user_parameters, service_callback, bioscript_callback, **kw) task_id = async_res.task_id _log_job_request(plugin_request.id, task_id) if resp_config and resp_config.get('plugin_info', '') == 'min': return jsonp_response(**{'validation': 'success', 'plugin_id': plugin_id, 'task_id': task_id, 'callback': callback, 'app': user_parameters}) return jsonp_response(**{ 'validation': 'success', 'plugin_id': plugin_id, 'task_id': task_id, 'plugin_info': json.dumps( {'title': info['title'], 'description': info['description'], 'path': info['path'], 'in': info['in'], 'out': info['out'], 'meta': info['meta']}), 'callback': callback, 'app': user_parameters})