Support Cerberus valueschema in ValidateCustomFields

This commit is contained in:
2016-10-25 17:29:48 +02:00
parent 8fb64c38d6
commit bffbbad323

View File

@@ -9,6 +9,7 @@ log = logging.getLogger(__name__)
class ValidateCustomFields(Validator):
# TODO: split this into a convert_property(property, schema) and call that from this function.
def convert_properties(self, properties, node_schema):
"""Converts datetime strings and ObjectId strings to actual Python objects."""
@@ -23,10 +24,10 @@ class ValidateCustomFields(Validator):
if prop_type == 'dict':
try:
dict_valueschema = schema_prop['schema']
except KeyError:
# TODO: will be renamed to 'keyschema' in Cerberus 1.0
dict_valueschema = schema_prop['valueschema']
properties[prop] = self.convert_properties(properties[prop], dict_valueschema)
except KeyError:
dict_valueschema = schema_prop['valueschema']
self.convert_dict_values(properties[prop], dict_valueschema)
elif prop_type == 'list':
if properties[prop] in ['', '[]']:
@@ -52,6 +53,20 @@ class ValidateCustomFields(Validator):
return properties
def convert_dict_values(self, dict_property, dict_valueschema):
"""Calls convert_properties() for the values in the dict.
Only validates the dict values, not the keys. Modifies the given dict in-place.
"""
assert dict_valueschema[u'type'] == u'dict'
assert isinstance(dict_property, dict)
for key, val in dict_property.items():
item_schema = {u'item': dict_valueschema}
item_prop = {u'item': val}
dict_property[key] = self.convert_properties(item_prop, item_schema)[u'item']
def _validate_valid_properties(self, valid_properties, field, value):
from pillar.api.utils import project_get_node_type