Merge pull request #1584 from etng/master

[fix]validation list field with multi choice values
This commit is contained in:
erdenezul 2018-05-21 16:33:10 +08:00 committed by GitHub
commit 3654591a1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 3 deletions

View File

@ -1080,5 +1080,11 @@ class BaseDocument(object):
"""Return the display value for a choice field"""
value = getattr(self, field.name)
if field.choices and isinstance(field.choices[0], (list, tuple)):
return dict(field.choices).get(value, value)
if value is None:
return None
sep = getattr(field, 'display_sep', ' ')
values = value if field.__class__.__name__ in ('ListField', 'SortedListField') else [value]
return sep.join([
dict(field.choices).get(val, val)
for val in values or []])
return value

View File

@ -213,7 +213,9 @@ class BaseField(object):
)
)
# Choices which are types other than Documents
elif value not in choice_list:
else:
values = value if isinstance(value, (list, tuple)) else [value]
if len(set(values) - set(choice_list)):
self.error('Value must be one of %s' % six.text_type(choice_list))
def _validate(self, value, **kwargs):

View File

@ -920,6 +920,12 @@ class FieldTest(MongoDBTestCase):
def test_list_validation(self):
"""Ensure that a list field only accepts lists with valid elements."""
AccessLevelChoices = (
('a', u'Administration'),
('b', u'Manager'),
('c', u'Staff'),
)
class User(Document):
pass
@ -934,6 +940,7 @@ class FieldTest(MongoDBTestCase):
authors_as_lazy = ListField(LazyReferenceField(User))
generic = ListField(GenericReferenceField())
generic_as_lazy = ListField(GenericLazyReferenceField())
access_list = ListField(choices=AccessLevelChoices, display_sep=', ')
User.drop_collection()
BlogPost.drop_collection()
@ -951,6 +958,17 @@ class FieldTest(MongoDBTestCase):
post.tags = ('fun', 'leisure')
post.validate()
post.access_list = 'a,b'
self.assertRaises(ValidationError, post.validate)
post.access_list = ['c', 'd']
self.assertRaises(ValidationError, post.validate)
post.access_list = ['a', 'b']
post.validate()
self.assertEqual(post.get_access_list_display(), u'Administration, Manager')
post.comments = ['a']
self.assertRaises(ValidationError, post.validate)
post.comments = 'yay'