Fix array parameters support in the Flask adapter

This commit is contained in:
Christophe de Vienne 2013-03-28 11:24:15 +01:00
parent 59a3123cde
commit d6e36463b1
2 changed files with 33 additions and 6 deletions

View File

@ -9,6 +9,11 @@ class Model(Base):
name = text name = text
class Criterion(Base):
op = text
attr = text
value = text
test_app = Flask(__name__) test_app = Flask(__name__)
@ -25,9 +30,13 @@ def divide_by_zero():
@test_app.route('/models') @test_app.route('/models')
@signature([Model]) @signature([Model], [Criterion])
def list_models(): def list_models(q=None):
return [Model(name='first')] if q:
name = q[0].value
else:
name = 'first'
return [Model(name=name)]
@test_app.route('/models/<name>') @test_app.route('/models/<name>')
@ -63,6 +72,14 @@ class FlaskrTestCase(unittest.TestCase):
resp = self.app.get('/models') resp = self.app.get('/models')
assert resp.status_code == 200 assert resp.status_code == 200
def test_array_parameter(self):
resp = self.app.get('/models?q.op=%3D&q.attr=name&q.value=second')
assert resp.status_code == 200
print resp.data
self.assertEquals(
resp.data, '[{"name": "second"}]'
)
def test_post_model(self): def test_post_model(self):
resp = self.app.post('/models', data={"body.name": "test"}) resp = self.app.post('/models', data={"body.name": "test"})
assert resp.status_code == 200 assert resp.status_code == 200

View File

@ -81,11 +81,19 @@ def from_params(datatype, params, path, hit_paths):
@from_params.when_type(ArrayType) @from_params.when_type(ArrayType)
def array_from_params(datatype, params, path, hit_paths): def array_from_params(datatype, params, path, hit_paths):
if hasattr(params, 'getall'):
# webob multidict
def getall(params, path):
return params.getall(path)
elif hasattr(params, 'getlist'):
# werkzeug multidict
def getall(params, path): # noqa
return params.getlist(path)
if path in params: if path in params:
hit_paths.add(path) hit_paths.add(path)
return [ return [
from_param(datatype.item_type, value) from_param(datatype.item_type, value)
for value in params.getall(path)] for value in getall(params, path)]
if iscomplex(datatype.item_type): if iscomplex(datatype.item_type):
attributes = set() attributes = set()
@ -99,7 +107,7 @@ def array_from_params(datatype, params, path, hit_paths):
for attrdef in list_attributes(datatype.item_type): for attrdef in list_attributes(datatype.item_type):
attrpath = '%s.%s' % (path, attrdef.key) attrpath = '%s.%s' % (path, attrdef.key)
hit_paths.add(attrpath) hit_paths.add(attrpath)
attrvalues = params.getall(attrpath) attrvalues = getall(params, attrpath)
if len(value) < len(attrvalues): if len(value) < len(attrvalues):
value[-1:] = [ value[-1:] = [
datatype.item_type() datatype.item_type()
@ -158,7 +166,9 @@ def args_from_args(funcdef, args, kwargs):
newargs.append(from_param(argdef.datatype, arg)) newargs.append(from_param(argdef.datatype, arg))
newkwargs = {} newkwargs = {}
for argname, value in kwargs.items(): for argname, value in kwargs.items():
newkwargs[argname] = from_param(funcdef.get_arg(argname).datatype, value) newkwargs[argname] = from_param(
funcdef.get_arg(argname).datatype, value
)
return newargs, newkwargs return newargs, newkwargs