Show required service configuration parameters as required

Because we don't want the fields to *actually* be required in the
particular form, instead of making them required they have been
made aware of their parameter and that is used in the overridden
field template to set the proper css class.

Change-Id: I4fdf3d0df712e1c2a4bd86a8acbc6eecc88186d3
Co-Authored-By: Ryan Brady <rbrady@redhat.com>
This commit is contained in:
Radomir Dopieralski 2015-03-20 15:00:14 +01:00 committed by Ryan Brady
parent 0006a339b7
commit cfabb4656f
2 changed files with 44 additions and 17 deletions

View File

@ -46,6 +46,10 @@ CINDER_ISCSI_HELPER_CHOICES = [
]
class ParameterAwareMixin(object):
parameter = None
def parameter_fields(request, prefix=None, read_only=False):
fields = SortedDict()
plan = api.tuskar.Plan.get_the_plan(request)
@ -54,18 +58,17 @@ def parameter_fields(request, prefix=None, read_only=False):
for p in parameters:
if prefix and not p.name.startswith(prefix):
continue
kwargs = {}
Field = django.forms.CharField
field_kwargs = {}
widget = None
if read_only:
if p.hidden:
kwargs['widget'] = tuskar_ui.forms.StaticTextPasswordWidget
widget = tuskar_ui.forms.StaticTextPasswordWidget
else:
kwargs['widget'] = tuskar_ui.forms.StaticTextWidget
Field = django.forms.CharField
widget = tuskar_ui.forms.StaticTextWidget
else:
if p.hidden:
Field = django.forms.CharField
kwargs['widget'] = (
django.forms.PasswordInput(render_value=True))
widget = django.forms.PasswordInput(render_value=True)
elif p.type == 'number':
Field = django.forms.IntegerField
elif p.type == 'boolean':
@ -73,18 +76,22 @@ def parameter_fields(request, prefix=None, read_only=False):
elif (p.type == 'string' and
p.constraints['allowed_values']['definition']):
Field = django.forms.ChoiceField
kwargs['choices'] = (
field_kwargs['choices'] = (
p.constraints['allowed_values']['definition'])
else:
if (p.type in ['json', 'comma_delimited_list'] or
'Certificate' in p.name):
kwargs['widget'] = django.forms.Textarea
Field = django.forms.CharField
elif (p.type in ['json', 'comma_delimited_list'] or
'Certificate' in p.name):
widget = django.forms.Textarea
fields[p.name] = Field(required=False,
label=_parameter_label(p),
initial=p.value,
**kwargs)
fields[p.name] = Field(
required=False,
label=_parameter_label(p),
initial=p.value,
widget=widget,
**field_kwargs
)
fields[p.name].__class__ = type('ParameterAwareField',
(ParameterAwareMixin, Field), {})
fields[p.name].parameter = p
return fields

View File

@ -0,0 +1,20 @@
{% load form_helpers %}
<div class="form-group{% if field.errors %} has-error{% endif %} {{ field.css_classes }}">
<label class="control-label col-sm-3 {% if field.field.required or field.field.parameter.is_required %}{{ form.required_css_class }}{% endif %}" for="{{ field.id_for_label }}">{{ field.label }}</label>
<div class="col-sm-9 {{ classes.value }} {{ field|wrapper_classes }}">
{{ field|add_bootstrap_class }}
{% for error in field.errors %}
<span class="help-block alert alert-danger {{ form.error_css_class }}">{{ error }}</span>
{% empty %}
{% comment %}
Escape help_text a second time here, to avoid an XSS issue in bootstrap.js.
This can most likely be removed once we upgrade bootstrap.js past 2.0.2.
Note: the spaces are necessary here.
{% endcomment %}
{% if field.help_text %}
<span class="help-block">{% filter force_escape %} {{ field.help_text }} {% endfilter %} </span>
{% endif %}
{% endfor %}
</div>
</div>