Skip to content

Commit e6a30f8

Browse files
author
Bo.Yi
committed
[fix]validation list field with multi choice values
1 parent a8d6e59 commit e6a30f8

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

mongoengine/base/document.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1080,5 +1080,9 @@ def __get_field_display(self, field):
10801080
"""Return the display value for a choice field"""
10811081
value = getattr(self, field.name)
10821082
if field.choices and isinstance(field.choices[0], (list, tuple)):
1083-
return dict(field.choices).get(value, value)
1083+
sep = getattr(field, 'display_sep', u' ')
1084+
values = value if field.__name__ == 'ListField' else [value]
1085+
return sep.join([
1086+
dict(field.choices).get(val, val)
1087+
for val in values])
10841088
return value

mongoengine/base/fields.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,10 @@ def _validate_choices(self, value):
213213
)
214214
)
215215
# Choices which are types other than Documents
216-
elif value not in choice_list:
217-
self.error('Value must be one of %s' % six.text_type(choice_list))
216+
else:
217+
values = value if isinstance(value, (list, tuple)) else [value]
218+
if len(set(values) - set(choice_list)):
219+
self.error('Value must be one of %s' % six.text_type(choice_list))
218220

219221
def _validate(self, value, **kwargs):
220222
# Check the Choices Constraint

tests/fields/fields.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,12 @@ class LogEntry(Document):
920920

921921
def test_list_validation(self):
922922
"""Ensure that a list field only accepts lists with valid elements."""
923+
AccessLevelChoices = (
924+
('a', u'Administrator'),
925+
('b', u'Manager'),
926+
('c', u'Staff'),
927+
)
928+
923929
class User(Document):
924930
pass
925931

@@ -932,6 +938,7 @@ class BlogPost(Document):
932938
tags = ListField(StringField())
933939
authors = ListField(ReferenceField(User))
934940
generic = ListField(GenericReferenceField())
941+
access_list = ListField(required=False, default=[], choices=AccessLevelChoices, display_sep=u',')
935942

936943
User.drop_collection()
937944
BlogPost.drop_collection()
@@ -949,6 +956,17 @@ class BlogPost(Document):
949956
post.tags = ('fun', 'leisure')
950957
post.validate()
951958

959+
post.access_list = 'a,b'
960+
self.assertRaises(ValidationError, post.validate())
961+
962+
post.access_list = ['c', 'd']
963+
self.assertRaises(ValidationError, post.validate())
964+
965+
post.access_list = ['a', 'b']
966+
post.validate()
967+
968+
self.assertEqual(post.get_access_list_display(), u'Administrator,Manager')
969+
952970
post.comments = ['a']
953971
self.assertRaises(ValidationError, post.validate)
954972
post.comments = 'yay'

0 commit comments

Comments
 (0)