Fix field attributes based on form data via YAQL expression.

If there is no form data gathered yet, field attribute specified by YAQL expression
will yield default field attribute value (from field.__dict__) instead of False
value.

Change-Id: Ie74f5a48ce90e3dab33cd3fc8b57a366433d7fe5
Fixes: bug MRN-852.
This commit is contained in:
Timur Sufiev 2013-08-28 19:57:22 +04:00
parent cb850de082
commit ad124ccf91
1 changed files with 8 additions and 6 deletions

View File

@ -160,7 +160,8 @@ class ServiceConfigurationForm(UpdatableFieldsForm):
def make_property(key, spec):
def _get(field):
return self.get_data(spec)
data_ready, value = self.get_data(spec)
return value if data_ready else field.__dict__[key]
def _set(field, value):
field.__dict__[key] = value
@ -210,12 +211,13 @@ class ServiceConfigurationForm(UpdatableFieldsForm):
self, data or getattr(self, 'cleaned_data', None))
expr = self.get_yaql_expr(expr)
value = data and yaql.parse(expr).evaluate(data, context)
return value
return data != {}, value
def get_unit_templates(self, data):
def parse_spec(spec):
if self.get_yaql_expr(spec):
return self.get_data(spec, data)
data_ready, value = self.get_data(spec, data)
return value
elif isinstance(spec, types.ListType):
return [parse_spec(_spec) for _spec in spec]
elif isinstance(spec, types.DictType):
@ -227,13 +229,13 @@ class ServiceConfigurationForm(UpdatableFieldsForm):
return [parse_spec(spec) for spec in self.service.unit_templates]
def extract_attributes(self, attributes):
def get_data(name):
def get_attr(name):
if type(name) == dict:
return dict((k, get_data(v)) for (k, v) in name.iteritems())
return dict((k, get_attr(v)) for (k, v) in name.iteritems())
else:
return self.cleaned_data[name]
for attr_name, field_name in self.attribute_mappings.iteritems():
attributes[attr_name] = get_data(field_name)
attributes[attr_name] = get_attr(field_name)
def clean(self):
cleaned_data = super(ServiceConfigurationForm, self).clean()