Merge "Fix a routing bug for generic subcontrollers."
This commit is contained in:
@@ -3,7 +3,7 @@ import warnings
|
||||
from webob import exc
|
||||
|
||||
from .secure import handle_security, cross_boundary
|
||||
from .util import iscontroller, getargspec
|
||||
from .util import iscontroller, getargspec, _cfg
|
||||
|
||||
__all__ = ['lookup_controller', 'find_object']
|
||||
|
||||
@@ -148,6 +148,17 @@ def find_object(obj, remainder, notfound_handlers, request):
|
||||
|
||||
if not remainder:
|
||||
raise PecanNotFound
|
||||
|
||||
prev_remainder = remainder
|
||||
prev_obj = obj
|
||||
remainder = rest
|
||||
obj = getattr(obj, next_obj, None)
|
||||
|
||||
# Last-ditch effort: if there's not a matching subcontroller, no
|
||||
# `_default`, no `_lookup`, and no `_route`, look to see if there's
|
||||
# an `index` that has a generic method defined for the current request
|
||||
# method.
|
||||
if not obj and not notfound_handlers and hasattr(prev_obj, 'index'):
|
||||
if request.method in _cfg(prev_obj.index).get('generic_handlers',
|
||||
{}):
|
||||
return prev_obj.index, prev_remainder
|
||||
|
||||
@@ -60,3 +60,29 @@ class TestGeneric(PecanTestCase):
|
||||
r = app.delete('/', expect_errors=True)
|
||||
assert r.status_int == 405
|
||||
assert r.headers['Allow'] == 'GET, PATCH, POST'
|
||||
|
||||
def test_nested_generic(self):
|
||||
|
||||
class SubSubController(object):
|
||||
@expose(generic=True)
|
||||
def index(self):
|
||||
return 'GET'
|
||||
|
||||
@index.when(method='DELETE', template='json')
|
||||
def do_delete(self, name, *args):
|
||||
return dict(result=name, args=', '.join(args))
|
||||
|
||||
class SubController(object):
|
||||
sub = SubSubController()
|
||||
|
||||
class RootController(object):
|
||||
sub = SubController()
|
||||
|
||||
app = TestApp(Pecan(RootController()))
|
||||
r = app.get('/sub/sub/')
|
||||
assert r.status_int == 200
|
||||
assert r.body == b_('GET')
|
||||
|
||||
r = app.delete('/sub/sub/joe/is/cool')
|
||||
assert r.status_int == 200
|
||||
assert r.body == b_(dumps(dict(result='joe', args='is, cool')))
|
||||
|
||||
Reference in New Issue
Block a user