Skip to content

Commit 7a13945

Browse files
committed
QuerySetSelectField and QuerySetSelectMultipleField improvements
- code cleanup - remove useless use of clone() (MongoEngine/mongoengine@9bbd8db) - filter by pk not id - fix QuerySetSelectMultipleField to allow emptying the value list (fixes #148) - added a few tests
1 parent a28853e commit 7a13945

File tree

2 files changed

+42
-8
lines changed

2 files changed

+42
-8
lines changed

flask_mongoengine/wtf/fields.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ class QuerySetSelectField(SelectFieldBase):
3737
"""
3838
widget = widgets.Select()
3939

40-
def __init__(self, label=u'', validators=None, queryset=None, label_attr='',
41-
allow_blank=False, blank_text=u'---', **kwargs):
40+
def __init__(self, label=u'', validators=None, queryset=None,
41+
label_attr='', allow_blank=False, blank_text=u'---',
42+
**kwargs):
43+
4244
super(QuerySetSelectField, self).__init__(label, validators, **kwargs)
4345
self.label_attr = label_attr
4446
self.allow_blank = allow_blank
@@ -71,8 +73,7 @@ def process_formdata(self, valuelist):
7173
return
7274

7375
try:
74-
# clone() because of https://github.com/MongoEngine/mongoengine/issues/56
75-
obj = self.queryset.clone().get(pk=valuelist[0])
76+
obj = self.queryset.get(pk=valuelist[0])
7677
self.data = obj
7778
except DoesNotExist:
7879
self.data = None
@@ -90,11 +91,16 @@ class QuerySetSelectMultipleField(QuerySetSelectField):
9091

9192
widget = widgets.Select(multiple=True)
9293

93-
def __init__(self, label=u'', validators=None, queryset=None, label_attr='',
94-
allow_blank=False, blank_text=u'---', **kwargs):
95-
super(QuerySetSelectMultipleField, self).__init__(label, validators, queryset, label_attr, allow_blank, blank_text, **kwargs)
94+
def __init__(self, label=u'', validators=None, queryset=None,
95+
label_attr='', allow_blank=False, blank_text=u'---',
96+
**kwargs):
97+
98+
super(QuerySetSelectMultipleField, self).__init__(
99+
label, validators, queryset, label_attr, allow_blank, blank_text,
100+
**kwargs)
96101

97102
def process_formdata(self, valuelist):
103+
98104
if valuelist:
99105
if valuelist[0] == '__None':
100106
self.data = None
@@ -104,10 +110,14 @@ def process_formdata(self, valuelist):
104110
return
105111

106112
self.queryset.rewind()
107-
self.data = [obj for obj in self.queryset if str(obj.id) in valuelist]
113+
self.data = list(self.queryset(pk__in=valuelist))
108114
if not len(self.data):
109115
self.data = None
110116

117+
# If no value passed, empty the list
118+
else:
119+
self.data = None
120+
111121
def _is_selected(self, item):
112122
return item in self.data if self.data else False
113123

tests/test_forms.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,18 @@ class DogOwner(db.Document):
244244
self.assertEqual(wtforms.widgets.Select, type(form.dog.widget))
245245
self.assertFalse(form.dog.widget.multiple)
246246

247+
# Validate selecting one item
248+
form = DogOwnerForm(MultiDict({
249+
'dog': dog.id,
250+
}))
251+
self.assertEqual(form.dog.data, dog)
252+
253+
# Validate selecting no item
254+
form = DogOwnerForm(MultiDict({
255+
'dog': u'__None',
256+
}), dog=dog)
257+
self.assertEqual(form.dog.data, None)
258+
247259
def test_modelselectfield_multiple(self):
248260
with self.app.test_request_context('/'):
249261
db = self.db
@@ -272,6 +284,18 @@ class DogOwner(db.Document):
272284
self.assertTrue(choices[0].checked)
273285
self.assertTrue(choices[1].checked)
274286

287+
# Validate selecting two items
288+
form = DogOwnerForm(MultiDict({
289+
'dogs': [dog.id for dog in dogs],
290+
}))
291+
self.assertEqual(form.dogs.data, dogs)
292+
293+
# Validate selecting none actually empties the list
294+
form = DogOwnerForm(MultiDict({
295+
'dogs': [],
296+
}), dogs=dogs)
297+
self.assertEqual(form.dogs.data, None)
298+
275299
def test_modelselectfield_multiple_initalvalue_None(self):
276300
with self.app.test_request_context('/'):
277301
db = self.db

0 commit comments

Comments
 (0)