Merge branch 'inject_connected_inputs' into dev

This commit is contained in:
Dannon Baker
2016-08-03 16:00:22 -04:00
16 changed files with 92 additions and 94 deletions
@@ -23,7 +23,7 @@ define([ 'utils/utils', 'utils/deferred', 'mvc/ui/ui-misc', 'mvc/form/form-view'
_refresh: function() {
var margin = _.reduce( this.$el.children(), function( memo, child ) {
return memo + $( child ).outerHeight();
}, 0 ) - this.$steps.height() + 30;
}, 0 ) - this.$steps.height() + 25;
this.$steps.css( 'height', $( window ).height() - margin );
},
@@ -56,7 +56,9 @@ define([ 'utils/utils', 'utils/deferred', 'mvc/ui/ui-misc', 'mvc/form/form-view'
errors : step.messages,
initial_errors : true,
cls : 'ui-portlet-narrow',
hide_operations : true
hide_operations : true,
needs_refresh : false,
always_refresh : step.step_type != 'tool'
}, step );
self.steps[ i ] = step;
self.links[ i ] = [];
@@ -167,7 +169,7 @@ define([ 'utils/utils', 'utils/deferred', 'mvc/ui/ui-misc', 'mvc/form/form-view'
this._renderHistory();
_.each ( this.steps, function( step, i ) { self._renderStep( step, i ) } );
this.deferred.execute( function() { self.execute_btn.unwait();
self.execute_btn.model.set( { wait_text: 'Sending...', percentage: -1 } ) } );
self.execute_btn.model.set( { wait_text: 'Sending...', percentage: -1 } ); } );
},
/** Render header */
@@ -193,7 +195,8 @@ define([ 'utils/utils', 'utils/deferred', 'mvc/ui/ui-misc', 'mvc/form/form-view'
this.$message.append( new Ui.Message( {
message : 'Some tools in this workflow may have changed since it was last saved or some errors were found. The workflow may still run, but any new options will have default values. Please review the messages below to make a decision about whether the changes will affect your analysis.',
status : 'warning',
persistent : true
persistent : true,
fade : false
} ).$el );
}
},
@@ -205,9 +208,7 @@ define([ 'utils/utils', 'utils/deferred', 'mvc/ui/ui-misc', 'mvc/form/form-view'
if ( !_.isEmpty( this.wp_inputs ) ) {
this.wp_form = new Form({ title: '<b>Workflow Parameters</b>', inputs: this.wp_inputs, cls: 'ui-portlet-narrow', onchange: function() {
_.each( self.wp_form.input_list, function( input_def, i ) {
_.each( input_def.links, function( step ) {
self._refreshStep( step );
});
_.each( input_def.links, function( step ) { self._refreshStep( step ) } );
});
}
});
@@ -266,17 +267,16 @@ define([ 'utils/utils', 'utils/deferred', 'mvc/ui/ui-misc', 'mvc/form/form-view'
}, '' ) ) )
);
}
self._append( self.$steps, form.$el );
} else {
_.each( step.inputs, function( input ) { input.flavor = 'module' } );
form = new Form( Utils.merge({
title : '<b>' + step.name + '</b>',
onchange : function() { _.each( self.links[ i ], function( link ) { self._refreshStep( link ) } ) }
}, step ) );
self._append( self.$steps, form.$el );
}
self.forms[ i ] = form;
self._refreshStep( step );
self._append( self.$steps, form.$el );
step.needs_refresh && self._refreshStep( step );
self._resolve( form.deferred, promise );
self.execute_btn.model.set( 'percentage', ( i + 1 ) * 100.0 / self.steps.length );
Galaxy.emit.debug( 'tool-form-composite::initialize()', i + ' : Workflow step state ready.', step );
@@ -327,6 +327,8 @@ define([ 'utils/utils', 'utils/deferred', 'mvc/ui/ui-misc', 'mvc/form/form-view'
}
});
form.trigger( 'change' );
} else {
step.needs_refresh = true;
}
},
+3 -2
View File
@@ -42,7 +42,8 @@ define(['utils/utils',
message : null,
status : 'info',
cls : '',
persistent : false
persistent : false,
fade : true
}).set( options );
this.listenTo( this.model, 'change', this.render, this );
this.render();
@@ -62,7 +63,7 @@ define(['utils/utils',
}
if ( this.model.get( 'message' ) ) {
this.$el.html( this.model.get( 'message' ) );
this.$el.fadeIn();
this.$el[ this.model.get( 'fade' ) ? 'fadeIn' : 'show' ]();
this.timeout && window.clearTimeout( this.timeout );
if ( !this.model.get( 'persistent' ) ) {
var self = this;
+9
View File
@@ -3309,6 +3309,15 @@ class HistoryDatasetCollectionAssociation( DatasetCollectionInstance, UsesAnnota
return (( type_coerce( cls.content_type, types.Unicode ) + u'-' +
type_coerce( cls.id, types.Unicode ) ).label( 'type_id' ))
def to_hda_representative( self, multiple=False ):
rval = []
for dataset in self.collection.dataset_elements:
rval.append( dataset.dataset_instance )
if multiple is False:
break
if len( rval ) > 0:
return rval if multiple else rval[ 0 ]
def to_dict( self, view='collection' ):
dict_value = dict(
hid=self.hid,
+22 -51
View File
@@ -114,16 +114,6 @@ class ToolParameter( object, Dictifiable ):
"""
return None
def get_initial_value_from_history_prevent_repeats( self, trans, other_values, already_used ):
"""
Get the starting value for the parameter, but if fetching from the history, try
to find a value that has not yet been used. already_used is a list of objects that
tools must manipulate (by adding to it) to store a memento that they can use to detect
if a value has already been chosen from the history. This is to support the capability to
choose each dataset once
"""
return self.get_initial_value( trans, other_values )
def get_required_enctype( self ):
"""
If this parameter needs the form to have a specific encoding
@@ -1202,10 +1192,12 @@ class ColumnListParameter( SelectToolParameter ):
return []
column_list = None
for dataset in util.listify( dataset ):
# Use representative dataset if a dataset collection is parsed
if isinstance( dataset, trans.app.model.HistoryDatasetCollectionAssociation ):
dataset = dataset.to_hda_representative()
# Columns can only be identified if metadata is available
if not hasattr( dataset, 'metadata' ) or not hasattr( dataset.metadata, 'columns' ) or not dataset.metadata.columns:
return []
# Build up possible columns for this dataset
this_column_list = []
if self.numerical:
@@ -1216,7 +1208,6 @@ class ColumnListParameter( SelectToolParameter ):
else:
for i in range( 0, dataset.metadata.columns ):
this_column_list.append( str( i + 1 ) )
# Take the intersection of these columns with the other columns.
if column_list is None:
column_list = this_column_list
@@ -1668,6 +1659,25 @@ class BaseDataToolParameter( ToolParameter ):
self.options_filter_attribute = options_elem.get( 'options_filter_attribute', None )
self.is_dynamic = self.options is not None
def get_initial_value( self, trans, other_values ):
if trans.workflow_building_mode is workflow_building_modes.ENABLED or trans.app.name == 'tool_shed':
return RuntimeValue()
if self.optional:
return None
history = trans.history
if history is not None:
dataset_matcher = DatasetMatcher( trans, self, None, other_values )
if isinstance( self, DataToolParameter ):
for hda in reversed( history.active_datasets_children_and_roles ):
match = dataset_matcher.hda_match( hda )
if match:
return match.hda
else:
dataset_collection_matcher = DatasetCollectionMatcher( dataset_matcher )
for hdca in reversed( history.active_dataset_collections ):
if dataset_collection_matcher.hdca_match( hdca, reduction=self.multiple ):
return hdca
def to_json( self, value, app ):
def single_to_json( value ):
src = None
@@ -1681,7 +1691,6 @@ class BaseDataToolParameter( ToolParameter ):
src = 'hda'
if src is not None:
return { 'id' : app.security.encode_id( value.id ), 'src' : src }
if value not in [ None, '', 'None' ]:
if isinstance( value, list ) and len( value ) > 0:
values = [ single_to_json( v ) for v in value ]
@@ -1830,44 +1839,6 @@ class DataToolParameter( BaseDataToolParameter ):
for item in dataset_collector( history.active_datasets_children_and_roles, None ):
yield item
def get_initial_value( self, trans, other_values ):
return self.get_initial_value_from_history_prevent_repeats(trans, other_values, None )
def get_initial_value_from_history_prevent_repeats( self, trans, other_values, already_used ):
"""
NOTE: This is wasteful since dynamic options and dataset collection
happens twice (here and when generating HTML).
"""
# Can't look at history in workflow mode. Tool shed has no histories.
if trans.workflow_building_mode is workflow_building_modes.ENABLED or trans.app.name == 'tool_shed':
return RuntimeValue()
history = self._get_history( trans )
dataset_matcher = DatasetMatcher( trans, self, None, other_values )
if self.optional:
return None
most_recent_dataset = []
def dataset_collector( datasets ):
for data in datasets:
if data.visible and dataset_matcher.hda_accessible( data, check_security=False ):
match = dataset_matcher.valid_hda_match( data, check_security=False )
if not match or dataset_matcher.filter( match.hda ):
continue
data = match.hda
most_recent_dataset.append(data)
# Also collect children via association object
dataset_collector( data.children )
dataset_collector( history.active_datasets_children_and_roles )
most_recent_dataset.reverse()
if already_used is not None:
for val in most_recent_dataset:
if val is not None and val not in already_used:
already_used.append(val)
return val
if len(most_recent_dataset) > 0:
return most_recent_dataset[0]
return ''
def from_json( self, value, trans, other_values={} ):
if trans.workflow_building_mode is workflow_building_modes.ENABLED:
return None
@@ -7,7 +7,7 @@ import logging
import os
import validation
from galaxy.util import string_as_bool
from galaxy.model import User
from galaxy.model import User, HistoryDatasetAssociation, HistoryDatasetCollectionAssociation
import galaxy.tools
log = logging.getLogger(__name__)
@@ -125,10 +125,12 @@ class DataMetaFilter( Filter ):
return dataset_value in file_value.split( self.separator )
return file_value == dataset_value
ref = other_values.get( self.ref_name, None )
if isinstance( ref, HistoryDatasetCollectionAssociation ):
ref = ref.to_hda_representative( self.multiple )
is_data = isinstance( ref, galaxy.tools.wrappers.DatasetFilenameWrapper )
is_data_list = isinstance( ref, galaxy.tools.wrappers.DatasetListWrapper ) or isinstance( ref, list )
is_data_or_data_list = is_data or is_data_list
if not isinstance( ref, self.dynamic_option.tool_param.tool.app.model.HistoryDatasetAssociation ) and not is_data_or_data_list:
if not isinstance( ref, HistoryDatasetAssociation ) and not is_data_or_data_list:
return [] # not a valid dataset
if is_data_list:
@@ -398,7 +400,9 @@ class RemoveValueFilter( Filter ):
value = other_values.get( self.ref_name )
else:
data_ref = other_values.get( self.meta_ref )
if not isinstance( data_ref, self.dynamic_option.tool_param.tool.app.model.HistoryDatasetAssociation ) and not isinstance( data_ref, galaxy.tools.wrappers.DatasetFilenameWrapper ):
if isinstance( data_ref, HistoryDatasetCollectionAssociation ):
data_ref = data_ref.to_hda_representative()
if not isinstance( data_ref, HistoryDatasetAssociation ) and not isinstance( data_ref, galaxy.tools.wrappers.DatasetFilenameWrapper ):
return options # cannot modify options
value = data_ref.metadata.get( self.metadata_key, None )
return [ ( disp_name, optval, selected ) for disp_name, optval, selected in options if not compare_value( optval, value ) ]
@@ -1135,7 +1135,7 @@ class WorkflowController( BaseUIController, SharableMixin, UsesStoredWorkflowMix
trans.workflow_building_mode = workflow_building_modes.USE_HISTORY
for step in workflow.steps:
try:
module_injector.inject( step )
module_injector.inject( step, steps=workflow.steps )
except MissingToolException:
if step.tool_id not in missing_tools:
missing_tools.append(step.tool_id)
+24 -11
View File
@@ -21,7 +21,7 @@ from galaxy.tools.parameters.basic import (
from galaxy.tools.parameters.wrapped import make_dict_copy
from galaxy.tools import DefaultToolState
from galaxy.tools import ToolInputsNotReadyException
from galaxy.util import odict
from galaxy.util import odict, listify
from galaxy.util.bunch import Bunch
from galaxy.web.framework import formbuilder
from tool_shed.util import common_util
@@ -132,7 +132,7 @@ class WorkflowModule( object ):
"""
pass
def add_dummy_datasets( self, connections=None):
def add_dummy_datasets( self, connections=None, steps=None ):
# Replaced connected inputs with DummyDataset values.
pass
@@ -417,7 +417,7 @@ class SubWorkflowModule( WorkflowModule ):
"""
return None
def add_dummy_datasets( self, connections=None):
def add_dummy_datasets( self, connections=None, steps=None ):
# Replaced connected inputs with DummyDataset values.
return None
@@ -1139,11 +1139,10 @@ class ToolModule( WorkflowModule ):
if flush_required:
self.trans.sa_session.flush()
def add_dummy_datasets( self, connections=None):
def add_dummy_datasets( self, connections=None, steps=None ):
if connections:
# Store onnections by input name
input_connections_by_name = \
dict( ( conn.input_name, conn ) for conn in connections )
input_connections_by_name = dict( ( conn.input_name, conn ) for conn in connections )
else:
input_connections_by_name = {}
@@ -1151,10 +1150,24 @@ class ToolModule( WorkflowModule ):
# are not persisted so we need to do it every time)
def callback( input, prefixed_name, context, **kwargs ):
if isinstance( input, DataToolParameter ) or isinstance( input, DataCollectionToolParameter ):
if connections is None or prefixed_name in input_connections_by_name:
if self.trans.workflow_building_mode is workflow_building_modes.USE_HISTORY:
if connections is None or prefixed_name in input_connections_by_name:
if steps:
connection = input_connections_by_name[ prefixed_name ]
output_step = next( output_step for output_step in steps if connection.output_step_id == output_step.id )
if output_step.type.startswith( 'data' ):
output_inputs = output_step.module.get_runtime_inputs()
output_value = output_inputs[ 'input' ].get_initial_value( self.trans, context )
if isinstance( input, DataToolParameter ):
for v in listify( output_value ):
if isinstance( v, self.trans.app.model.HistoryDatasetCollectionAssociation ):
return v.to_hda_representative()
return output_value
return RuntimeValue()
else:
return input.get_initial_value( self.trans, context )
elif connections is None or prefixed_name in input_connections_by_name:
return RuntimeValue()
elif self.trans.workflow_building_mode is workflow_building_modes.USE_HISTORY:
return input.get_initial_value( self.trans, context )
visit_input_values( self.tool.inputs, self.state.inputs, callback )
@@ -1289,7 +1302,7 @@ class WorkflowModuleInjector(object):
self.trans = trans
self.allow_tool_state_corrections = allow_tool_state_corrections
def inject( self, step, step_args=None ):
def inject( self, step, step_args=None, steps=None ):
""" Pre-condition: `step` is an ORM object coming from the database, if
supplied `step_args` is the representation of the inputs for that step
supplied via web form.
@@ -1319,7 +1332,7 @@ class WorkflowModuleInjector(object):
# Any connected input needs to have value DummyDataset (these
# are not persisted so we need to do it every time)
module.add_dummy_datasets( connections=step.input_connections )
module.add_dummy_datasets( connections=step.input_connections, steps=steps )
state, step_errors = module.compute_runtime_state( self.trans, step_args )
step.state = state
if step.type == "subworkflow":
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"ui-misc.js","sources":["../../../src/mvc/ui/ui-misc.js"],"names":["define","Utils","Select","Slider","Options","Drilldown","Buttons","Modal","Label","Backbone","View","extend","tagName","initialize","options","this","model","Model","setElement","$","listenTo","render","title","new_title","set","value","get","$el","removeClass","addClass","html","Message","message","status","cls","persistent","update","fadeIn","timeout","window","clearTimeout","self","setTimeout","fadeOut","Input","type","placeholder","disabled","visible","area","color","style","events","input","new_val","undefined","attr","id","css","val","removeAttr","_onchange","Hidden","append","$info","$hidden","show","hide","Button","ButtonDefault","ButtonIcon","ButtonCheck","ButtonMenu","ButtonLink","RadioButton","Checkbox","Radio"],"mappings":"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"}
{"version":3,"file":"ui-misc.js","sources":["../../../src/mvc/ui/ui-misc.js"],"names":["define","Utils","Select","Slider","Options","Drilldown","Buttons","Modal","Label","Backbone","View","extend","tagName","initialize","options","this","model","Model","setElement","$","listenTo","render","title","new_title","set","value","get","$el","removeClass","addClass","html","Message","message","status","cls","persistent","fade","update","timeout","window","clearTimeout","self","setTimeout","fadeOut","Input","type","placeholder","disabled","visible","area","color","style","events","input","new_val","undefined","attr","id","css","val","removeAttr","_onchange","Hidden","append","$info","$hidden","show","hide","Button","ButtonDefault","ButtonIcon","ButtonCheck","ButtonMenu","ButtonLink","RadioButton","Checkbox","Radio"],"mappings":"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"}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
define(["utils/utils","mvc/ui/ui-select-default","mvc/ui/ui-slider","mvc/ui/ui-options","mvc/ui/ui-drilldown","mvc/ui/ui-buttons","mvc/ui/ui-modal"],function(a,b,c,d,e,f,g){var h=Backbone.View.extend({tagName:"label",initialize:function(a){this.model=a&&a.model||new Backbone.Model(a),this.tagName=a.tagName||this.tagName,this.setElement($("<"+this.tagName+"/>")),this.listenTo(this.model,"change",this.render,this),this.render()},title:function(a){this.model.set("title",a)},value:function(){return this.model.get("title")},render:function(){return this.$el.removeClass().addClass("ui-label").addClass(this.model.get("cls")).html(this.model.get("title")),this}}),i=Backbone.View.extend({initialize:function(a){this.model=a&&a.model||new Backbone.Model({message:null,status:"info",cls:"",persistent:!1}).set(a),this.listenTo(this.model,"change",this.render,this),this.render()},update:function(a){this.model.set(a)},render:function(){this.$el.removeClass().addClass("ui-message").addClass(this.model.get("cls"));var a=this.model.get("status");if(this.model.get("large")?this.$el.addClass(("success"==a&&"done"||"danger"==a&&"error"||a)+"messagelarge"):this.$el.addClass("alert").addClass("alert-"+a),this.model.get("message")){if(this.$el.html(this.model.get("message")),this.$el.fadeIn(),this.timeout&&window.clearTimeout(this.timeout),!this.model.get("persistent")){var b=this;this.timeout=window.setTimeout(function(){b.model.set("message","")},3e3)}}else this.$el.fadeOut();return this}}),j=Backbone.View.extend({initialize:function(a){this.model=a&&a.model||new Backbone.Model({type:"text",placeholder:"",disabled:!1,visible:!0,cls:"",area:!1,color:null,style:null}).set(a),this.tagName=this.model.get("area")?"textarea":"input",this.setElement($("<"+this.tagName+"/>")),this.listenTo(this.model,"change",this.render,this),this.render()},events:{input:"_onchange"},value:function(a){return void 0!==a&&this.model.set("value","string"==typeof a?a:""),this.model.get("value")},render:function(){return this.$el.removeClass().addClass("ui-"+this.tagName).addClass(this.model.get("cls")).addClass(this.model.get("style")).attr("id",this.model.id).attr("type",this.model.get("type")).attr("placeholder",this.model.get("placeholder")).css("color",this.model.get("color")||"").css("border-color",this.model.get("color")||""),this.model.get("value")!==this.$el.val()&&this.$el.val(this.model.get("value")),this.model.get("disabled")?this.$el.attr("disabled",!0):this.$el.removeAttr("disabled"),this.$el[this.model.get("visible")?"show":"hide"](),this},_onchange:function(){this.value(this.$el.val()),this.model.get("onchange")&&this.model.get("onchange")(this.model.get("value"))}}),k=Backbone.View.extend({initialize:function(a){this.model=a&&a.model||new Backbone.Model(a),this.setElement($("<div/>").append(this.$info=$("<div/>")).append(this.$hidden=$("<div/>"))),this.listenTo(this.model,"change",this.render,this),this.render()},value:function(a){return void 0!==a&&this.model.set("value",a),this.model.get("value")},render:function(){return this.$el.attr("id",this.model.id),this.$hidden.val(this.model.get("value")),this.model.get("info")?this.$info.show().html(this.model.get("info")):this.$info.hide(),this}});return{Button:f.ButtonDefault,ButtonIcon:f.ButtonIcon,ButtonCheck:f.ButtonCheck,ButtonMenu:f.ButtonMenu,ButtonLink:f.ButtonLink,Input:j,Label:h,Message:i,Modal:g,RadioButton:d.RadioButton,Checkbox:d.Checkbox,Radio:d.Radio,Select:b,Hidden:k,Slider:c,Drilldown:e}});
define(["utils/utils","mvc/ui/ui-select-default","mvc/ui/ui-slider","mvc/ui/ui-options","mvc/ui/ui-drilldown","mvc/ui/ui-buttons","mvc/ui/ui-modal"],function(a,b,c,d,e,f,g){var h=Backbone.View.extend({tagName:"label",initialize:function(a){this.model=a&&a.model||new Backbone.Model(a),this.tagName=a.tagName||this.tagName,this.setElement($("<"+this.tagName+"/>")),this.listenTo(this.model,"change",this.render,this),this.render()},title:function(a){this.model.set("title",a)},value:function(){return this.model.get("title")},render:function(){return this.$el.removeClass().addClass("ui-label").addClass(this.model.get("cls")).html(this.model.get("title")),this}}),i=Backbone.View.extend({initialize:function(a){this.model=a&&a.model||new Backbone.Model({message:null,status:"info",cls:"",persistent:!1,fade:!0}).set(a),this.listenTo(this.model,"change",this.render,this),this.render()},update:function(a){this.model.set(a)},render:function(){this.$el.removeClass().addClass("ui-message").addClass(this.model.get("cls"));var a=this.model.get("status");if(this.model.get("large")?this.$el.addClass(("success"==a&&"done"||"danger"==a&&"error"||a)+"messagelarge"):this.$el.addClass("alert").addClass("alert-"+a),this.model.get("message")){if(this.$el.html(this.model.get("message")),this.$el[this.model.get("fade")?"fadeIn":"show"](),this.timeout&&window.clearTimeout(this.timeout),!this.model.get("persistent")){var b=this;this.timeout=window.setTimeout(function(){b.model.set("message","")},3e3)}}else this.$el.fadeOut();return this}}),j=Backbone.View.extend({initialize:function(a){this.model=a&&a.model||new Backbone.Model({type:"text",placeholder:"",disabled:!1,visible:!0,cls:"",area:!1,color:null,style:null}).set(a),this.tagName=this.model.get("area")?"textarea":"input",this.setElement($("<"+this.tagName+"/>")),this.listenTo(this.model,"change",this.render,this),this.render()},events:{input:"_onchange"},value:function(a){return void 0!==a&&this.model.set("value","string"==typeof a?a:""),this.model.get("value")},render:function(){return this.$el.removeClass().addClass("ui-"+this.tagName).addClass(this.model.get("cls")).addClass(this.model.get("style")).attr("id",this.model.id).attr("type",this.model.get("type")).attr("placeholder",this.model.get("placeholder")).css("color",this.model.get("color")||"").css("border-color",this.model.get("color")||""),this.model.get("value")!==this.$el.val()&&this.$el.val(this.model.get("value")),this.model.get("disabled")?this.$el.attr("disabled",!0):this.$el.removeAttr("disabled"),this.$el[this.model.get("visible")?"show":"hide"](),this},_onchange:function(){this.value(this.$el.val()),this.model.get("onchange")&&this.model.get("onchange")(this.model.get("value"))}}),k=Backbone.View.extend({initialize:function(a){this.model=a&&a.model||new Backbone.Model(a),this.setElement($("<div/>").append(this.$info=$("<div/>")).append(this.$hidden=$("<div/>"))),this.listenTo(this.model,"change",this.render,this),this.render()},value:function(a){return void 0!==a&&this.model.set("value",a),this.model.get("value")},render:function(){return this.$el.attr("id",this.model.id),this.$hidden.val(this.model.get("value")),this.model.get("info")?this.$info.show().html(this.model.get("info")):this.$info.hide(),this}});return{Button:f.ButtonDefault,ButtonIcon:f.ButtonIcon,ButtonCheck:f.ButtonCheck,ButtonMenu:f.ButtonMenu,ButtonLink:f.ButtonLink,Input:j,Label:h,Message:i,Modal:g,RadioButton:d.RadioButton,Checkbox:d.Checkbox,Radio:d.Radio,Select:b,Hidden:k,Slider:c,Drilldown:e}});
//# sourceMappingURL=../../../maps/mvc/ui/ui-misc.js.map
+2 -2
View File
@@ -490,7 +490,7 @@ if wf_parms:
## FIXME: Initialize in the controller
<%
if value is None:
value = other_values[ param.name ] = param.get_initial_value_from_history_prevent_repeats( t, other_values, already_used )
value = other_values[ param.name ] = param.get_initial_value( t, other_values )
if not enable_unique_defaults:
del already_used[:]
%>
@@ -521,7 +521,7 @@ if wf_parms:
## load, fill in initial values where needed, and mark
## all that are runtime modifiable in some way.
<%
value = other_values[ param.name ] = param.get_initial_value_from_history_prevent_repeats( t, other_values, already_used )
value = other_values[ param.name ] = param.get_initial_value( t, other_values )
if not enable_unique_defaults:
del already_used[:]
%>
+4 -6
View File
@@ -97,21 +97,19 @@ class DataToolParameterTestCase( BaseParameterTestCase ):
assert option[ 1 ] == "None"
assert option[ 2 ] is True
def test_get_initial_value_prevents_repeats( self ):
def test_get_initial_value( self ):
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
hda2 = MockHistoryDatasetAssociation( name="hda2", id=2 )
self.stub_active_datasets( hda1, hda2 )
already_used = []
assert hda2 == self.param.get_initial_value_from_history_prevent_repeats( self.trans, {}, already_used )
assert hda1 == self.param.get_initial_value_from_history_prevent_repeats( self.trans, {}, already_used )
assert hda2 == self.param.get_initial_value( self.trans, {} )
def test_get_initial_value_is_empty_string_if_no_match( self ):
def test_get_initial_value_is_none_if_no_match( self ):
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
hda1.visible = False
hda2 = MockHistoryDatasetAssociation( name="hda2", id=2 )
hda2.visible = False
self.stub_active_datasets( hda1, hda2 )
assert '' == self.param.get_initial_value( self.trans, {} )
assert self.param.get_initial_value( self.trans, {} ) is None
def test_get_initial_none_when_optional( self ):
self.optional = True