require_POST = dict(conditions={'method': ['POST']})
# get rid of trailing slashes
- map.redirect('/*(url)/', '/{url}',
- _redirect_code='301 Moved Permanently')
+ # map.redirect('/*(url)/', '/{url}',
+ # _redirect_code='301 Moved Permanently')
# The ErrorController route (handles 404/500 error pages); it should
map.connect('/error/{action}', controller='error')
map.connect('/error/{action}/{id}', controller='error')
- map.connect('/', controller='main', action='index')
-
- # 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)
-
- map.connect('/users', controller='users', action='list')
- map.connect('user_page', '/users/{name}', controller='users', action='view')
-
- # Art stuff
- 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.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.
-
+
# 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')