Skip to content

Commit 2a70f91

Browse files
committed
Merge pull request #206 from Nobatek/dev_JL_queryselectmultiplefield
QuerySetSelectField and QuerySetSelectMultipleField improvements
2 parents a842dc5 + 7a13945 commit 2a70f91

File tree

2 files changed

+45
-11
lines changed

2 files changed

+45
-11
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: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,19 @@ class DogOwner(db.Document):
242242
self.assertTrue(form.validate())
243243

244244
self.assertEqual(wtforms.widgets.Select, type(form.dog.widget))
245-
self.assertEqual(False, form.dog.widget.multiple)
245+
self.assertFalse(form.dog.widget.multiple)
246+
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)
246258

247259
def test_modelselectfield_multiple(self):
248260
with self.app.test_request_context('/'):
@@ -264,14 +276,26 @@ class DogOwner(db.Document):
264276
self.assertTrue(form.validate())
265277

266278
self.assertEqual(wtforms.widgets.Select, type(form.dogs.widget))
267-
self.assertEqual(True, form.dogs.widget.multiple)
279+
self.assertTrue(form.dogs.widget.multiple)
268280

269281
# Validate if both dogs are selected
270282
choices = list(form.dogs)
271283
self.assertEqual(len(choices), 2)
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
@@ -292,7 +316,7 @@ class DogOwner(db.Document):
292316
self.assertTrue(form.validate())
293317

294318
self.assertEqual(wtforms.widgets.Select, type(form.dogs.widget))
295-
self.assertEqual(True, form.dogs.widget.multiple)
319+
self.assertTrue(form.dogs.widget.multiple)
296320

297321
# Validate if both dogs are selected
298322
choices = list(form.dogs)

0 commit comments

Comments
 (0)