Skip to content

Commit

Permalink
Merge pull request #206 from Nobatek/dev_JL_queryselectmultiplefield
Browse files Browse the repository at this point in the history
QuerySetSelectField and QuerySetSelectMultipleField improvements
  • Loading branch information
losintikfos committed Feb 24, 2016
2 parents a842dc5 + 7a13945 commit 2a70f91
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 11 deletions.
26 changes: 18 additions & 8 deletions flask_mongoengine/wtf/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,10 @@ class QuerySetSelectField(SelectFieldBase):
"""
widget = widgets.Select()

def __init__(self, label=u'', validators=None, queryset=None, label_attr='',
allow_blank=False, blank_text=u'---', **kwargs):
def __init__(self, label=u'', validators=None, queryset=None,
label_attr='', allow_blank=False, blank_text=u'---',
**kwargs):

super(QuerySetSelectField, self).__init__(label, validators, **kwargs)
self.label_attr = label_attr
self.allow_blank = allow_blank
Expand Down Expand Up @@ -71,8 +73,7 @@ def process_formdata(self, valuelist):
return

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

widget = widgets.Select(multiple=True)

def __init__(self, label=u'', validators=None, queryset=None, label_attr='',
allow_blank=False, blank_text=u'---', **kwargs):
super(QuerySetSelectMultipleField, self).__init__(label, validators, queryset, label_attr, allow_blank, blank_text, **kwargs)
def __init__(self, label=u'', validators=None, queryset=None,
label_attr='', allow_blank=False, blank_text=u'---',
**kwargs):

super(QuerySetSelectMultipleField, self).__init__(
label, validators, queryset, label_attr, allow_blank, blank_text,
**kwargs)

def process_formdata(self, valuelist):

if valuelist:
if valuelist[0] == '__None':
self.data = None
Expand All @@ -104,10 +110,14 @@ def process_formdata(self, valuelist):
return

self.queryset.rewind()
self.data = [obj for obj in self.queryset if str(obj.id) in valuelist]
self.data = list(self.queryset(pk__in=valuelist))
if not len(self.data):
self.data = None

# If no value passed, empty the list
else:
self.data = None

def _is_selected(self, item):
return item in self.data if self.data else False

Expand Down
30 changes: 27 additions & 3 deletions tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,19 @@ class DogOwner(db.Document):
self.assertTrue(form.validate())

self.assertEqual(wtforms.widgets.Select, type(form.dog.widget))
self.assertEqual(False, form.dog.widget.multiple)
self.assertFalse(form.dog.widget.multiple)

# Validate selecting one item
form = DogOwnerForm(MultiDict({
'dog': dog.id,
}))
self.assertEqual(form.dog.data, dog)

# Validate selecting no item
form = DogOwnerForm(MultiDict({
'dog': u'__None',
}), dog=dog)
self.assertEqual(form.dog.data, None)

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

self.assertEqual(wtforms.widgets.Select, type(form.dogs.widget))
self.assertEqual(True, form.dogs.widget.multiple)
self.assertTrue(form.dogs.widget.multiple)

# Validate if both dogs are selected
choices = list(form.dogs)
self.assertEqual(len(choices), 2)
self.assertTrue(choices[0].checked)
self.assertTrue(choices[1].checked)

# Validate selecting two items
form = DogOwnerForm(MultiDict({
'dogs': [dog.id for dog in dogs],
}))
self.assertEqual(form.dogs.data, dogs)

# Validate selecting none actually empties the list
form = DogOwnerForm(MultiDict({
'dogs': [],
}), dogs=dogs)
self.assertEqual(form.dogs.data, None)

def test_modelselectfield_multiple_initalvalue_None(self):
with self.app.test_request_context('/'):
db = self.db
Expand All @@ -292,7 +316,7 @@ class DogOwner(db.Document):
self.assertTrue(form.validate())

self.assertEqual(wtforms.widgets.Select, type(form.dogs.widget))
self.assertEqual(True, form.dogs.widget.multiple)
self.assertTrue(form.dogs.widget.multiple)

# Validate if both dogs are selected
choices = list(form.dogs)
Expand Down

0 comments on commit 2a70f91

Please sign in to comment.