X-Git-Url: http://git.veekun.com/zzz-floof.git/blobdiff_plain/324ea2adc265de0c02ea56328f5f0a420dbaa999..f263f51648eef9739caa92e19ec45b32d7a1e49e:/floof/config/routing.py?ds=inline diff --git a/floof/config/routing.py b/floof/config/routing.py index 6ec64e4..f6906f4 100644 --- a/floof/config/routing.py +++ b/floof/config/routing.py @@ -12,6 +12,7 @@ def make_map(): map = Mapper(directory=config['pylons.paths']['controllers'], 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 @@ -20,34 +21,85 @@ def make_map(): 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') map.connect('/error/{action}/{id}', controller='error') - map.connect('/', controller='main', action='index') + map.connect('home', '/', controller='main', action='index') + + # Account stuff + with map.submapper(controller="account") as sub: + sub.connect('login', '/account/login', action='login') + sub.connect('login_begin', '/account/login_begin', action='login_begin', **require_POST) + sub.connect('login_finish', '/account/login_finish', action='login_finish') + sub.connect('logout', '/account/logout', action='logout', **require_POST) + sub.connect('register', '/account/register', action='register') + sub.connect('register_finish', '/account/register_finish', action='register_finish', **require_POST) + + # Specific user stuff + with map.submapper(controller='users') as sub: + sub.connect( '/users', action='list') + sub.connect('user_page', '/users/{name}', action='view') + with map.submapper(controller='user_settings') as sub: + sub.connect( '/users/{name}/settings/relationships/toggle', + action='rel_toggle', **require_POST) + + # Comments + with map.submapper(controller='comments') as sub: + sub.connect('/*owner_url/comments', action='thread') + sub.connect('/*owner_url/comments/reply', action='reply') + sub.connect('/*owner_url/comments/reply_done', action='reply_done', **require_POST) + sub.connect('/*owner_url/comments/{id}', action='thread') + sub.connect('/*owner_url/comments/{id}/reply', action='reply') + sub.connect('/*owner_url/comments/{id}/reply_done', action='reply_done', **require_POST) + + # Art + with map.submapper(controller="art") as sub: + sub.connect('new_art', '/art/new', action="new") + sub.connect('create_art', '/art/create', action="create") + sub.connect('rate_art', '/art/{id}/rate', action="rate") + sub.connect('show_art', '/art/{id}', action="show") + + # Some art pages pertain to a specific user, but still belong in the art + # controller + map.connect('/users/{name}/watchstream', controller='art', action='watchstream') + + with map.submapper(controller='tag') as sub: + sub.connect('delete_tag', '/art/{art_id}/tag/{id}') + sub.connect('create_tag', '/art/{art_id}/tag') + + with map.submapper(controller='relation') as sub: + sub.connect('create_relation', '/art/{art_id}/relations/{kind}/create', action="create") + # TODO: conditions: kind = by|for|of|character? + + 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. - # User stuff - map.connect('/account/login', controller='account', action='login') - map.connect('/account/login_begin', controller='account', action='login_begin', **require_POST) - map.connect('/account/login_finish', controller='account', action='login_finish') - map.connect('/account/logout', controller='account', action='logout', **require_POST) - map.connect('/account/register', controller='account', action='register') - map.connect('/account/register_finish', controller='account', action='register_finish', **require_POST) + # 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. - map.connect('/users', controller='users', action='list') - map.connect('/users/{name}', controller='users', action='view') + # 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. - # Art stuff - 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('/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('/tag/{id}/delete', controller='tag', action='delete') map.connect('search', '/search', controller='search', action='index') - map.connect('/search/list', controller='search', action='list') + # map.connect( '/search/{query}', controller='search', action='index') + map.connect('saved_searches', '/search/list', controller='search', action='list') # default routing is back so we can test stuff.