X-Git-Url: http://git.veekun.com/zzz-floof.git/blobdiff_plain/bc1cccee5faefbcfe6e28ce8f49694cca47b85cb..332de9696e2cca102332d5543adad9b289c35214:/floof/config/routing.py?ds=inline diff --git a/floof/config/routing.py b/floof/config/routing.py index 5bd87d9..7f46a2c 100644 --- a/floof/config/routing.py +++ b/floof/config/routing.py @@ -10,11 +10,22 @@ from routes import Mapper def make_map(): """Create, configure and return the routes Mapper""" map = Mapper(directory=config['pylons.paths']['controllers'], - always_scan=config['debug']) + always_scan=config['debug'], explicit=True) map.minimization = False + # explicit = True disables a broken feature called "route memory", + # where it adds everything matched in the current request as default variables + # for the next one. This is wrong because it doesn't invalidate things lower down in + # the hierarchy when higher up things change. Rails port failure. + # NOTE: this also disables actions defaulting to index, sorry. + require_POST = dict(conditions={'method': ['POST']}) + # get rid of trailing slashes + map.redirect('/*(url)/', '/{url}', + _redirect_code='301 Moved Permanently') + + # The ErrorController route (handles 404/500 error pages); it should # likely stay at the top, ensuring it can always be resolved map.connect('/error/{action}', controller='error') @@ -31,16 +42,48 @@ def make_map(): map.connect('/account/register_finish', controller='account', action='register_finish', **require_POST) map.connect('/users', controller='users', action='list') - map.connect('/users/{name}', controller='users', action='view') + map.connect('user_page', '/users/{name}', controller='users', action='view') # Art stuff - map.connect('/art/new', controller='art', action='new') - map.connect('/art/upload', controller='art', action='upload') - map.connect('/art/{id}', controller='art', action='show') - map.connect('/art/{id}/tag', controller='art', action='tag') + art = map.resource('art','art', controller="art", member={'rate':'PUT'}) + # wow, it even works if you name the plural and singular the same thing. + # Resources documented here: http://routes.groovie.org/manual.html#restful-services + # It seems the first parameter (singular) is only ever used in route names, e.g. url('kitten', id=5). + # The second parameter, plural, is used everywhere else by default: in the url, controller name, + # and the route name for the collection. e.g. url('kittens') -> '/kittens' -> kittens.index(). + # Since our controllers have singular names, we'll have to override this every time with the 'controller' parameter. + # Even singular routes use the plural in urls. url('kitten', id=5) -> '/kittens/5'. + # And it appears that if the singular and plural are the same, either will match, so no harm done. + # It does mean, however, that if you have a None id accidentally, url('art', id=None) you'll get the same thing + # as url('art'). I mean, you might have wanted a singular but you got a plural route instead. + + map.resource('tag','tags', controller="tag", + parent_resource=dict(member_name='art', collection_name='art')) + # Yeah, parent resources are specified kinda dumb-ly. Would be better if you could pass in the + # real parent resource instead of mocking it up with a silly dict. We should file a feature request. + + # I think resources is the right way to go for most things. It ensures all of our actions have the right + # methods on them, at least. It does require the use of silly _method="delete" post parameters though. + + # One sticking point though is, it'll happily allow you to add any formatting string you want, like art/1.json + # I wonder if there's a way to place requirements on that, or disable it until we actually have formats. + # It just serves the same action as usual but with a format argument in the context. + + # map.connect('/art/new', controller='art', action='new') + # map.connect('/art/upload', controller='art', action='upload') + # map.connect('show_art', '/art/{id}', controller='art', action='show') + # map.connect('/art/{id}/tag', controller='art', action='tag') + + # map.connect('/tag/{id}/delete', controller='tag', action='delete') + + map.connect('search', '/search', controller='search', action='index') + # map.connect( '/search/{query}', controller='search', action='index') + map.connect('saved_searches', '/search/list', controller='search', action='list') - map.connect('/tag/{id}/delete', controller='tag', action='delete') - map.connect('/search', controller='search', action='index') + # default routing is back so we can test stuff. + # please don't take it away until we have some more core features in. + map.connect('/{controller}/{action}') + map.connect('/{controller}/{action}/{id}') return map