diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py
index 9ab16d0ee2d..eb329c1ef72 100755
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -1463,6 +1463,11 @@ class Tool:
elif isinstance( input, SelectToolParameter ):
input_values[ input.name ] = SelectToolParameterWrapper(
input, input_values[ input.name ], self.app, other_values = param_dict )
+
+ elif isinstance( input, LibraryDatasetToolParameter ):
+ input_values[ input.name ] = LibraryDatasetValueWrapper(
+ input, input_values[ input.name ], param_dict )
+
else:
input_values[ input.name ] = InputValueWrapper(
input, input_values[ input.name ], param_dict )
@@ -2013,6 +2018,31 @@ class RawObjectWrapper( object ):
def __getattr__( self, key ):
return getattr( self.obj, key )
+class LibraryDatasetValueWrapper( object ):
+ """
+ Wraps an input so that __str__ gives the "param_dict" representation.
+ """
+ def __init__( self, input, value, other_values={} ):
+ self.input = input
+ self.value = value
+ self._other_values = other_values
+ def __str__( self ):
+ return self.value.name
+ def templates( self ):
+ if not self.value:
+ return None
+ template_data = {}
+ for temp_info in self.value.info_association:
+ template = temp_info.template
+ content = temp_info.info.content
+ tmp_dict = {}
+ for field in template.fields:
+ tmp_dict[field['label']] = content[field['name']]
+ template_data[template.name] = tmp_dict
+ return template_data
+ def __getattr__( self, key ):
+ return getattr( self.value, key )
+
class InputValueWrapper( object ):
"""
Wraps an input so that __str__ gives the "param_dict" representation.
diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py
index 4fef3efafe0..9621646b4c6 100644
--- a/lib/galaxy/tools/parameters/basic.py
+++ b/lib/galaxy/tools/parameters/basic.py
@@ -1272,7 +1272,7 @@ class DataToolParameter( ToolParameter ):
displayed as radio buttons and multiple selects as a set of checkboxes
TODO: The following must be fixed to test correctly for the new security_check tag in the DataToolParameter ( the last test below is broken )
- Nate's next passs at the dataset security stuff will dramatically alter this anyway.
+ Nate's next pass at the dataset security stuff will dramatically alter this anyway.
"""
def __init__( self, tool, elem ):
@@ -1522,6 +1522,38 @@ class DataToolParameter( ToolParameter ):
ref = ref()
return ref
+class LibraryDatasetToolParameter( ToolParameter ):
+ """
+ Parameter that lets users select a LDDA from a modal window, then use it within the wrapper.
+ """
+
+ def __init__( self, tool, elem ):
+ ToolParameter.__init__( self, tool, elem )
+
+ def get_html_field( self, trans=None, value=None, other_values={} ):
+ return form_builder.LibraryField( self.name, value=value, trans=trans )
+
+ def get_initial_value( self, trans, context ):
+ return None
+
+ def from_html( self, value, trans, other_values={} ):
+ if not value:
+ return None
+ elif isinstance( value, trans.app.model.LibraryDatasetDatasetAssociation ):
+ return value
+ else:
+ return trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get( trans.security.decode_id( value ) )
+
+ def to_string( self, value, app ):
+ if not value:
+ return None
+ return value.id
+
+ def to_python( self, value, app ):
+ if not value:
+ return value
+ return app.model.context.query( app.model.LibraryDatasetDatasetAssociation ).get( value )
+
# class RawToolParameter( ToolParameter ):
# """
# Completely nondescript parameter, HTML representation is provided as text
@@ -1570,19 +1602,20 @@ class DataToolParameter( ToolParameter ):
# self.html = form_builder.HiddenField( self.name, trans.history.id ).get_html()
# return self.html
-parameter_types = dict( text = TextToolParameter,
- integer = IntegerToolParameter,
- float = FloatToolParameter,
- boolean = BooleanToolParameter,
- genomebuild = GenomeBuildParameter,
- select = SelectToolParameter,
- data_column = ColumnListParameter,
- hidden = HiddenToolParameter,
- baseurl = BaseURLToolParameter,
- file = FileToolParameter,
- ftpfile = FTPFileToolParameter,
- data = DataToolParameter,
- drill_down = DrillDownSelectToolParameter )
+parameter_types = dict( text = TextToolParameter,
+ integer = IntegerToolParameter,
+ float = FloatToolParameter,
+ boolean = BooleanToolParameter,
+ genomebuild = GenomeBuildParameter,
+ select = SelectToolParameter,
+ data_column = ColumnListParameter,
+ hidden = HiddenToolParameter,
+ baseurl = BaseURLToolParameter,
+ file = FileToolParameter,
+ ftpfile = FTPFileToolParameter,
+ data = DataToolParameter,
+ library_data = LibraryDatasetToolParameter,
+ drill_down = DrillDownSelectToolParameter )
class UnvalidatedValue( object ):
"""
diff --git a/lib/galaxy/web/form_builder.py b/lib/galaxy/web/form_builder.py
index fd7a6fd9ba8..b9f79e134a1 100644
--- a/lib/galaxy/web/form_builder.py
+++ b/lib/galaxy/web/form_builder.py
@@ -652,6 +652,27 @@ class HistoryField( BaseField ):
return self.value
else:
return '-'
+
+class LibraryField( BaseField ):
+ def __init__( self, name, value=None, trans=None ):
+ self.name = name
+ self.ldda = value
+ self.trans = trans
+ def get_html( self, disabled=False ):
+ if not self.ldda:
+ ldda = ""
+ text = "Choose a library dataset"
+ else:
+ ldda = self.trans.security.encode_id(self.ldda.id)
+ text = self.ldda.name
+ return '%s \
+ ' % ( text, self.name, escape( str(ldda), quote=True ) )
+
+ def get_display_text(self):
+ if self.ldda:
+ return self.ldda.name
+ else:
+ return 'None'
def get_suite():
"""Get unittest suite for this module"""
diff --git a/static/scripts/galaxy.base.js b/static/scripts/galaxy.base.js
index 447a31aeb1b..fa0fe391dd2 100644
--- a/static/scripts/galaxy.base.js
+++ b/static/scripts/galaxy.base.js
@@ -725,4 +725,5 @@ $(document).ready( function() {
}
return anchor;
});
+
});
diff --git a/static/scripts/galaxy.panels.js b/static/scripts/galaxy.panels.js
index ba02efe57d0..be187d8fb57 100644
--- a/static/scripts/galaxy.panels.js
+++ b/static/scripts/galaxy.panels.js
@@ -214,7 +214,7 @@ function show_modal( title, body, buttons, extra_buttons, init_fn ) {
init_fn();
}
};
-
+
function show_in_overlay( options ) {
var width = options.width || '600';
var height = options.height || '400';
@@ -226,9 +226,9 @@ function show_in_overlay( options ) {
show_modal( null, $( "
" ) );
$("#close_button").bind( "click", function() { hide_modal(); } );
}
-
+
// Tab management
-
+
$(function() {
$(".tab").each( function() {
var submenu = $(this).children( ".submenu" );
diff --git a/templates/base.mako b/templates/base.mako
index 998d8f75785..a58ce02430b 100644
--- a/templates/base.mako
+++ b/templates/base.mako
@@ -1,15 +1,13 @@
<% _=n_ %>
-
-
-${self.title()}
-
-${self.metas()}
-${self.stylesheets()}
-${self.javascripts()}
-
-
+
+ ${self.title()}
+
+ ${self.metas()}
+ ${self.stylesheets()}
+ ${self.javascripts()}
+
${next.body()}
diff --git a/templates/base_panels.mako b/templates/base_panels.mako
index 791535ffd91..c9c70257c22 100644
--- a/templates/base_panels.mako
+++ b/templates/base_panels.mako
@@ -155,13 +155,13 @@
## Override
%def>
-<%def name="overlay( title='', content='' )">
+<%def name="overlay( title='', content='', visible=False )">
<%def name="title()">%def>
<%def name="content()">%def>
##
@@ -169,21 +169,21 @@
## Need a table here for centering in IE6
-
-
${content}
-
+
+
${content}
+
@@ -198,45 +198,45 @@
${self.init()}
-
${self.title()}
-
-
- ${self.stylesheets()}
- ${self.javascripts()}
+
${self.title()}
+
+
+ ${self.stylesheets()}
+ ${self.javascripts()}
-
- ## Background displays first
-
- ## Layer iframes over backgrounds
-
- ${self.masthead()}
-
-
- %if self.message_box_visible:
- ${self.message_box_content()}
+
+ ## Background displays first
+
+ ## Layer iframes over backgrounds
+
+ ${self.masthead()}
+
+
+ %if self.message_box_visible:
+ ${self.message_box_content()}
+ %endif
+
+ ${self.overlay(visible=self.overlay_visible)}
+ %if self.has_left_panel:
+
+ ${self.left_panel()}
+
+
+ %endif
+
+ ${self.center_panel()}
+
+ %if self.has_right_panel:
+
+
+ ${self.right_panel()}
+
%endif
- ${self.overlay()}
- %if self.has_left_panel:
-
- ${self.left_panel()}
-
-
- %endif
-
- ${self.center_panel()}
-
- %if self.has_right_panel:
-
-
- ${self.right_panel()}
-
- %endif
-
## Allow other body level elements
## Scripts can be loaded later since they progressively add features to
diff --git a/templates/root/index.mako b/templates/root/index.mako
index 23779ed134a..8cbd99b103a 100644
--- a/templates/root/index.mako
+++ b/templates/root/index.mako
@@ -174,14 +174,14 @@
<%def name="init()">
<%
- if trans.app.config.cloud_controller_instance:
- self.has_left_panel=False
- self.has_right_panel=False
- self.active_view="cloud"
- else:
- self.has_left_panel=True
- self.has_right_panel=True
- self.active_view="analysis"
+ if trans.app.config.cloud_controller_instance:
+ self.has_left_panel=False
+ self.has_right_panel=False
+ self.active_view="cloud"
+ else:
+ self.has_left_panel=True
+ self.has_right_panel=True
+ self.active_view="analysis"
%>
%if trans.app.config.require_login and not trans.user:
-
+
-
- <%def name="do_inputs( inputs, tool_state, errors, prefix, other_values=None )">
- <% other_values = ExpressionContext( tool_state, other_values ) %>
- %for input_index, input in enumerate( inputs.itervalues() ):
- %if not input.visible:
- <% pass %>
- %elif input.type == "repeat":
-
-
${input.title_plural}
- <% repeat_state = tool_state[input.name] %>
- %for i in range( len( repeat_state ) ):
-
- <%
- if input.name in errors:
- rep_errors = errors[input.name][i]
- else:
- rep_errors = dict()
- index = repeat_state[i]['__index__']
- %>
-
${input.title} ${i + 1}
- ${do_inputs( input.inputs, repeat_state[i], rep_errors, prefix + input.name + "_" + str(index) + "|", other_values )}
-
-
- %if rep_errors.has_key( '__index__' ):
-
${rep_errors['__index__']}
- %endif
- %endfor
-
-
- %elif input.type == "conditional":
- <%
- group_state = tool_state[input.name]
- group_errors = errors.get( input.name, {} )
- current_case = group_state['__current_case__']
- group_prefix = prefix + input.name + "|"
- %>
- %if input.value_ref_in_group:
- ${row_for_param( group_prefix, input.test_param, group_state, group_errors, other_values )}
- %endif
- ${do_inputs( input.cases[current_case].inputs, group_state, group_errors, group_prefix, other_values )}
- %elif input.type == "upload_dataset":
- %if input.get_datatype( trans, other_values ).composite_type is None: #have non-composite upload appear as before
+%def>
+
+<%def name="do_inputs( inputs, tool_state, errors, prefix, other_values=None )">
+ <%
+ from galaxy.util.expressions import ExpressionContext
+ other_values = ExpressionContext( tool_state, other_values )
+ %>
+ %for input_index, input in enumerate( inputs.itervalues() ):
+ %if not input.visible:
+ <% pass %>
+ %elif input.type == "repeat":
+
+
${input.title_plural}
+ <% repeat_state = tool_state[input.name] %>
+ %for i in range( len( repeat_state ) ):
+
<%
if input.name in errors:
- rep_errors = errors[input.name][0]
+ rep_errors = errors[input.name][i]
else:
rep_errors = dict()
+ index = repeat_state[i]['__index__']
%>
- ${do_inputs( input.inputs, tool_state[input.name][0], rep_errors, prefix + input.name + "_" + str( 0 ) + "|", other_values )}
- %else:
-
-
${input.group_title( other_values )}
- <%
- repeat_state = tool_state[input.name]
- %>
- %for i in range( len( repeat_state ) ):
-
- <%
- if input.name in errors:
- rep_errors = errors[input.name][i]
- else:
- rep_errors = dict()
- index = repeat_state[i]['__index__']
- %>
-
File Contents for ${input.title_by_index( trans, i, other_values )}
- ${do_inputs( input.inputs, repeat_state[i], rep_errors, prefix + input.name + "_" + str(index) + "|", other_values )}
- ##
-
- %endfor
- ##
-
+
${input.title} ${i + 1}
+ ${do_inputs( input.inputs, repeat_state[i], rep_errors, prefix + input.name + "_" + str(index) + "|", other_values )}
+
+
+ %if rep_errors.has_key( '__index__' ):
+
${rep_errors['__index__']}
%endif
+ %endfor
+
+
+ %elif input.type == "conditional":
+ <%
+ group_state = tool_state[input.name]
+ group_errors = errors.get( input.name, {} )
+ current_case = group_state['__current_case__']
+ group_prefix = prefix + input.name + "|"
+ %>
+ %if input.value_ref_in_group:
+ ${row_for_param( group_prefix, input.test_param, group_state, group_errors, other_values )}
+ %endif
+ ${do_inputs( input.cases[current_case].inputs, group_state, group_errors, group_prefix, other_values )}
+ %elif input.type == "upload_dataset":
+ %if input.get_datatype( trans, other_values ).composite_type is None: #have non-composite upload appear as before
+ <%
+ if input.name in errors:
+ rep_errors = errors[input.name][0]
+ else:
+ rep_errors = dict()
+ %>
+ ${do_inputs( input.inputs, tool_state[input.name][0], rep_errors, prefix + input.name + "_" + str( 0 ) + "|", other_values )}
%else:
- ${row_for_param( prefix, input, tool_state, errors, other_values )}
- %endif
- %endfor
- %def>
-
- <%def name="row_for_param( prefix, param, parent_state, parent_errors, other_values )">
- <%
- if parent_errors.has_key( param.name ):
- cls = "form-row form-row-error"
- else:
- cls = "form-row"
-
- label = param.get_label()
-
- field = param.get_html_field( trans, parent_state[ param.name ], other_values )
- field.refresh_on_change = param.refresh_on_change
-
- # Field may contain characters submitted by user and these characters may be unicode; handle non-ascii characters gracefully.
- field_html = field.get_html( prefix )
- if type( field_html ) is not unicode:
- field_html = unicode( field_html, 'utf-8' )
-
- if param.type == "hidden":
- return field_html
- %>
-
- %if label:
-
${label}:
- %endif
-
${field_html}
- %if parent_errors.has_key( param.name ):
-
- %def>
-
- %if add_frame.from_noframe:
-
+ %else:
+ ${row_for_param( prefix, input, tool_state, errors, other_values )}
+ %endif
+ %endfor
+%def>
+
+<%def name="row_for_param( prefix, param, parent_state, parent_errors, other_values )">
+ <%
+ if parent_errors.has_key( param.name ):
+ cls = "form-row form-row-error"
+ else:
+ cls = "form-row"
+
+ label = param.get_label()
+
+ field = param.get_html_field( trans, parent_state[ param.name ], other_values )
+ field.refresh_on_change = param.refresh_on_change
+
+ # Field may contain characters submitted by user and these characters may be unicode; handle non-ascii characters gracefully.
+ field_html = field.get_html( prefix )
+ if type( field_html ) is not unicode:
+ field_html = unicode( field_html, 'utf-8' )
+
+ if param.type == "hidden":
+ return field_html
+ %>
+
+ %if label:
+
${label}:
+ %endif
+
${field_html}
+ %if parent_errors.has_key( param.name ):
+
+ %endif
+
+ %if param.help:
+
+ ${param.help}
+
+ %endif
+
+
+
+
+%def>
+
+<% overlay(visible=False) %>
+
+%if add_frame.from_noframe:
+
Welcome to Galaxy
It appears that you found this tool from a link outside of Galaxy.
@@ -205,60 +232,59 @@ $(function() {
welcome page .
To learn more about what Galaxy is and what it can do for you, please visit
the
Galaxy wiki .
-
-
+
+
+%endif
+
+## handle calculating the redict url for the special case where we have nginx proxy
+## upload and need to do url_for on the redirect portion of the tool action
+<%
+ try:
+ tool_url = h.url_for(tool.action)
+ except AttributeError:
+ assert len(tool.action) == 2
+ tool_url = tool.action[0] + h.url_for(tool.action[1])
+%>
+