Warning
This document is for an in-development version of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.util.form_builder
"""
Classes for generating HTML forms
"""
import logging
from galaxy.util import asbool
log = logging.getLogger(__name__)
[docs]class BaseField:
[docs] def __init__(self, name, value=None, label=None, **kwds):
self.name = name
self.label = label
self.value = value
self.disabled = kwds.get("disabled", False)
if "optional" in kwds:
self.optional = asbool(kwds.get("optional"))
else:
self.optional = kwds.get("required", "optional") == "optional"
self.help = kwds.get("helptext")
[docs] def to_dict(self):
return {
"name": self.name,
"label": self.label,
"disabled": self.disabled,
"optional": self.optional,
"value": self.value,
"help": self.help,
}
[docs]class CheckboxField(BaseField):
"""
A checkbox (boolean input)
"""
[docs] @staticmethod
def is_checked(value):
if value in [True, "True", "true"]:
return True
return False
[docs]class SelectField(BaseField):
"""
A select field.
"""
[docs] def __init__(
self,
name,
multiple=None,
display=None,
field_id=None,
value=None,
selectlist=None,
refresh_on_change=False,
**kwds,
):
super().__init__(name, value, **kwds)
self.field_id = field_id
self.multiple = multiple or False
self.refresh_on_change = refresh_on_change
self.selectlist = selectlist or []
self.options = []
if display == "checkboxes":
assert multiple, "Checkbox display only supported for multiple select"
elif display == "radio":
assert not (multiple), "Radio display only supported for single select"
elif display is not None:
raise Exception(f"Unknown display type: {display}")
self.display = display
[docs] def add_option(self, label, value, selected=False):
self.options.append((str(label), value, selected))
[docs] def to_dict(self):
d = super().to_dict()
d["type"] = "select"
d["display"] = self.display
d["multiple"] = self.multiple
d["data"] = []
for value in self.selectlist:
d["data"].append({"label": value, "value": value})
d["options"] = [{"label": t[0], "value": t[1]} for t in self.options]
return d
[docs]class AddressField(BaseField):
[docs] @staticmethod
def fields():
return [
("desc", "Short address description", "Required"),
("name", "Name", ""),
("institution", "Institution", ""),
("address", "Address", ""),
("city", "City", ""),
("state", "State/Province/Region", ""),
("postal_code", "Postal Code", ""),
("country", "Country", ""),
("phone", "Phone", ""),
]
[docs] def __init__(self, name, user=None, value=None, security=None, **kwds):
super().__init__(name, value, **kwds)
self.user = user
self.security = security
[docs] def to_dict(self):
d = super().to_dict()
d["type"] = "select"
d["data"] = []
if self.user and self.security:
for a in self.user.addresses:
if not a.deleted:
d["data"].append({"label": a.desc, "value": self.security.encode_id(a.id)})
return d
[docs]class WorkflowField(BaseField):
[docs] def __init__(self, name, user=None, value=None, security=None, **kwds):
super().__init__(name, value, **kwds)
self.user = user
self.value = value
self.security = security
[docs] def to_dict(self):
d = super().to_dict()
d["type"] = "select"
d["data"] = []
if self.user and self.security:
for a in self.user.stored_workflows:
if not a.deleted:
d["data"].append({"label": a.name, "value": self.security.encode_id(a.id)})
return d
[docs]class WorkflowMappingField(BaseField):
[docs] def __init__(self, name, user=None, value=None, **kwds):
super().__init__(name, value, **kwds)
self.user = user
[docs]class HistoryField(BaseField):
[docs] def __init__(self, name, user=None, value=None, security=None, **kwds):
super().__init__(name, value, **kwds)
self.user = user
self.value = value
self.security = security
[docs] def to_dict(self):
d = super().to_dict()
d["type"] = "select"
d["data"] = [{"label": "New History", "value": "new"}]
if self.user and self.security:
for a in self.user.histories:
if not a.deleted:
d["data"].append({"label": a.name, "value": self.security.encode_id(a.id)})
return d