Exemplo n.º 1
0
Arquivo: plugin.py Projeto: raiju/bs
    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}
Exemplo n.º 2
0
Arquivo: tasks.py Projeto: raiju/bs
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)
Exemplo n.º 3
0
Arquivo: plugin.py Projeto: raiju/bs
    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})