/lib/galaxy/web/controllers/forms.py
Python | 481 lines | 470 code | 2 blank | 9 comment | 9 complexity | 417c0c77933a698a78402cfdac8d63a3 MD5 | raw file
- from galaxy.web.base.controller import *
- from galaxy.model.orm import *
- from galaxy.datatypes import sniff
- from galaxy import util
- import logging, os, sys
- from galaxy.web.form_builder import *
- from galaxy.tools.parameters.basic import parameter_types
- from elementtree.ElementTree import XML, Element
- from galaxy.util.odict import odict
- import copy
- log = logging.getLogger( __name__ )
- class Forms( BaseController ):
- @web.expose
- @web.require_admin
- def index( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- return trans.fill_template( "/sample/index.mako",
- default_action=params.get( 'default_action', None ),
- msg=msg,
- messagetype=messagetype )
- @web.expose
- @web.require_admin
- def manage( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- show_filter = params.get( 'show_filter', 'Active' )
- return self._show_forms_list(trans, msg, messagetype, show_filter)
- def _show_forms_list(self, trans, msg, messagetype, show_filter='Active'):
- fdc_list = trans.app.model.FormDefinitionCurrent.query().all()
- if show_filter == 'All':
- forms_list = fdc_list
- elif show_filter == 'Deleted':
- forms_list = [form for form in fdc_list if form.deleted]
- else:
- forms_list = [form for form in fdc_list if not form.deleted]
- return trans.fill_template( '/admin/forms/manage_forms.mako',
- fdc_list=forms_list,
- show_filter=show_filter,
- msg=msg,
- messagetype=messagetype )
- @web.expose
- @web.require_admin
- def new( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- if params.get( 'create_form_button', False ):
- fd, msg = self.__save_form( trans, fdc_id=None, **kwd )
- self.__get_saved_form( fd )
- return trans.response.send_redirect( web.url_for( controller='forms',
- action='edit',
- form_id=fd.id,
- show_form=True ) )
- self.current_form = {}
- self.current_form[ 'name' ] = 'New Form'
- self.current_form[ 'desc' ] = ''
- self.current_form[ 'fields' ] = []
- inputs = [ ( 'Name', TextField( 'name', 40, self.current_form[ 'name' ] ) ),
- ( 'Description', TextField( 'description', 40, self.current_form[ 'desc' ] ) ),
- ( 'Import from csv file (Optional)', FileField( 'file_data', 40, '' ) ) ]
- return trans.fill_template( '/admin/forms/create_form.mako',
- inputs=inputs,
- msg=msg,
- messagetype=messagetype )
- @web.expose
- @web.require_admin
- def delete( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- fd = trans.app.model.FormDefinition.get(int(util.restore_text( params.form_id )))
- fd.form_definition_current.deleted = True
- fd.form_definition_current.flush()
- return self._show_forms_list(trans,
- msg='The form definition named %s is deleted.' % fd.name,
- messagetype='done')
- @web.expose
- @web.require_admin
- def undelete( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- fd = trans.app.model.FormDefinition.get(int(util.restore_text( params.form_id )))
- fd.form_definition_current.deleted = False
- fd.form_definition_current.flush()
- return self._show_forms_list(trans,
- msg='The form definition named %s is undeleted.' % fd.name,
- messagetype='done')
- @web.expose
- @web.require_admin
- def edit( self, trans, **kwd ):
- '''
- This callback method is for handling all the editing functions like
- renaming fields, adding/deleting fields, changing fields attributes.
- '''
- params = util.Params( 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 ) )
- # 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 = {}
- if fd.fields:
- return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, **kwd )
- else:
- # If the form is empty, we'll simulate a click on the add_field_button so the
- # form will be displayed with the field choice, saving a mouse click.
- return self.__show( trans=trans, form=fd, msg=msg, messagetype=messagetype, empty_form=True, **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
- elif params.get( 'add_field_button', False ):
- self.__update_current_form( trans, **kwd )
- self.__add_field()
- # show the form again with one empty field
- return self.__show( trans=trans, form=fd, 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 __remove_field(self, index):
- del self.current_form['fields'][index]
- def __add_field(self):
- '''
- add an empty field to the fields list
- '''
- empty_field = { 'label': '',
- 'helptext': '',
- 'visible': True,
- 'required': False,
- 'type': BaseField.form_field_types()[0],
- 'selectlist': [] }
- self.current_form['fields'].append(empty_field)
- def __get_field(self, index, **kwd):
- params = util.Params( kwd )
- #TODO: RC this needs to be handled so that it does not throw an exception.
- # To reproduce, create a new form, click the "add field" button, click the
- # browser back arrow, then click the "add field" button again.
- # You should never attempt to "restore_text()" on a None object...
- 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, '' ) )
- if field_type == 'SelectField':
- selectlist = self.__get_selectbox_options(index, **kwd)
- return {'label': name,
- 'helptext': helptext,
- 'visible': True,
- 'required': required,
- 'type': field_type,
- 'selectlist': selectlist }
- return {'label': name,
- 'helptext': helptext,
- 'visible': True,
- 'required': required,
- 'type': field_type}
- def __get_selectbox_options(self, index, **kwd):
- '''
- This method gets all the options entered by the user for field when
- the fieldtype is SelectField
- '''
- params = util.Params( kwd )
- ctr=0
- sb_options = []
- while True:
- option = params.get( 'field_'+str(index)+'_option_'+str(ctr), None )
- ctr = ctr+1
- if option:
- sb_options.append(util.restore_text(option))
- else:
- return sb_options
- def __get_saved_form(self, fd):
- self.current_form = {}
- self.current_form['name'] = fd.name
- self.current_form['desc'] = fd.desc
- self.current_form['fields'] = list(copy.deepcopy(fd.fields))
- def __validate_form(self, **kwd):
- '''
- This method checks the following text inputs are filled out by the user
- - the name of form
- - name of all the fields
- '''
- params = util.Params( kwd )
- # form name
- if not util.restore_text( params.name ):
- return None, 'Form name must be filled.'
- # fields
- for i in range( len(self.current_form['fields']) ):
- if not util.restore_text(params.get( 'field_name_%i' % i, None )):
- return None, "All the field label(s) must be completed."
- return True, ''
- def __get_form(self, trans, **kwd):
- params = util.Params( kwd )
- name = util.restore_text( params.name )
- desc = util.restore_text( params.description ) or ""
- csv_file = params.get( 'file_data', '' )
- if csv_file == '':
- # set form fields
- fields = []
- for i in range( len(self.current_form['fields']) ):
- fields.append(self.__get_field(i, **kwd))
-