diff --git a/lib/galaxy/web/controllers/forms.py b/lib/galaxy/web/controllers/forms.py index 452c64c8115..940850ebaf7 100644 --- a/lib/galaxy/web/controllers/forms.py +++ b/lib/galaxy/web/controllers/forms.py @@ -36,7 +36,8 @@ class FormsGrid( grids.Grid ): NameColumn( "Name", key="name", model_class=model.FormDefinition, - link=( lambda item: iff( item.deleted, None, dict( operation="view", id=item.id ) ) ), + link=( lambda item: iff( item.deleted, None, dict( operation="view_latest_form_definition", + id=item.id ) ) ), attach_popup=True, filterable="advanced" ), DescriptionColumn( "Description", @@ -60,7 +61,7 @@ class FormsGrid( grids.Grid ): grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ), ] global_actions = [ - grids.GridAction( "Create new form", dict( controller='forms', action='create_form' ) ) + grids.GridAction( "Create new form", dict( controller='forms', action='create_form_definition' ) ) ] class Forms( BaseController ): @@ -77,126 +78,79 @@ class Forms( BaseController ): @web.expose @web.require_admin - def manage( self, trans, **kwd ): + def browse_form_definitions( self, trans, **kwd ): if 'operation' in kwd: operation = kwd['operation'].lower() if not kwd.get( 'id', None ): return trans.response.send_redirect( web.url_for( controller='forms', - action='manage', + action='browse_form_definitions', status='error', message="Invalid form ID") ) - if operation == "view": - return self.view_form_definition( trans, **kwd ) + if operation == "view_latest_form_definition": + return self.view_latest_form_definition( trans, **kwd ) elif operation == "delete": - return self.__delete( trans, **kwd ) + return self.delete_form_definition( trans, **kwd ) elif operation == "undelete": - return self.__undelete( trans, **kwd ) + return self.undelete_form_definition( trans, **kwd ) elif operation == "edit": - return self.edit( trans, **kwd ) + return self.edit_form_definition( trans, **kwd ) return self.forms_grid( trans, **kwd ) @web.expose - def view_form_definition( self, trans, **kwd ): + @web.require_admin + def view_latest_form_definition( self, trans, **kwd ): + ''' + Displays the layout of the latest version of the form definition + ''' form_definition_current_id = kwd.get( 'id', None ) try: - fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ) \ - .get( trans.security.decode_id( form_definition_current_id ) ) + form_definition_current = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ) \ + .get( trans.security.decode_id( form_definition_current_id ) ) except: return trans.response.send_redirect( web.url_for( controller='forms', - action='manage', + action='browse_form_definitions', message='Invalid form', status='error' ) ) return trans.fill_template( '/admin/forms/view_form_definition.mako', - form_definition=fdc.latest_form ) - def __form_types_widget(self, trans, selected='none'): - form_type_selectbox = SelectField( 'form_type_selectbox' ) - if selected == 'none': - form_type_selectbox.add_option('Select one', 'none', selected=True) - else: - form_type_selectbox.add_option('Select one', 'none') - fd_types = trans.app.model.FormDefinition.types.items() - fd_types.sort() - for ft in fd_types: - if selected == ft[1]: - form_type_selectbox.add_option(ft[1], ft[1], selected=True) - else: - form_type_selectbox.add_option(ft[1], ft[1]) - return form_type_selectbox - + form_definition=form_definition_current.latest_form ) @web.expose @web.require_admin - def create_form( self, trans, **kwd ): + def create_form_definition( self, trans, **kwd ): params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) self.__imported_from_file = False if params.get( 'create_form_button', False ): - fd, message = self.__save_form( trans, fdc_id=None, **kwd ) - if not fd: + form_definition, message = self.save_form_definition( trans, form_definition_current_id=None, **kwd ) + if not form_definition: return trans.response.send_redirect( web.url_for( controller='forms', - action='create_form', + action='create_form_definition', message=message, status='error', name=util.restore_text( params.get( 'name', '' ) ), description=util.restore_text( params.get( 'description', '' ) ) )) - self.__get_saved_form( fd ) if self.__imported_from_file: return trans.response.send_redirect( web.url_for( controller='forms', - action='edit', - id=trans.security.encode_id(fd.current.id)) ) + action='edit_form_definition', + id=trans.security.encode_id( form_definition.current.id )) ) else: return trans.response.send_redirect( web.url_for( controller='forms', - action='edit', - id=trans.security.encode_id(fd.current.id), + action='edit_form_definition', + id=trans.security.encode_id( form_definition.current.id ), add_field_button='Add field', - name=fd.name, - description=fd.desc, - form_type_selectbox=fd.type ) ) + name=form_definition.name, + description=form_definition.desc, + form_type_select_field=form_definition.type ) ) inputs = [ ( 'Name', TextField( 'name', 40, util.restore_text( params.get( 'name', '' ) ) ) ), ( 'Description', TextField( 'description', 40, util.restore_text( params.get( 'description', '' ) ) ) ), - ( 'Type', self.__form_types_widget(trans, selected=params.get( 'form_type', 'none' )) ), + ( 'Type', self.__build_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, message=message, - status=status ) - def __delete( self, trans, **kwd ): - id_list = util.listify( kwd['id'] ) - delete_failed = [] - for id in id_list: - try: - fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(id) ) - except: - return trans.response.send_redirect( web.url_for( controller='forms', - action='manage', - message='Invalid form', - status='error' ) ) - fdc.deleted = True - trans.sa_session.add( fdc ) - trans.sa_session.flush() - return trans.response.send_redirect( web.url_for( controller='forms', - action='manage', - message='%i forms have been deleted.' % len(id_list), - status='done') ) - def __undelete( self, trans, **kwd ): - id_list = util.listify( kwd['id'] ) - delete_failed = [] - for id in id_list: - try: - fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(id) ) - except: - return trans.response.send_redirect( web.url_for( controller='forms', - action='manage', - message='Invalid form', - status='error' ) ) - fdc.deleted = False - trans.sa_session.add( fdc ) - trans.sa_session.flush() - return trans.response.send_redirect( web.url_for( controller='forms', - action='manage', - message='%i forms have been undeleted.' % len(id_list), - status='done') ) + status=status ) @web.expose - def edit( self, trans, response_redirect=None, **kwd ): + @web.require_admin + def edit_form_definition( self, trans, response_redirect=None, **kwd ): ''' This callback method is for handling form editing. The value of response_redirect should be an URL that is defined by the caller. This allows for redirecting as desired @@ -207,273 +161,104 @@ class Forms( BaseController ): message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) try: - fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(kwd['id']) ) + form_definition_current = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(kwd['id']) ) except: return trans.response.send_redirect( web.url_for( controller='forms', - action='manage', + action='browse_form_definitions', message='Invalid form', status='error' ) ) - fd = fdc.latest_form - # + form_definition = form_definition_current.latest_form + if params.get( 'refresh', False ): + # Refresh + current_form = self.get_current_form( trans, **kwd ) + else: + # Show the saved form for editing + current_form = self.get_saved_form( form_definition ) # Save changes - # if params.get( 'save_changes_button', False ): - fd_new, message = self.__save_form( trans, fdc_id=fd.form_definition_current.id, **kwd ) + new_form_definition, message = self.save_form_definition( trans, form_definition_current_id=form_definition.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_definition=fd, - current_form=current_form, - message=message, - status='error', - response_redirect=response_redirect, - **kwd ) - # everything went fine. form saved successfully. Show the saved form or redirect - # to response_redirect if appropriate. - if response_redirect: - return trans.response.send_redirect( response_redirect ) - fd = fd_new - current_form = self.__get_saved_form( fd ) - message = "The form '%s' has been updated with the changes." % fd.name - return self.__show( trans=trans, - form_definition=fd, - current_form=current_form, - message=message, - status=status, - response_redirect=response_redirect, - **kwd ) - # + if not new_form_definition: + status = 'error' + else: + # everything went fine. form saved successfully. Show the saved form or redirect + # to response_redirect if appropriate. + if response_redirect: + return trans.response.send_redirect( response_redirect ) + form_definition = new_form_definition + current_form = self.get_saved_form( form_definition ) + message = "The form '%s' has been updated with the changes." % form_definition.name # Add a layout grid - # - elif params.get( 'add_layout_grid', False ): - current_form = self.__get_form( trans, **kwd ) - current_form['layout'].append('') - # show the form again - return self.__show( trans=trans, - form_definition=fd, - current_form=current_form, - message=message, - status=status, - response_redirect=response_redirect, - **kwd ) - # + elif params.get( 'add_layout_grid_button', False ): + current_form[ 'layout' ].append( '' ) # Delete a layout grid - # elif params.get( 'remove_layout_grid_button', False ): - current_form = self.__get_form( trans, **kwd ) index = int( kwd[ 'remove_layout_grid_button' ].split( ' ' )[2] ) - 1 - del current_form['layout'][index] - return self.__show( trans=trans, - form_definition=fd, - current_form=current_form, - message=message, - status=status, - response_redirect=response_redirect, - **kwd ) - # + del current_form[ 'layout' ][index] # Add a field - # elif params.get( 'add_field_button', False ): - 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_definition=fd, - current_form=current_form, - message=message, - status=status, - response_redirect=response_redirect, - **kwd ) - # + self.empty_field[ 'label' ] = 'Field_%i' % ( len( current_form[ 'fields' ] ) + 1 ) + current_form[ 'fields' ].append( self.empty_field ) # 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_definition=fd, - current_form=current_form, - message=message, - status=status, - response_redirect=response_redirect, - **kwd ) - # + del current_form[ 'fields' ][ index ] # Add SelectField option - # elif 'Add' in kwd.values(): - return self.__add_selectbox_option(trans, fd, message, status, response_redirect=response_redirect, **kwd) - # + current_form, status, message = self.__add_select_field_option( trans=trans, + current_form=current_form, + **kwd) # Remove SelectField option - # elif 'Remove' in kwd.values(): - return self.__remove_selectbox_option(trans, fd, message, status, response_redirect=response_redirect, **kwd) - # - # Refresh page - # - elif params.get( 'refresh', False ): - current_form = self.__get_form( trans, **kwd ) - return self.__show( trans=trans, - form_definition=fd, - current_form=current_form, - message=message, - status=status, - response_redirect=response_redirect, - **kwd ) - # - # Show the form for editing - # - else: - current_form = self.__get_saved_form( fd ) - return self.__show( trans=trans, - form_definition=fd, - current_form=current_form, - message=message, - status=status, - response_redirect=response_redirect, - **kwd ) - - def __add_selectbox_option( self, trans, fd, message, status, response_redirect=None, **kwd ): - ''' - This method adds a selectbox option. The kwd dict searched for - the field index which needs to be removed - ''' - 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_definition=fd, - current_form=current_form, - message='Error in adding selectfield option', - status='error', - response_redirect=response_redirect, - **kwd ) - # add an empty option - current_form[ 'fields' ][ index ][ 'selectlist' ].append( '' ) - return self.__show( trans=trans, - form_definition=fd, - current_form=current_form, - message=message, - status=status, - response_redirect=response_redirect, - **kwd ) - def __remove_selectbox_option( self, trans, fd, message, status, response_redirect=None, **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__