diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index c5dffc4d54f..327f2aaaf1e 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -1090,11 +1090,12 @@ class FormDefinition( object ): types = Bunch( REQUEST = 'Sequencing Request Form', SAMPLE = 'Sequencing Sample Form', LIBRARY_INFO_TEMPLATE = 'Library information template' ) - def __init__(self, name=None, desc=None, fields=[], current_form=None, form_type=None, layout=None): + def __init__(self, name=None, desc=None, fields=[], + form_definition_current=None, form_type=None, layout=None): self.name = name self.desc = desc self.fields = fields - self.form_definition_current = current_form + self.form_definition_current = form_definition_current self.type = form_type self.layout = layout def fields_of_grid(self, layout_grid_name): @@ -1263,20 +1264,26 @@ class UserAddress( object ): self.postal_code = postal_code self.country = country self.phone = phone - def display(self): - return self.name+'
'+ \ - self.institution+'
'+ \ - self.address+'
'+ \ - self.city+' '+self.state+' '+self.postal_code+'
'+ \ - self.country+'
'+ \ - 'Phone: '+self.phone def get_html(self): - return self.name+'
'+ \ - self.institution+'
'+ \ - self.address+'
'+ \ - self.city+' '+self.state+' '+self.postal_code+'
'+ \ - self.country+'
'+ \ - 'Phone: '+self.phone + html = '' + if self.name: + html = html + self.name + if self.institution: + html = html + '
' + self.institution + if self.address: + html = html + '
' + self.address + if self.city: + html = html + '
' + self.city + if self.state: + html = html + ' ' + self.state + if self.postal_code: + html = html + ' ' + self.postal_code + if self.country: + html = html + '
' + self.country + if self.phone: + html = html + '
' + 'Phone: ' + self.phone + return html + class Page( object ): def __init__( self ): diff --git a/lib/galaxy/web/controllers/forms.py b/lib/galaxy/web/controllers/forms.py index 45d8e5ad575..acccb6027d0 100644 --- a/lib/galaxy/web/controllers/forms.py +++ b/lib/galaxy/web/controllers/forms.py @@ -12,6 +12,14 @@ import copy log = logging.getLogger( __name__ ) class Forms( BaseController ): + # Empty form field + empty_field = { 'label': '', + 'helptext': '', + 'visible': True, + 'required': False, + 'type': BaseField.form_field_types()[0], + 'selectlist': [], + 'layout': 'none' } @web.expose @web.require_admin def index( self, trans, **kwd ): @@ -84,19 +92,12 @@ class Forms( BaseController ): action='edit', form_id=fd.id, add_field_button='Add field', - num_fields=0, name=fd.name, description=fd.desc, form_type_selectbox=fd.type ) ) - self.current_form = {} - self.current_form[ 'name' ] = 'New Form' - self.current_form[ 'desc' ] = '' - self.current_form[ 'type' ] = params.get( 'form_type', 'none' ) - self.current_form[ 'layout' ] = [ 'Main' ] - self.current_form[ 'fields' ] = [] - inputs = [ ( 'Name', TextField( 'name', 40, self.current_form[ 'name' ] ) ), - ( 'Description', TextField( 'description', 40, self.current_form[ 'desc' ] ) ), - ( 'Type', self.__form_types_widget(trans, selected=self.current_form['type']) ), + inputs = [ ( 'Name', TextField( 'name', 40, 'New Form' ) ), + ( 'Description', TextField( 'description', 40, '' ) ), + ( 'Type', self.__form_types_widget(trans, selected=params.get( 'form_type', 'none' )) ), ( 'Import from csv file (Optional)', FileField( 'file_data', 40, '' ) ) ] return trans.fill_template( '/admin/forms/create_form.mako', inputs=inputs, @@ -134,102 +135,156 @@ class Forms( BaseController ): renaming fields, adding/deleting fields, changing fields attributes. ''' params = util.Params( kwd ) + log.debug( kwd ) msg = util.restore_text( params.get( 'msg', '' ) ) messagetype = params.get( 'messagetype', 'done' ) - form_id = params.get( 'form_id', None ) - if not form_id: - msg = 'Invalid form id %s' % str( form_id ) - trans.response.send_redirect( web.url_for( controller='forms', - action='manage', - msg=msg, - messagetype='error' ) ) - fd = trans.app.model.FormDefinition.get( int( params.form_id ) ) + try: + fd = trans.app.model.FormDefinition.get( int( params.get( 'form_id', None ) ) ) + except: + return trans.response.send_redirect( web.url_for( controller='forms', + action='manage', + msg='Invalid form', + messagetype='error' ) ) + # # Show the form for editing + # if params.get( 'show_form', False ): - self.__get_saved_form( fd ) - # The following two dicts store the unsaved select box options - self.del_options = {} - self.add_options = {} - return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd ) - #Add a layout grid + current_form = self.__get_saved_form( fd ) + return self.__show( trans=trans, form=fd, current_form=current_form, + msg=msg, messagetype=messagetype, **kwd ) + # + # Add a layout grid + # elif params.get( 'add_layout_grid', False ): - self.__update_current_form( trans, **kwd ) - self.__add_layout_grid() + current_form = self.__get_form( trans, **kwd ) + current_form['layout'].append('') # show the form again - return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd ) + return self.__show( trans=trans, form=fd, current_form=current_form, + msg=msg, messagetype=messagetype, **kwd ) + # # Delete a layout grid + # elif params.get( 'remove_layout_grid_button', False ): - self.__update_current_form( trans, **kwd ) + current_form = self.__get_form( trans, **kwd ) index = int( kwd[ 'remove_layout_grid_button' ].split( ' ' )[2] ) - 1 - self.__remove_layout_grid( index ) - return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd ) - # Delete a field - elif params.get( 'remove_button', False ): - self.__update_current_form( trans, **kwd ) - index = int( kwd[ 'remove_button' ].split( ' ' )[2] ) - 1 - self.__remove_field( index ) - return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd ) - # Save changes - elif params.get( 'save_changes_button', False ): - self.__update_current_form( trans, **kwd ) - fd_new, msg = self.__save_form( trans, fd.form_definition_current.id, **kwd ) - if not fd_new: - return self.__show( trans=trans, form=fd, msg=msg, messagetype='error', **kwd ) - else: - fd = fd_new - msg = "The form '%s' has been updated with the changes." % fd.name - return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd ) - #Add a field + del current_form['layout'][index] + return self.__show( trans=trans, form=fd, current_form=current_form, + msg=msg, messagetype=messagetype, **kwd ) + # + # Add a field + # elif params.get( 'add_field_button', False ): - self.__update_current_form( trans, **kwd ) - self.__add_field() + current_form = self.__get_form( trans, **kwd ) + current_form['fields'].append( self.empty_field ) # show the form again with one empty field - return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd ) + return self.__show( trans=trans, form=fd, current_form=current_form, + msg=msg, messagetype=messagetype, **kwd ) + # + # Delete a field + # + elif params.get( 'remove_button', False ): + current_form = self.__get_form( trans, **kwd ) + # find the index of the field to be removed from the remove button label + index = int( kwd[ 'remove_button' ].split( ' ' )[2] ) - 1 + del current_form['fields'][index] + return self.__show( trans=trans, form=fd, current_form=current_form, + msg=msg, messagetype=messagetype, **kwd ) + # + # Save changes + # + elif params.get( 'save_changes_button', False ): + fd_new, msg = self.__save_form( trans, fdc_id=fd.form_definition_current.id, **kwd ) + # if validation error encountered while saving the form, show the + # unsaved form, with the error message + if not fd_new: + current_form = self.__get_form( trans, **kwd ) + return self.__show( trans=trans, form=fd, current_form=current_form, + msg=msg, messagetype='error', **kwd ) + # everything went fine. form saved successfully. Show the saved form + fd = fd_new + current_form = self.__get_saved_form( fd ) + msg = "The form '%s' has been updated with the changes." % fd.name + return self.__show( trans=trans, form=fd, current_form=current_form, + msg=msg, messagetype=messagetype, **kwd ) + # # Show form read-only + # elif params.get( 'read_only', False ): return trans.fill_template( '/admin/forms/show_form_read_only.mako', form=fd, msg=msg, messagetype=messagetype ) - # Refresh page, SelectField is selected/deselected as the type of a field - elif params.get( 'refresh', False ): - self.__update_current_form( trans, **kwd ) - return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd ) - # Remove SelectField option - elif params.get( 'select_box_options', False ) == 'remove': - index = int( kwd[ 'field_index' ] ) - option = int( kwd[ 'option_index' ] ) - del self.current_form[ 'fields' ][ index ][ 'selectlist' ][ option ] - return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd ) + # # Add SelectField option - elif params.get( 'select_box_options', False ) == 'add': - index = int( kwd[ 'field_index' ] ) - self.current_form[ 'fields' ][ index ][ 'selectlist' ].append( '' ) - return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd ) - def __add_layout_grid(self): - self.current_form['layout'].append('') - def __remove_layout_grid(self, index): - del self.current_form['layout'][index] - def __remove_field(self, index): - del self.current_form['fields'][index] - def __add_field(self): + # + elif 'Add' in kwd.values(): + return self.__add_selectbox_option(trans, fd, msg, messagetype, **kwd) + # + # Remove SelectField option + # + elif 'Remove' in kwd.values(): + return self.__remove_selectbox_option(trans, fd, msg, messagetype, **kwd) + # + # Refresh page + # + elif params.get( 'refresh', False ): + current_form = self.__get_form( trans, **kwd ) + return self.__show( trans=trans, form=fd, current_form=current_form, + msg=msg, messagetype=messagetype, **kwd ) + + def __add_selectbox_option( self, trans, fd, msg, messagetype, **kwd ): ''' - add an empty field to the fields list + This method adds a selectbox option. The kwd dict searched for + the field index which needs to be removed ''' - empty_field = { 'label': '', - 'helptext': '', - 'visible': True, - 'required': False, - 'type': BaseField.form_field_types()[0], - 'selectlist': [], - 'layout': 'none' } - self.current_form['fields'].append(empty_field) + current_form = self.__get_form( trans, **kwd ) + index = -1 + for k, v in kwd.items(): + if v == 'Add': + # extract the field index from the + # button name of format: 'addoption_' + index = int(k.split('_')[1]) + break + if index == -1: + # something wrong happened + return self.__show( trans=trans, form=fd, current_form=current_form, + msg='Error in adding selectfield option', + messagetype='error', **kwd ) + # add an empty option + current_form[ 'fields' ][ index ][ 'selectlist' ].append( '' ) + return self.__show( trans=trans, form=fd, current_form=current_form, + msg=msg, messagetype=messagetype, **kwd ) + def __remove_selectbox_option( self, trans, fd, msg, messagetype, **kwd ): + ''' + This method removes a selectbox option. The kwd dict searched for + the field index and option index which needs to be removed + ''' + current_form = self.__get_form( trans, **kwd ) + option = -1 + for k, v in kwd.items(): + if v == 'Remove': + # extract the field & option indices from the + # button name of format: 'removeoption__