Skip to content

Commit

Permalink
Add to_dict functions to form_builder
Browse files Browse the repository at this point in the history
  • Loading branch information
guerler committed Sep 29, 2016
1 parent 3186773 commit faa7cb5
Show file tree
Hide file tree
Showing 3 changed files with 199 additions and 170 deletions.
27 changes: 27 additions & 0 deletions lib/galaxy/model/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4199,6 +4199,21 @@ def __init__( self, name=None, desc=None, fields=[], form_definition_current=Non
self.type = form_type
self.layout = layout

def to_dict( self ):
form_def = { 'name': self.name, 'fields': [] }
for field in self.fields:
FieldClass = ( { 'AddressField' : AddressField,
'CheckboxField' : CheckboxField,
'HistoryField' : HistoryField,
'PasswordFiled' : PasswordField,
'SelectField' : SelectField,
'TextArea' : TextArea,
'TextField' : TextField,
'WorkflowField' : WorkflowField,
'WorkflowMappingField' : WorkflowMappingField } ).get( field[ 'type' ], TextField )
form_def[ 'fields' ].append( FieldClass( **field ).to_dict() )
return form_def

def grid_fields( self, grid_index ):
# Returns a dictionary whose keys are integers corresponding to field positions
# on the grid and whose values are the field.
Expand Down Expand Up @@ -4823,6 +4838,18 @@ def __init__( self, user=None, desc=None, name=None, institution=None,
self.country = country
self.phone = phone

def to_dict( self, trans ):
return { 'id' : trans.security.encode_id( self.id ),
'name' : sanitize_html( self.name ),
'institution' : sanitize_html( self.institution ),
'address' : sanitize_html( self.address ),
'city' : sanitize_html( self.city ),
'state' : sanitize_html( self.state ),
'postal_code' : sanitize_html( self.postal_code ),
'country' : sanitize_html( self.country ),
'phone' : sanitize_html( self.phone )
}

def get_html(self):
# This should probably be deprecated eventually. It should currently
# sanitize.
Expand Down
130 changes: 105 additions & 25 deletions lib/galaxy/web/form_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,13 @@

log = logging.getLogger(__name__)


class BaseField(object):
def __init__( self, name, value=None, disabled=False, optional=True, **kwds ):
self.name = name
self.value = value
self.disabled = disabled
self.optional = optional

def get_html( self, prefix="" ):
"""Returns the html widget corresponding to the parameter"""
raise TypeError( "Abstract Method" )
Expand All @@ -26,6 +31,14 @@ def get_disabled_str( self, disabled=False ):
else:
return ''

def to_dict( self ):
return {
'name' : self.name,
'disabled' : self.disabled,
'optional' : self.optional,
'value' : escape( unicodify( self.value ), quote=True ) if isinstance( self.value, basestring ) else self.value
}


class TextField(BaseField):
"""
Expand All @@ -36,20 +49,23 @@ class TextField(BaseField):
>>> print TextField( "bins", size=4, value="default" ).get_html()
<input type="text" name="bins" size="4" value="default">
"""
def __init__( self, name, size=None, value=None ):
self.name = name
def __init__( self, name, size=None, value=None, **kwds ):
super( TextField, self ).__init__( name, value, **kwds )
self.size = int( size or 10 )
self.value = value or ""

def get_html( self, prefix="", disabled=False ):
value = self.value
value = unicodify( value )
value = unicodify( self.value or "" )
return unicodify( '<input type="text" name="%s%s" size="%d" value="%s"%s>'
% ( prefix, self.name, self.size, escape( value, quote=True ), self.get_disabled_str( disabled ) ) )

def set_size(self, size):
self.size = int( size )

def to_dict( self ):
d = super( TextField, self ).to_dict()
d[ 'type' ] = 'text'
return d


class PasswordField(BaseField):
"""
Expand All @@ -60,7 +76,8 @@ class PasswordField(BaseField):
>>> print PasswordField( "bins", size=4, value="default" ).get_html()
<input type="password" name="bins" size="4" value="default">
"""
def __init__( self, name, size=None, value=None ):
def __init__( self, name, size=None, value=None, **kwds ):
super( PasswordField, self ).__init__( name, value, **kwds )
self.name = name
self.size = int( size or 10 )
self.value = value or ""
Expand All @@ -72,6 +89,11 @@ def get_html( self, prefix="", disabled=False ):
def set_size(self, size):
self.size = int( size )

def to_dict( self ):
d = super( PasswordField, self ).to_dict()
d[ 'type' ] = 'text'
return d


class TextArea(BaseField):
"""
Expand All @@ -84,7 +106,8 @@ class TextArea(BaseField):
"""
_DEFAULT_SIZE = "5x25"

def __init__( self, name, size=None, value=None ):
def __init__( self, name, size=None, value=None, **kwds ):
super( TextArea, self ).__init__( name, value, **kwds )
self.name = name
size = size or self._DEFAULT_SIZE
self.size = size.split("x")
Expand All @@ -100,6 +123,12 @@ def set_size(self, rows, cols):
self.rows = rows
self.cols = cols

def to_dict( self ):
d = super( TextArea, self ).to_dict()
d[ 'type' ] = 'text'
d[ 'area' ] = True,
return d


class CheckboxField(BaseField):
"""
Expand All @@ -111,7 +140,8 @@ class CheckboxField(BaseField):
<input type="checkbox" id="bar" name="bar" value="__CHECKED__" checked="checked"><input type="hidden" name="bar" value="__NOTHING__">
"""

def __init__( self, name, checked=None, refresh_on_change=False, refresh_on_change_values=None ):
def __init__( self, name, checked=None, refresh_on_change=False, refresh_on_change_values=None, value=None, **kwds ):
super( CheckboxField, self ).__init__( name, value, **kwds )
self.name = name
self.checked = ( checked is True ) or ( isinstance( checked, string_types ) and ( checked.lower() in ( "yes", "true", "on" ) ) )
self.refresh_on_change = refresh_on_change
Expand Down Expand Up @@ -144,6 +174,12 @@ def set_checked(self, value):
else:
self.checked = value

def to_dict( self ):
d = super( TextArea, self ).to_dict()
d[ 'type' ] = 'select'
d[ 'display' ] = 'checkbox',
return d


class FileField(BaseField):
"""
Expand All @@ -155,7 +191,8 @@ class FileField(BaseField):
<input type="file" name="foo" galaxy-ajax-upload="true">
"""

def __init__( self, name, value=None, ajax=False ):
def __init__( self, name, value=None, ajax=False, **kwds ):
super( FileField, self ).__init__( name, value, **kwds )
self.name = name
self.ajax = ajax
self.value = value
Expand Down Expand Up @@ -205,7 +242,8 @@ class FTPFileField(BaseField):
</table>
'''

def __init__( self, name, dir, ftp_site, value=None ):
def __init__( self, name, dir, ftp_site, value=None, **kwds ):
super( FTPFileField, self ).__init__( name, value, **kwds )
self.name = name
self.dir = dir
self.ftp_site = ftp_site
Expand Down Expand Up @@ -243,13 +281,20 @@ class HiddenField(BaseField):
>>> print HiddenField( "foo", 100 ).get_html()
<input type="hidden" name="foo" value="100">
"""
def __init__( self, name, value=None ):
def __init__( self, name, value=None, **kwds ):
super( HiddenField, self ).__init__( name, value, **kwds )
self.name = name
self.value = value or ""

def get_html( self, prefix="" ):
return unicodify( '<input type="hidden" name="%s%s" value="%s">' % ( prefix, self.name, escape( str( self.value ), quote=True ) ) )

def to_dict( self ):
d = super( HiddenField, self ).to_dict()
d[ 'type' ] = 'hidden'
d[ 'hidden' ] = True,
return d


class SelectField(BaseField):
"""
Expand Down Expand Up @@ -288,10 +333,12 @@ class SelectField(BaseField):
<div><input type="checkbox" name="bar" value="3" id="bar|3"><label class="inline" for="bar|3">automatic</label></div>
<div><input type="checkbox" name="bar" value="4" id="bar|4" checked='checked'><label class="inline" for="bar|4">bazooty</label></div>
"""
def __init__( self, name, multiple=None, display=None, refresh_on_change=False, refresh_on_change_values=None, size=None, field_id=None ):
def __init__( self, name, multiple=None, display=None, refresh_on_change=False, refresh_on_change_values=None, size=None, field_id=None, value=None, **kwds ):
super( SelectField, self ).__init__( name, value, **kwds )
self.name = name
self.field_id = field_id
self.multiple = multiple or False
self.value = None
self.size = size
self.options = list()
if display == "checkboxes":
Expand Down Expand Up @@ -432,11 +479,9 @@ def get_selected( self, return_label=False, return_value=False, multi=False ):
return None

def to_dict( self ):
return dict(
name=self.name,
multiple=self.multiple,
options=self.options
)
d = super( SelectField, self ).to_dict()
d[ 'type' ] = 'select'
return d


class DrillDownField( BaseField ):
Expand Down Expand Up @@ -507,7 +552,8 @@ class DrillDownField( BaseField ):
</div>
"""

def __init__( self, name, multiple=None, display=None, refresh_on_change=False, options=[], value=[], refresh_on_change_values=[] ):
def __init__( self, name, multiple=None, display=None, refresh_on_change=False, options=[], value=[], refresh_on_change_values=[], **kwds ):
super( DrillDownField, self ).__init__( name, value, **kwds )
self.name = name
self.multiple = multiple or False
self.options = options
Expand Down Expand Up @@ -571,6 +617,11 @@ def recurse_options( html, options, base_id, expanded_options=[] ):
rval.append( '</div>' )
return unicodify( '\n'.join( rval ) )

def to_dict( self ):
d = super( DrillDown, self ).to_dict()
d[ 'type' ] = 'drilldown'
return d


class AddressField(BaseField):
@staticmethod
Expand All @@ -585,7 +636,8 @@ def fields():
( "country", "Country", "Required" ),
( "phone", "Phone", "" ) ]

def __init__(self, name, user=None, value=None, params=None):
def __init__(self, name, user=None, value=None, params=None, **kwds):
super( AddressField, self ).__init__( name, value, **kwds )
self.name = name
self.user = user
self.value = value
Expand Down Expand Up @@ -643,9 +695,15 @@ def get_html( self, disabled=False ):
self.select_address.add_option( 'Add a new address', 'new' )
return self.select_address.get_html( disabled=disabled ) + address_html

def to_dict( self ):
d = super( AddressField, self ).to_dict()
d[ 'type' ] = 'text'
return d


class WorkflowField( BaseField ):
def __init__( self, name, user=None, value=None, params=None ):
def __init__( self, name, user=None, value=None, params=None, **kwds ):
super( WorkflowField, self ).__init__( name, value, **kwds )
self.name = name
self.user = user
self.value = value
Expand All @@ -667,9 +725,15 @@ def get_html( self, disabled=False ):
self.select_workflow.add_option( a.name, str( a.id ) )
return self.select_workflow.get_html( disabled=disabled )

def to_dict( self ):
d = super( WorkflowField, self ).to_dict()
d[ 'type' ] = 'select'
return d


class WorkflowMappingField( BaseField):
def __init__( self, name, user=None, value=None, params=None, **kwd ):
class WorkflowMappingField( BaseField ):
def __init__( self, name, user=None, value=None, params=None, **kwds ):
super( WorkflowMappingField, self ).__init__( name, value, **kwds )
# DBTODO integrate this with the new __build_workflow approach in requests_common. As it is, not particularly useful.
self.name = name
self.user = user
Expand Down Expand Up @@ -709,9 +773,15 @@ def get_display_text(self):
else:
return '-'

def to_dict( self ):
d = super( WorkflowMappingField, self ).to_dict()
d[ 'type' ] = 'select'
return d


class HistoryField( BaseField ):
def __init__( self, name, user=None, value=None, params=None ):
def __init__( self, name, user=None, value=None, params=None, **kwds ):
super( HistoryField, self ).__init__( name, value, **kwds )
self.name = name
self.user = user
self.value = value
Expand Down Expand Up @@ -744,9 +814,15 @@ def get_display_text(self):
else:
return '-'

def to_dict( self ):
d = super( HistoryField, self ).to_dict()
d[ 'type' ] = 'select'
return d


class LibraryField( BaseField ):
def __init__( self, name, value=None, trans=None ):
def __init__( self, name, value=None, trans=None, **kwds ):
super( LibraryField, self ).__init__( name, value, **kwds )
self.name = name
self.lddas = value
self.trans = trans
Expand All @@ -767,6 +843,10 @@ def get_display_text(self):
else:
return 'None'

def to_dict( self ):
d = super( LibraryField, self ).to_dict()
d[ 'type' ] = 'select'
return d

def get_suite():
"""Get unittest suite for this module"""
Expand Down
Loading

0 comments on commit faa7cb5

Please sign in to comment.