Merge "Fix a routing bug for generic subcontrollers."

This commit is contained in:
Jenkins
2014-10-14 21:21:59 +00:00
committed by Gerrit Code Review
2 changed files with 38 additions and 1 deletions

View File

@@ -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

View File

@@ -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')))