def get_configurable_interface(self): """ Given an algorithm identifier, go trough the adapter chain, and merge their input tree with the declared overwrites """ chain_adapters = self.reader.get_adapters_chain(self.algo_identifier) result = [] for adapter_declaration in chain_adapters: adapter_instance, algorithm_group = self.build_adapter_from_declaration(adapter_declaration) algorithm_field = adapter_declaration[KEY_FIELD] if algorithm_field: default_algorithm = adapter_declaration[ABCAdapter.KEY_DEFAULT] else: default_algorithm = '' all_portlet_defined_params = self.reader.get_inputs(self.algo_identifier) specific_adapter_overwrites = [entry for entry in all_portlet_defined_params if ATT_OVERWRITE in entry and entry[ATT_OVERWRITE] == adapter_declaration[ABCAdapter.KEY_NAME]] if default_algorithm: alg_inputs = adapter_instance.xml_reader.get_inputs(default_algorithm) prefix = InputTreeManager.form_prefix(algorithm_field, None, default_algorithm) else: alg_inputs = adapter_instance.get_input_tree() prefix = '' replace_values = self._prepare_input_tree(alg_inputs, specific_adapter_overwrites, prefix) adapter_configuration = AdapterConfiguration(replace_values, algorithm_group, prefix=prefix, subalgorithm_field=algorithm_field, subalgorithm_value=default_algorithm) result.append(adapter_configuration) return result
def create_new_portlet_configuration(self, name=""): """ Create a PortletConfiguration entity with the default values from the portlet XML declaration and the adapter input trees. """ chain_adapters = self.reader.get_adapters_chain(self.algo_identifier) analyze_steps = [] view_step = None idx = 0 for adapter_declaration in chain_adapters: adapter_instance, algorithm_group = self.build_adapter_from_declaration(adapter_declaration) ### Get the flatten interface for the adapter, and in case of ##### ### sub-algorithms also get the pair {algorithm : value} ##### algorithm_field = adapter_declaration[KEY_FIELD] if algorithm_field: default_algorithm = adapter_declaration[ABCAdapter.KEY_DEFAULT] else: default_algorithm = "" if default_algorithm: prefix = InputTreeManager.form_prefix(algorithm_field, None, default_algorithm) alg_inputs = adapter_instance.tree_manager.flatten( adapter_instance.xml_reader.get_inputs(default_algorithm), prefix ) else: alg_inputs = adapter_instance.flaten_input_interface() ################################################################### ### Get the overwrites defined in the portlet configuration ####### ### for this specific adapter in the adapter chain ####### ### split in static and dynamic ones ####### prepared_params = {KEY_STATIC: {}, KEY_DYNAMIC: {}} all_portlet_defined_params = self.reader.get_inputs(self.algo_identifier) specific_adapter_overwrites = [ entry for entry in all_portlet_defined_params if ATT_OVERWRITE in entry and entry[ATT_OVERWRITE] == adapter_declaration[ABCAdapter.KEY_NAME] ] for entry in specific_adapter_overwrites: if ABCAdapter.KEY_DEFAULT in entry: declared_value = entry[ABCAdapter.KEY_DEFAULT] elif ABCAdapter.KEY_VALUE in entry: declared_value = entry[ABCAdapter.KEY_VALUE] else: declared_value = "" if entry[ABCAdapter.KEY_TYPE] == KEY_DYNAMIC: prepared_params[KEY_DYNAMIC][entry[ABCAdapter.KEY_NAME]] = declared_value else: prepared_params[KEY_STATIC][entry[ABCAdapter.KEY_NAME]] = declared_value ################################################################### ### Now just fill the rest of the adapter inputs if they are not ## ### present in neither dynamic or static overwrites. In case of ## ### sub-algorithms also add as static the algorithm : value pair ## for input_dict in alg_inputs: input_name = input_dict[ABCAdapter.KEY_NAME] if input_name not in prepared_params[KEY_STATIC] and input_name not in prepared_params[KEY_DYNAMIC]: if ABCAdapter.KEY_DEFAULT in input_dict: input_value = input_dict[ABCAdapter.KEY_DEFAULT] else: input_value = "" prepared_params[KEY_STATIC][input_name] = input_value if default_algorithm: prepared_params[KEY_STATIC][algorithm_field] = default_algorithm ################################################################### ### Now parse the dynamic inputs declared in the portlets XML ###### ### into workflow_step specific format. #### for param_name in prepared_params[KEY_DYNAMIC]: new_value = self._portlet_dynamic2workflow_step(prepared_params[KEY_DYNAMIC][param_name]) prepared_params[KEY_DYNAMIC][param_name] = new_value ################################################################### ###Finally get the actual algorithm id from the DB as we need the # ###algorithm id, then build the workflow step given the computed # ###parameter set, then build and return the portlet configuration## algorithm = dao.get_algorithm_by_group(algorithm_group.id, default_algorithm) if idx == len(chain_adapters) - 1: view_step = WorkflowStepView( algorithm_id=algorithm.id, portlet_id=self.portlet_id, ui_name=name, static_param=prepared_params[KEY_STATIC], dynamic_param=prepared_params[KEY_DYNAMIC], ) else: workflow_step = WorkflowStep( algorithm_id=algorithm.id, static_param=prepared_params[KEY_STATIC], dynamic_param=prepared_params[KEY_DYNAMIC], ) analyze_steps.append(workflow_step) idx += 1 portlet_configuration = PortletConfiguration(self.portlet_id) portlet_configuration.set_analyzers(analyze_steps) portlet_configuration.set_visualizer(view_step) return portlet_configuration
def get_input_for_algorithm(self, algorithm_identifier=None): """For a group, we will return input tree on algorithm base.""" inputs = self.xml_reader.get_inputs(algorithm_identifier) prefix = InputTreeManager.form_prefix(self.get_algorithm_param(), option_prefix=algorithm_identifier) result = ABCAdapter.prepare_param_names(inputs, prefix) return result
def create_new_portlet_configuration(self, name=''): """ Create a PortletConfiguration entity with the default values from the portlet XML declaration and the adapter input trees. """ chain_adapters = self.reader.get_adapters_chain(self.algo_identifier) analyze_steps = [] view_step = None idx = 0 for adapter_declaration in chain_adapters: adapter_instance, algorithm_group = self.build_adapter_from_declaration(adapter_declaration) ### Get the flatten interface for the adapter, and in case of ##### ### sub-algorithms also get the pair {algorithm : value} ##### algorithm_field = adapter_declaration[KEY_FIELD] if algorithm_field: default_algorithm = adapter_declaration[ABCAdapter.KEY_DEFAULT] else: default_algorithm = '' if default_algorithm: prefix = InputTreeManager.form_prefix(algorithm_field, None, default_algorithm) alg_inputs = adapter_instance.tree_manager.flatten(adapter_instance.xml_reader.get_inputs(default_algorithm), prefix) else: alg_inputs = adapter_instance.flaten_input_interface() ################################################################### ### Get the overwrites defined in the portlet configuration ####### ### for this specific adapter in the adapter chain ####### ### split in static and dynamic ones ####### prepared_params = {KEY_STATIC: {}, KEY_DYNAMIC: {}} all_portlet_defined_params = self.reader.get_inputs(self.algo_identifier) specific_adapter_overwrites = [entry for entry in all_portlet_defined_params if ATT_OVERWRITE in entry and entry[ATT_OVERWRITE] == adapter_declaration[ABCAdapter.KEY_NAME]] for entry in specific_adapter_overwrites: if ABCAdapter.KEY_DEFAULT in entry: declared_value = entry[ABCAdapter.KEY_DEFAULT] elif ABCAdapter.KEY_VALUE in entry: declared_value = entry[ABCAdapter.KEY_VALUE] else: declared_value = '' if entry[ABCAdapter.KEY_TYPE] == KEY_DYNAMIC: prepared_params[KEY_DYNAMIC][entry[ABCAdapter.KEY_NAME]] = declared_value else: prepared_params[KEY_STATIC][entry[ABCAdapter.KEY_NAME]] = declared_value ################################################################### ### Now just fill the rest of the adapter inputs if they are not ## ### present in neither dynamic or static overwrites. In case of ## ### sub-algorithms also add as static the algorithm : value pair ## for input_dict in alg_inputs: input_name = input_dict[ABCAdapter.KEY_NAME] if input_name not in prepared_params[KEY_STATIC] and input_name not in prepared_params[KEY_DYNAMIC]: if ABCAdapter.KEY_DEFAULT in input_dict: input_value = input_dict[ABCAdapter.KEY_DEFAULT] else: input_value = '' prepared_params[KEY_STATIC][input_name] = input_value if default_algorithm: prepared_params[KEY_STATIC][algorithm_field] = default_algorithm ################################################################### ### Now parse the dynamic inputs declared in the portlets XML ###### ### into workflow_step specific format. #### for param_name in prepared_params[KEY_DYNAMIC]: new_value = self._portlet_dynamic2workflow_step(prepared_params[KEY_DYNAMIC][param_name]) prepared_params[KEY_DYNAMIC][param_name] = new_value ################################################################### ###Finally get the actual algorithm id from the DB as we need the # ###algorithm id, then build the workflow step given the computed # ###parameter set, then build and return the portlet configuration## algorithm = dao.get_algorithm_by_group(algorithm_group.id, default_algorithm) if idx == len(chain_adapters) - 1: view_step = WorkflowStepView(algorithm_id=algorithm.id, portlet_id=self.portlet_id, ui_name=name, static_param=prepared_params[KEY_STATIC], dynamic_param=prepared_params[KEY_DYNAMIC]) else: workflow_step = WorkflowStep(algorithm_id=algorithm.id, static_param=prepared_params[KEY_STATIC], dynamic_param=prepared_params[KEY_DYNAMIC]) analyze_steps.append(workflow_step) idx += 1 portlet_configuration = PortletConfiguration(self.portlet_id) portlet_configuration.set_analyzers(analyze_steps) portlet_configuration.set_visualizer(view_step) return portlet_configuration