diff --git a/ckan/logic/__init__.py b/ckan/logic/__init__.py index a7b77c10844..3923b9711ae 100644 --- a/ckan/logic/__init__.py +++ b/ckan/logic/__init__.py @@ -3,10 +3,8 @@ import functools import logging import re -import sys from collections import defaultdict -import formencode.validators from six import string_types, text_type import ckan.model as model @@ -674,9 +672,9 @@ def get_validator(validator): _validators_cache.update(validators) validators = _import_module_functions('ckan.logic.validators') _validators_cache.update(validators) - _validators_cache.update({'OneOf': formencode.validators.OneOf}) converters = _import_module_functions('ckan.logic.converters') _validators_cache.update(converters) + _validators_cache.update({'OneOf': _validators_cache['one_of']}) for plugin in reversed(list(p.PluginImplementations(p.IValidators))): for name, fn in plugin.get_validators().items(): diff --git a/ckan/logic/schema.py b/ckan/logic/schema.py index 5299eb2a2df..78dcc3c1fea 100644 --- a/ckan/logic/schema.py +++ b/ckan/logic/schema.py @@ -343,13 +343,13 @@ def default_extras_schema( @validator_args def default_relationship_schema( - ignore_missing, unicode_safe, not_empty, OneOf, ignore): + ignore_missing, unicode_safe, not_empty, one_of, ignore): return { 'id': [ignore_missing, unicode_safe], 'subject': [ignore_missing, unicode_safe], 'object': [ignore_missing, unicode_safe], 'type': [not_empty, - OneOf(ckan.model.PackageRelationship.get_all_types())], + one_of(ckan.model.PackageRelationship.get_all_types())], 'comment': [ignore_missing, unicode_safe], 'state': [ignore], } diff --git a/ckan/logic/validators.py b/ckan/logic/validators.py index 04d71fb092c..3f81daeaa10 100644 --- a/ckan/logic/validators.py +++ b/ckan/logic/validators.py @@ -1,3 +1,4 @@ + # encoding: utf-8 import collections @@ -28,6 +29,7 @@ Missing = df.Missing missing = df.missing + def owner_org_validator(key, data, errors, context): value = data.get(key) @@ -858,3 +860,12 @@ def email_validator(value, context): if not email_pattern.match(value): raise Invalid(_('Email {email} is not a valid format').format(email=value)) return value + + +def one_of(list_of_value): + ''' Checks if the provided value is present in a list ''' + def callable(value): + if value not in list_of_value: + raise Invalid(_('Value must be one of {}'.format(list_of_value))) + return value + return callable diff --git a/ckan/tests/logic/test_validators.py b/ckan/tests/logic/test_validators.py index 0a7dd97eec5..ad4a2648b6a 100644 --- a/ckan/tests/logic/test_validators.py +++ b/ckan/tests/logic/test_validators.py @@ -1,3 +1,4 @@ + # encoding: utf-8 '''Unit tests for ckan/logic/validators.py. @@ -667,4 +668,17 @@ def call_validator(*args, **kwargs): errors[key] = [] call_validator(key, {key: url}, errors, None) + +class TestOneOfValidator(object): + + def test_val_in_list(self): + cont = [1, 2, 3, 4] + func = validators.one_of(cont) + assert_equals(func(1), 1) + + def test_val_not_in_list(self): + cont = [1, 2, 3, 4] + func = validators.one_of(cont) + raises_Invalid(func)(5) + # TODO: Need to test when you are not providing owner_org and the validator queries for the dataset with package_show diff --git a/ckanext/datapusher/logic/schema.py b/ckanext/datapusher/logic/schema.py index a5d33119f8b..90c6a30e4c2 100644 --- a/ckanext/datapusher/logic/schema.py +++ b/ckanext/datapusher/logic/schema.py @@ -9,13 +9,9 @@ not_missing = get_validator('not_missing') not_empty = get_validator('not_empty') -resource_id_exists = get_validator('resource_id_exists') -package_id_exists = get_validator('package_id_exists') ignore_missing = get_validator('ignore_missing') empty = get_validator('empty') boolean_validator = get_validator('boolean_validator') -int_validator = get_validator('int_validator') -OneOf = get_validator('OneOf') def datapusher_submit_schema(): diff --git a/ckanext/datastore/blueprint.py b/ckanext/datastore/blueprint.py index ff2045ae64e..815d6af7e6c 100644 --- a/ckanext/datastore/blueprint.py +++ b/ckanext/datastore/blueprint.py @@ -29,7 +29,7 @@ int_validator = get_validator(u'int_validator') boolean_validator = get_validator(u'boolean_validator') ignore_missing = get_validator(u'ignore_missing') -OneOf = get_validator(u'OneOf') +one_of = get_validator(u'one_of') default = get_validator(u'default') unicode_only = get_validator(u'unicode_only') @@ -43,7 +43,7 @@ def dump_schema(): return { u'offset': [default(0), int_validator], u'limit': [ignore_missing, int_validator], - u'format': [default(u'csv'), OneOf(DUMP_FORMATS)], + u'format': [default(u'csv'), one_of(DUMP_FORMATS)], u'bom': [default(False), boolean_validator], u'filters': [ignore_missing, json_validator], u'q': [ignore_missing, unicode_or_json_validator], diff --git a/ckanext/datastore/logic/schema.py b/ckanext/datastore/logic/schema.py index f64e36fa074..4109d6e5b51 100644 --- a/ckanext/datastore/logic/schema.py +++ b/ckanext/datastore/logic/schema.py @@ -18,7 +18,7 @@ empty = get_validator('empty') boolean_validator = get_validator('boolean_validator') int_validator = get_validator('int_validator') -OneOf = get_validator('OneOf') +one_of = get_validator('one_of') unicode_only = get_validator('unicode_only') default = get_validator('default') natural_number_validator = get_validator('natural_number_validator') @@ -118,11 +118,11 @@ def datastore_create_schema(): 'when': [ default(u'before insert or update'), unicode_only, - OneOf([u'before insert or update'])], + one_of([u'before insert or update'])], 'for_each': [ default(u'row'), unicode_only, - OneOf([u'row'])], + one_of([u'row'])], 'function': [not_empty, unicode_only], }, 'calculate_record_count': [ignore_missing, default(False), @@ -138,7 +138,7 @@ def datastore_upsert_schema(): 'resource_id': [not_missing, not_empty, text_type], 'force': [ignore_missing, boolean_validator], 'id': [ignore_missing], - 'method': [ignore_missing, text_type, OneOf( + 'method': [ignore_missing, text_type, one_of( ['upsert', 'insert', 'update'])], 'calculate_record_count': [ignore_missing, default(False), boolean_validator], @@ -183,7 +183,7 @@ def datastore_search_schema(): 'total_estimation_threshold': [default(None), int_validator], 'records_format': [ default(u'objects'), - OneOf([u'objects', u'lists', u'csv', u'tsv'])], + one_of([u'objects', u'lists', u'csv', u'tsv'])], '__junk': [empty], '__before': [rename('id', 'resource_id')] }