From 1ac2147d6b801d3446f79c42d65288349a08b0ca Mon Sep 17 00:00:00 2001 From: Timur Sufiev Date: Tue, 10 Sep 2013 18:53:27 +0400 Subject: [PATCH] Register regexp testing function in yaql context for dynamic UI. Change-Id: I9e131fdd01fd4edbed269d911dce28354a4edb4e Fixes: MRN-882. --- muranodashboard/panel/services/forms.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/muranodashboard/panel/services/forms.py b/muranodashboard/panel/services/forms.py index 18b40322f..be05f6239 100644 --- a/muranodashboard/panel/services/forms.py +++ b/muranodashboard/panel/services/forms.py @@ -63,11 +63,18 @@ class ServiceConfigurationForm(UpdatableFieldsForm): 'text': (fields.CharField, forms.Textarea) } + yaql_functions = { + 'test': lambda self, pattern: re.match(pattern(), self()) is not None, + } + localizable_keys = set(['label', 'help_text', 'error_messages']) def __init__(self, *args, **kwargs): super(ServiceConfigurationForm, self).__init__(*args, **kwargs) self.attribute_mappings = {} + self.context = yaql.create_context() + for name, func in self.yaql_functions.iteritems(): + self.context.register_function(func, name) self.insert_fields(self.fields_template) self.initial = kwargs.get('initial', self.initial) self.update_fields() @@ -206,11 +213,10 @@ class ServiceConfigurationForm(UpdatableFieldsForm): def get_data(self, expr, data=None): """First try to get value from cleaned data, if none found, use raw data.""" - context = yaql.create_context() data = self.service.update_cleaned_data( self, data or getattr(self, 'cleaned_data', None)) expr = self.get_yaql_expr(expr) - value = data and yaql.parse(expr).evaluate(data, context) + value = data and yaql.parse(expr).evaluate(data, self.context) return data != {}, value def get_unit_templates(self, data): @@ -243,11 +249,10 @@ class ServiceConfigurationForm(UpdatableFieldsForm): else: cleaned_data = super(ServiceConfigurationForm, self).clean() all_data = self.service.update_cleaned_data(self, cleaned_data) - context = yaql.create_context() error_messages = [] for validator in self.validators: expr = self.get_yaql_expr(validator['expr']) - if not yaql.parse(expr).evaluate(all_data, context): + if not yaql.parse(expr).evaluate(all_data, self.context): error_messages.append(_(validator.get('message', ''))) if error_messages: raise forms.ValidationError(error_messages)