diff --git a/lib/galaxy/forms/forms.py b/lib/galaxy/forms/forms.py index 18e0428e2b5..ffe0595b820 100644 --- a/lib/galaxy/forms/forms.py +++ b/lib/galaxy/forms/forms.py @@ -62,13 +62,17 @@ class FormDefinitionFieldFactory( object ): type = None def __get_stored_field_type( self, **kwds ): raise 'not implemented' - def new( self, label=None, required=False, helptext=None, default=None, visible=True, layout=None ): + def new( self, name=None, label=None, required=False, helptext=None, default=None, visible=True, layout=None ): """ Return new FormDefinition field. """ rval = {} - assert label, 'Must provide a name / label' - rval['label'] = label + assert name, 'Must provide a name' + rval['name'] = name + if not label: + rval['label'] = name + else: + rval['label'] = label if required: rval['required'] = 'required' else: @@ -88,7 +92,8 @@ class FormDefinitionFieldFactory( object ): """ Return FormDefinition created from an xml element. """ - label = elem.get( 'name' ) + name = elem.get( 'name' ) + label = elem.get( 'label' ) required = string_as_bool( elem.get( 'required', 'false' ) ) default = elem.get( 'value' ) helptext = elem.get( 'helptext' ) @@ -97,7 +102,7 @@ class FormDefinitionFieldFactory( object ): if field_layout: assert layout and field_layout in layout, 'Invalid layout specified: %s not in %s' %( field_layout, layout ) field_layout = str( layout.index( field_layout ) ) #existing behavior: integer indexes are stored as strings. why? - return self.new( label=label, required=required, helptext=helptext, default=default, visible=visible, layout=field_layout ) + return self.new( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=field_layout ) class FormDefinitionTextFieldFactory( FormDefinitionFieldFactory ): type = 'text' @@ -106,11 +111,11 @@ class FormDefinitionTextFieldFactory( FormDefinitionFieldFactory ): return 'TextArea' else: return 'TextField' - def new( self, label=None, required=False, helptext=None, default=None, visible=True, layout=None, area=False ): + def new( self, name=None, label=None, required=False, helptext=None, default=None, visible=True, layout=None, area=False ): """ Return new FormDefinition field. """ - rval = super( FormDefinitionTextFieldFactory, self ).new( label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) + rval = super( FormDefinitionTextFieldFactory, self ).new( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) rval['type'] = self.__get_stored_field_type( area ) return rval def from_elem( self, elem, layout=None ): @@ -125,11 +130,11 @@ class FormDefinitionAddressFieldFactory( FormDefinitionFieldFactory ): type = 'address' def __get_stored_field_type( self ): return 'AddressField' - def new( self, label=None, required=False, helptext=None, default=None, visible=True, layout=None ): + def new( self, name=None, label=None, required=False, helptext=None, default=None, visible=True, layout=None ): """ Return new FormDefinition field. """ - rval = super( FormDefinitionAddressFieldFactory, self ).new( label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) + rval = super( FormDefinitionAddressFieldFactory, self ).new( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval def from_elem( self, elem, layout=None ): @@ -144,11 +149,11 @@ class FormDefinitionWorkflowFieldFactory( FormDefinitionFieldFactory ): type = 'workflow' def __get_stored_field_type( self ): return 'WorkflowField' - def new( self, label=None, required=False, helptext=None, default=None, visible=True, layout=None ): + def new( self, name=None, label=None, required=False, helptext=None, default=None, visible=True, layout=None ): """ Return new FormDefinition field. """ - rval = super( FormDefinitionWorkflowFieldFactory, self ).new( label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) + rval = super( FormDefinitionWorkflowFieldFactory, self ).new( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval def from_elem( self, elem, layout=None ): @@ -167,7 +172,7 @@ class FormDefinitionHistoryFieldFactory( FormDefinitionFieldFactory ): """ Return new FormDefinition field. """ - rval = super( FormDefinitionHistoryFieldFactory, self ).new( label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) + rval = super( FormDefinitionHistoryFieldFactory, self ).new( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval def from_elem( self, elem, layout=None ): @@ -185,11 +190,11 @@ class FormDefinitionSelectFieldFactory( FormDefinitionFieldFactory ): return 'CheckboxField' else: return 'SelectField' - def new( self, label=None, required=False, helptext=None, default=None, visible=True, layout=None, options=[], checkboxes=False ): + def new( self, name=None, label=None, required=False, helptext=None, default=None, visible=True, layout=None, options=[], checkboxes=False ): """ Return new FormDefinition field. """ - rval = super( FormDefinitionSelectFieldFactory, self ).new( label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) + rval = super( FormDefinitionSelectFieldFactory, self ).new( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) rval['type'] = self.__get_stored_field_type( checkboxes ) if options is None: options = [] diff --git a/lib/galaxy/model/migrate/versions/0065_add_name_to_form_fields_and_values.py b/lib/galaxy/model/migrate/versions/0065_add_name_to_form_fields_and_values.py new file mode 100644 index 00000000000..9e0a291f31a --- /dev/null +++ b/lib/galaxy/model/migrate/versions/0065_add_name_to_form_fields_and_values.py @@ -0,0 +1,119 @@ +""" +Migration script to add 'name' attribute to the JSON dict which describes +a form definition field and the form values in the database. In the 'form_values' +table, the 'content' column is now a JSON dict instead of a list. +""" + +from sqlalchemy import * +from sqlalchemy.orm import * +from migrate import * +from migrate.changeset import * +from sqlalchemy.exc import * +from galaxy.util.json import from_json_string, to_json_string + +import datetime +now = datetime.datetime.utcnow + +import logging +log = logging.getLogger( __name__ ) + +metadata = MetaData( migrate_engine ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) + +def upgrade(): + print __doc__ + metadata.reflect() + try: + FormDefinition_table = Table( "form_definition", metadata, autoload=True ) + except Exception, e: + log.debug( "Loading 'form_definition' table failed: %s" % str( e ) ) + try: + FormValues_table = Table( "form_values", metadata, autoload=True ) + except Exception, e: + log.debug( "Loading 'form_values' table failed: %s" % str( e ) ) + # Go through the entire table and add a 'name' attribute for each field + # in the list of fields for each form definition + cmd = "SELECT id, fields FROM form_definition" + result = db_session.execute( cmd ) + for row in result: + form_definition_id = row[0] + fields = str( row[1] ) + if not fields.strip(): + continue + fields_list = from_json_string( fields ) + if len( fields_list ): + for index, field in enumerate( fields_list ): + field[ 'name' ] = 'field_%i' % index + cmd = "UPDATE form_definition SET fields='%s' WHERE id=%i" %( to_json_string( fields_list ), form_definition_id ) + db_session.execute( cmd ) + # replace the values list in the content field of the form_values table with a name:value dict + cmd = "SELECT form_values.id, form_values.content, form_definition.fields" \ + " FROM form_values, form_definition" \ + " WHERE form_values.form_definition_id=form_definition.id" \ + " ORDER BY form_values.id ASC" + result = db_session.execute( cmd ) + for row in result: + form_values_id = int( row[0] ) + if not str( row[1] ).strip(): + continue + values_list = from_json_string( str( row[1] ) ) + if not str( row[2] ).strip(): + continue + fields_list = from_json_string( str( row[2] ) ) + if fields_list: + values_dict = {} + for field_index, field in enumerate( fields_list ): + field_name = field[ 'name' ] + values_dict[ field_name ] = values_list[ field_index ] + cmd = "UPDATE form_values SET content='%s' WHERE id=%i" %( to_json_string( values_dict ), form_values_id ) + db_session.execute( cmd ) + +def downgrade(): + metadata.reflect() + try: + FormDefinition_table = Table( "form_definition", metadata, autoload=True ) + except Exception, e: + log.debug( "Loading 'form_definition' table failed: %s" % str( e ) ) + try: + FormValues_table = Table( "form_values", metadata, autoload=True ) + except Exception, e: + log.debug( "Loading 'form_values' table failed: %s" % str( e ) ) + # remove the name attribute in the content column JSON dict in the form_values table + # and restore it to a list of values + cmd = "SELECT form_values.id, form_values.content, form_definition.fields" \ + " FROM form_values, form_definition" \ + " WHERE form_values.form_definition_id=form_definition.id" \ + " ORDER BY form_values.id ASC" + result = db_session.execute( cmd ) + for row in result: + form_values_id = int( row[0] ) + if not str( row[1] ).strip(): + continue + values_dict = from_json_string( str( row[1] ) ) + if not str( row[2] ).strip(): + continue + fields_list = from_json_string( str( row[2] ) ) + if fields_list: + values_list = [] + for field_index, field in enumerate( fields_list ): + field_name = field[ 'name' ] + field_value = values_dict[ field_name ] + values_list.append( field_value ) + cmd = "UPDATE form_values SET content='%s' WHERE id=%i" %( to_json_string( values_list ), form_values_id ) + db_session.execute( cmd ) + # remove name attribute from the field column of the form_definition table + cmd = "SELECT id, fields FROM form_definition" + result = db_session.execute( cmd ) + for row in result: + form_definition_id = row[0] + fields = str( row[1] ) + if not fields.strip(): + continue + fields_list = from_json_string( fields ) + if len( fields_list ): + for index, field in enumerate( fields_list ): + if field.has_key( 'name' ): + del field[ 'name' ] + cmd = "UPDATE form_definition SET fields='%s' WHERE id=%i" %( to_json_string( fields_list ), form_definition_id ) + db_session.execute( cmd ) + diff --git a/lib/galaxy/web/controllers/forms.py b/lib/galaxy/web/controllers/forms.py index b220081d7d2..d3e84b8fc5c 100644 --- a/lib/galaxy/web/controllers/forms.py +++ b/lib/galaxy/web/controllers/forms.py @@ -12,6 +12,8 @@ from galaxy.web.framework.helpers import time_ago, iff, grids log = logging.getLogger( __name__ ) +VALID_FIELDNAME_RE = re.compile( "^[a-zA-Z0-9\_]+$" ) + class FormsGrid( grids.Grid ): # Custom column types class NameColumn( grids.TextColumn ): @@ -66,7 +68,8 @@ class FormsGrid( grids.Grid ): class Forms( BaseController ): # Empty TextField - empty_field = { 'label': '', + empty_field = { 'name': '', + 'label': '', 'helptext': '', 'visible': True, 'required': False, @@ -199,7 +202,9 @@ class Forms( BaseController ): del current_form[ 'layout' ][index] # Add a field elif params.get( 'add_field_button', False ): - self.empty_field[ 'label' ] = 'Field_%i' % ( len( current_form[ 'fields' ] ) + 1 ) + field_index = len( current_form[ 'fields' ] ) + 1 + self.empty_field[ 'name' ] = '%i_field_name' % field_index + self.empty_field[ 'label' ] = 'Field label %i' % field_index current_form[ 'fields' ].append( self.empty_field ) # Delete a field elif params.get( 'remove_button', False ): @@ -267,7 +272,7 @@ class Forms( BaseController ): # get the user entered fields index = 0 while True: - if kwd.has_key( 'field_name_%i' % index ): + if kwd.has_key( 'field_label_%i' % index ): fields.append( self.__get_field( index, **kwd ) ) index = index + 1 else: @@ -290,9 +295,16 @@ class Forms( BaseController ): return None, message current_form = self.get_current_form( trans, **kwd ) # validate fields + field_names_dict = {} for field in current_form[ 'fields' ]: if not field[ 'label' ]: return None, "All the field labels must be completed." + if not VALID_FIELDNAME_RE.match( field[ 'name' ] ): + return None, "'%s' is not a valid field name." % field[ 'name' ] + if field_names_dict.has_key( field[ 'name' ] ): + return None, "Each field name must be unique in the form definition. '%s' is not unique." % field[ 'name' ] + else: + field_names_dict[ field[ 'name' ] ] = 1 # create a new form definition form_definition = trans.app.model.FormDefinition( name=current_form[ 'name' ], desc=current_form[ 'desc' ], @@ -392,8 +404,8 @@ class Forms( BaseController ): This method returns a list of widgets which describes a form definition field. This includes the field label, helptext, type, selectfield options, required/optional & layout ''' - # field name - name = TextField( 'field_name_'+str( field_index ), 40, field['label'] ) + # field label + label = TextField( 'field_label_'+str( field_index ), 40, field['label'] ) # help text helptext = TextField( 'field_helptext_'+str( field_index ), 40, field['helptext'] ) # field type @@ -449,18 +461,23 @@ class Forms( BaseController ): default_value = TextField( 'field_default_'+str(field_index), 40, field.get( 'default', '' ) ) + # field name + name = TextField( 'field_name_'+str( field_index ), 40, field['name'] ) + name_helptext = "The field name needs to be unique for each field. It should only contain alphanumeric characters and underscore ('_'). (Required)" if layout_grids and form_type == trans.model.FormDefinition.types.SAMPLE: - return [ ( 'Field label', name ), + return [ ( 'Field label', label ), ( 'Help text', helptext ), - ( 'Type', field_type_select_field, field_type_options ), + ( 'Type', field_type_select_field, "Add options below", field_type_options ), ( 'Default value', default_value ), ( '', required ), - ( 'Select the grid layout to place this field', layout_select_field ) ] - return [ ( 'Field label', name ), + ( 'Select the grid layout to place this field', layout_select_field ), + ( 'Field name', name, name_helptext ) ] + return [ ( 'Field label', label ), ( 'Help text', helptext ), - ( 'Type', field_type_select_field, field_type_options), + ( 'Type', field_type_select_field, "Add options below", field_type_options), ( 'Default value', default_value ), - ( '', required) ] + ( '', required), + ( 'Field name', name, name_helptext ) ] def __build_field_type_select_field_options( self, field, field_index ): ''' Returns a list of TextFields, one for each select field option @@ -537,15 +554,19 @@ class Forms( BaseController ): returns a dict. ''' params = util.Params( kwd ) + label = util.restore_text( params.get( 'field_label_%i' % index, '' ) ) name = util.restore_text( params.get( 'field_name_%i' % index, '' ) ) helptext = util.restore_text( params.get( 'field_helptext_%i' % index, '' ) ) required = params.get( 'field_required_%i' % index, False ) field_type = util.restore_text( params.get( 'field_type_%i' % index, '' ) ) layout = params.get( 'field_layout_%i' % index, '' ) default = util.restore_text( params.get( 'field_default_%i' % index, '' ) ) + if not name.strip(): + name = '%i_field_name' % index if field_type == 'SelectField': options = self.__get_select_field_options(index, **kwd) - return { 'label': name, + return { 'name': name, + 'label': label, 'helptext': helptext, 'visible': True, 'required': required, @@ -553,7 +574,8 @@ class Forms( BaseController ): 'selectlist': options, 'layout': layout, 'default': default } - return { 'label': name, + return { 'name': name, + 'label': label, 'helptext': helptext, 'visible': True, 'required': required, @@ -570,12 +592,14 @@ class Forms( BaseController ): layouts = set() try: reader = csv.reader(csv_file.file) + index = 1 for row in reader: if len(row) < 7: # ignore bogus rows continue options = row[5].split(',') if len(row) >= 8: - fields.append( { 'label': row[0], + fields.append( { 'name': '%i_field_name' % index, + 'label': row[0], 'helptext': row[1], 'visible': row[2], 'required': row[3], @@ -585,13 +609,15 @@ class Forms( BaseController ): 'default': row[7] } ) layouts.add(row[6]) else: - fields.append( { 'label': row[0], + fields.append( { 'name': '%i_field_name' % index, + 'label': row[0], 'helptext': row[1], 'visible': row[2], 'required': row[3], 'type': row[4], 'selectlist': options, 'default': row[6] } ) + index = index + 1 except: return trans.response.send_redirect( web.url_for( controller='forms', action='create_form', @@ -611,7 +637,7 @@ class Forms( BaseController ): return None, 'Form name must be filled.' # form type if util.restore_text( params.form_type_select_field ) == 'none': - return None, 'Form type must be selected.' + return None, 'Form type must be selected.' return True, '' def __build_form_types_widget( self, trans, selected='none' ): form_type_select_field = SelectField( 'form_type_select_field' ) diff --git a/lib/galaxy/web/controllers/requests_common.py b/lib/galaxy/web/controllers/requests_common.py index eb51f1e7c0e..10e66b020e8 100644 --- a/lib/galaxy/web/controllers/requests_common.py +++ b/lib/galaxy/web/controllers/requests_common.py @@ -309,26 +309,28 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): name = util.restore_text( params.get( 'name', '' ) ) desc = util.restore_text( params.get( 'desc', '' ) ) notification = dict( email=[ user.email ], sample_states=[ request_type.final_sample_state.id ], body='', subject='' ) - values = [] + values = {} for index, field in enumerate( request_type.request_form.fields ): field_type = field[ 'type' ] - field_value = params.get( 'field_%i' % index, '' ) + field_name = field[ 'name' ] + input_value = params.get( 'field_%i' % index, '' ) if field[ 'type' ] == 'AddressField': - value = util.restore_text( field_value ) - if value == 'new': + input_text_value = util.restore_text( input_value ) + if input_text_value == 'new': # Save this new address in the list of this user's addresses user_address = trans.model.UserAddress( user=user ) self.save_widget_field( trans, user_address, index, **kwd ) trans.sa_session.refresh( user ) - values.append( int( user_address.id ) ) - elif value in [ '', 'none', 'None', None ]: - values.append( '' ) + field_value = int( user_address.id ) + elif input_text_value in [ '', 'none', 'None', None ]: + field_value = '' else: - values.append( int( value ) ) + field_value = int( input_text_value ) elif field[ 'type' ] == 'CheckboxField': - values.append( CheckboxField.is_checked( field_value )) + field_value = CheckboxField.is_checked( input_value ) else: - values.append( util.restore_text( field_value ) ) + field_value = util.restore_text( input_value ) + values[ field_name ] = field_value form_values = trans.model.FormValues( request_type.request_form, values ) trans.sa_session.add( form_values ) trans.sa_session.flush() @@ -844,7 +846,9 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): library_id = None folder_id = None name = 'Sample_%i' % ( len( displayable_sample_widgets ) + 1 ) - field_values = [ '' for field in request.type.sample_form.fields ] + field_values = {} + for field in request.type.sample_form.fields: + field_values[ field['name'] ] = '' # Build the library_select_field and folder_select_field for the new sample being added. library_select_field, folder_select_field = self.__build_library_and_folder_select_fields( trans, user=request.user, @@ -1270,14 +1274,15 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): # The request_widgets list is a list of dictionaries request_widgets = [] for index, field in enumerate( request.type.request_form.fields ): + field_value = request.values.content[ field['name'] ] if field[ 'required' ]: required_label = 'Required' else: required_label = 'Optional' if field[ 'type' ] == 'AddressField': - if request.values.content[ index ]: + if field_value: request_widgets.append( dict( label=field[ 'label' ], - value=trans.sa_session.query( trans.model.UserAddress ).get( int( request.values.content[ index ] ) ).get_html(), + value=trans.sa_session.query( trans.model.UserAddress ).get( int( field_value ) ).get_html(), helptext=field[ 'helptext' ] + ' (' + required_label + ')' ) ) else: request_widgets.append( dict( label=field[ 'label' ], @@ -1285,7 +1290,7 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): helptext=field[ 'helptext' ] + ' (' + required_label + ')' ) ) else: request_widgets.append( dict( label=field[ 'label' ], - value=request.values.content[ index ], + value=field_value, helptext=field[ 'helptext' ] + ' (' + required_label + ')' ) ) return request_widgets def __get_sample_widgets( self, trans, request, samples, **kwd ): @@ -1335,10 +1340,11 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): if not folder_id and sample.folder: folder_id = trans.security.encode_id( sample.folder.id ) library, folder = self.__get_library_and_folder( trans, library_id, folder_id ) - field_values = [] - for field_index in range( len( request.type.sample_form.fields ) ): - field_value = util.restore_text( params.get( 'sample_%i_field_%i' % ( index, field_index ), sample.values.content[ field_index ] ) ) - field_values.append( field_value ) + field_values = {} + for field_index, field in enumerate( request.type.sample_form.fields ): + field_name = field['name'] + field_value = util.restore_text( params.get( 'sample_%i_field_%i' % ( index, field_index ), sample.values.content[ field_name ] ) ) + field_values[ field_name ] = field_value library_select_field, folder_select_field = self.__build_library_and_folder_select_fields( trans=trans, user=request.user, sample_index=index, @@ -1366,9 +1372,10 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): library_id = util.restore_text( params.get( 'sample_%i_library_id' % index, '' ) ) folder_id = util.restore_text( params.get( 'sample_%i_folder_id' % index, '' ) ) library, folder = self.__get_library_and_folder( trans, library_id, folder_id ) - field_values = [] - for field_index in range( len( request.type.sample_form.fields ) ): - field_values.append( util.restore_text( params.get( 'sample_%i_field_%i' % ( index, field_index ), '' ) ) ) + field_values = {} + for field_index, field in enumerate( request.type.sample_form.fields ): + field_name = field['name'] + field_values[ field_name ] = util.restore_text( params.get( 'sample_%i_field_%i' % ( index, field_index ), '' ) ) library_select_field, folder_select_field = self.__build_library_and_folder_select_fields( trans=trans, user=request.user, sample_index=index, @@ -1499,7 +1506,7 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): empty_fields = [] # Make sure required form fields are filled in. for index, field in enumerate( request.type.request_form.fields ): - if field[ 'required' ] == 'required' and request.values.content[ index ] in [ '', None ]: + if field[ 'required' ] == 'required' and request.values.content[ field[ 'name' ] ] in [ '', None ]: empty_fields.append( field[ 'label' ] ) if empty_fields: message = 'Complete the following fields of the request before submitting: ' diff --git a/scripts/api/sample_configurations/sample_tracking/request_form.xml b/scripts/api/sample_configurations/sample_tracking/request_form.xml index fef59ba3d6c..a22c20acd73 100644 --- a/scripts/api/sample_configurations/sample_tracking/request_form.xml +++ b/scripts/api/sample_configurations/sample_tracking/request_form.xml @@ -1,15 +1,15 @@
- - - + + + - + - +
\ No newline at end of file diff --git a/templates/admin/forms/edit_form_definition.mako b/templates/admin/forms/edit_form_definition.mako index 265d75c6617..f87dc28069d 100644 --- a/templates/admin/forms/edit_form_definition.mako +++ b/templates/admin/forms/edit_form_definition.mako @@ -23,7 +23,7 @@ $(document).ready(function(){ <%def name="render_selectbox_options( index, field_attr )"> %if field_attr[0] == 'Type': %if field_attr[1].get_selected( return_label=True ) == 'SelectField': - <% options = field_attr[2] %> + <% options = field_attr[3] %>
@@ -61,6 +61,11 @@ $(document).ready(function(){ ${field_attr[1].get_html()} ${render_selectbox_options( index, field_attr )} + %if len(field_attr) == 3: +
+ ${field_attr[2]} +
+ %endif
%endfor
diff --git a/templates/requests/common/common.mako b/templates/requests/common/common.mako index 1a51994d8aa..889a59a0094 100644 --- a/templates/requests/common/common.mako +++ b/templates/requests/common/common.mako @@ -474,28 +474,32 @@ ${sample_name} %for field_index, field in fields_dict.items(): - <% field_type = field[ 'type' ] %> + <% + field_type = field[ 'type' ] + field_name = field[ 'name' ] + field_value = sample_values[ field_name ] + %> %if display_only: - %if sample_values[field_index]: + %if field_value: %if field_type == 'WorkflowField': - %if str(sample_values[field_index]) != 'none': - <% workflow = trans.sa_session.query( trans.app.model.StoredWorkflow ).get( int( sample_values[ field_index ] ) ) %> + %if str( field_value ) != 'none': + <% workflow = trans.sa_session.query( trans.app.model.StoredWorkflow ).get( int( field_value ) ) %> ${workflow.name} %endif %else: - ${sample_values[ field_index ]} + ${field_value} %endif %else: None %endif %else: %if field_type == 'TextField': - + %elif field_type == 'SelectField': %elif field_type == 'WorkflowField': %elif field_type == 'HistoryField':