Source code for galaxy.forms.forms

"""
FormDefinition and field factories
"""
# TODO: A FormDefinitionField is closely linked to a form_builder result.
# Can this functionality be further abstracted and merged with form_builder?
from galaxy.util import string_as_bool
from galaxy.model import FormDefinitionCurrent, FormDefinition

FORM_TYPES = dict( [ ( f_type.lower(), f_descript ) for f_type, f_descript in FormDefinition.types.items() ] )


[docs]class FormDefinitionFactory( object ): def __init__( self, form_types, field_type_factories ): self.form_types = form_types self.field_type_factories = field_type_factories
[docs] def new( self, form_type, name, description=None, fields=None, layout=None, form_definition_current=None ): """ Return new FormDefinition. """ assert form_type in self.form_types, 'Invalid FormDefinition type ( %s not in %s )' % ( form_type, self.form_types.keys() ) assert name, 'FormDefinition requires a name' if description is None: description = '' if layout is None: layout = [] if fields is None: fields = [] # Create new FormDefinitionCurrent if form_definition_current is None: form_definition_current = FormDefinitionCurrent() rval = FormDefinition( name=name, desc=description, form_type=self.form_types[form_type], form_definition_current=form_definition_current, layout=layout, fields=fields ) form_definition_current.latest_form = rval return rval
[docs] def from_elem( self, elem, form_definition_current=None ): """ Return FormDefinition created from an xml element. """ name = elem.get( 'name', None ) description = elem.get( 'description', None ) form_type = elem.get( 'type', None ) # load layout layout = [] layouts_elem = elem.find( 'layout' ) if layouts_elem: for layout_elem in layouts_elem.findall( 'grid' ): layout_name = layout_elem.get( 'name', None ) assert layout_name and layout_name not in layout, 'Layout grid element requires a unique name.' layout.append( layout_name ) # load fields fields = [] fields_elem = elem.find( 'fields' ) if fields_elem is not None: for field_elem in fields_elem.findall( 'field' ): field_type = field_elem.get( 'type' ) assert field_type in self.field_type_factories, 'Invalid form field type ( %s ).' % field_type fields.append( self.field_type_factories[field_type].from_elem( field_elem, layout ) ) # create and return new form return self.new( form_type, name, description=description, fields=fields, layout=layout, form_definition_current=form_definition_current )
[docs]class FormDefinitionFieldFactory( object ): type = None def __get_stored_field_type( self, **kwds ): raise 'not implemented'
[docs] def new( self, name=None, label=None, required=False, helptext=None, default=None, visible=True, layout=None ): """ Return new FormDefinition field. """ rval = {} 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: rval['required'] = 'optional' if helptext is None: helptext = '' rval['helptext'] = helptext if default is None: default = '' rval['default'] = default rval['visible'] = visible # if layout is None: #is this needed? # layout = '' rval['layout'] = layout return rval
[docs] def from_elem( self, elem, layout=None ): """ Return FormDefinition created from an xml element. """ name = elem.get( 'name' ) label = elem.get( 'label' ) required = string_as_bool( elem.get( 'required', 'false' ) ) default = elem.get( 'value' ) helptext = elem.get( 'helptext' ) visible = string_as_bool( elem.get( 'visible', 'true' ) ) field_layout = elem.get( 'layout', None ) 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( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=field_layout )
[docs]class FormDefinitionTextFieldFactory( FormDefinitionFieldFactory ): type = 'text' def __get_stored_field_type( self, area ): if area: return 'TextArea' else: return 'TextField'
[docs] 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( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) rval['type'] = self.__get_stored_field_type( area ) return rval
[docs] def from_elem( self, elem, layout=None ): """ Return FormDefinition field created from an xml element. """ rval = super( FormDefinitionTextFieldFactory, self ).from_elem( elem, layout=layout ) rval['type'] = self.__get_stored_field_type( string_as_bool( elem.get( 'area', 'false' ) ) ) return rval
[docs]class FormDefinitionPasswordFieldFactory( FormDefinitionFieldFactory ): type = 'password' def __get_stored_field_type( self ): return 'PasswordField'
[docs] 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( FormDefinitionPasswordFieldFactory, 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
[docs] def from_elem( self, elem, layout=None ): """ Return FormDefinition field created from an xml element. """ rval = super( FormDefinitionPasswordFieldFactory, self ).from_elem( elem, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval
[docs]class FormDefinitionAddressFieldFactory( FormDefinitionFieldFactory ): type = 'address' def __get_stored_field_type( self ): return 'AddressField'
[docs] 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( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval
[docs] def from_elem( self, elem, layout=None ): """ Return FormDefinition field created from an xml element. """ rval = super( FormDefinitionAddressFieldFactory, self ).from_elem( elem, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval
[docs]class FormDefinitionWorkflowFieldFactory( FormDefinitionFieldFactory ): type = 'workflow' def __get_stored_field_type( self ): return 'WorkflowField'
[docs] 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( name=name, label=label, required=required, helptext=helptext, default=default, visible=visible, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval
[docs] def from_elem( self, elem, layout=None ): """ Return FormDefinition field created from an xml element. """ rval = super( FormDefinitionWorkflowFieldFactory, self ).from_elem( elem, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval
[docs]class FormDefinitionWorkflowMappingFieldFactory( FormDefinitionFieldFactory ): type = 'workflowmapping' def __get_stored_field_type( self ): return 'WorkflowMappingField'
[docs] def new( self, name=None, label=None, required=False, helptext=None, default=None, visible=True, layout=None ): """ Return new FormDefinition field. """ rval = super( FormDefinitionWorkflowMappingFieldFactory, 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
[docs] def from_elem( self, elem, layout=None ): """ Return FormDefinition field created from an xml element. """ rval = super( FormDefinitionWorkflowMappingFieldFactory, self ).from_elem( elem, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval
[docs]class FormDefinitionHistoryFieldFactory( FormDefinitionFieldFactory ): type = 'history' def __get_stored_field_type( self ): return 'HistoryField'
[docs] def new( self, name=None, label=None, required=False, helptext=None, default=None, visible=True, layout=None ): """ Return new FormDefinition field. """ 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
[docs] def from_elem( self, elem, layout=None ): """ Return FormDefinition field created from an xml element. """ rval = super( FormDefinitionHistoryFieldFactory, self ).from_elem( elem, layout=layout ) rval['type'] = self.__get_stored_field_type() return rval
[docs]class FormDefinitionSelectFieldFactory( FormDefinitionFieldFactory ): type = 'select' def __get_stored_field_type( self, checkboxes ): if checkboxes: return 'CheckboxField' else: return 'SelectField'
[docs] 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( 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 = [] rval['selectlist'] = options return rval
[docs] def from_elem( self, elem, layout=None ): """ Return FormDefinition field created from an xml element. """ rval = super( FormDefinitionSelectFieldFactory, self ).from_elem( elem, layout=layout ) rval['type'] = self.__get_stored_field_type( string_as_bool( elem.get( 'checkboxes', 'false' ) ) ) # load select options rval['selectlist'] = [] for select_option in elem.findall( 'option' ): value = select_option.get( 'value', None ) assert value is not None, 'Must provide a "value" for a select option' rval['selectlist'].append( value ) return rval
field_type_factories = dict( [ ( field.type, field() ) for field in ( FormDefinitionTextFieldFactory, FormDefinitionPasswordFieldFactory, FormDefinitionAddressFieldFactory, FormDefinitionSelectFieldFactory, FormDefinitionWorkflowFieldFactory, FormDefinitionWorkflowMappingFieldFactory, FormDefinitionHistoryFieldFactory ) ] ) form_factory = FormDefinitionFactory( FORM_TYPES, field_type_factories )