X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;ds=sidebyside;f=bluechips%2Flib%2Fbase.py;h=d04f98160d38c95a8e50171c704ae34378c37263;hb=91c2916731b30a0c43a2259dad2228c51421a06c;hp=d94eeb664e40d3fda2561fda30b042f1f50e3893;hpb=3b08315d7a6dee99e751f16b9a5a050884bf54f8;p=bluechips.git diff --git a/bluechips/lib/base.py b/bluechips/lib/base.py index d94eeb6..d04f981 100644 --- a/bluechips/lib/base.py +++ b/bluechips/lib/base.py @@ -2,19 +2,20 @@ Provides the BaseController class for subclassing. """ -from pylons import tmpl_context as c + +from decorator import decorator + +from pylons import request, session, tmpl_context as c from pylons.controllers import WSGIController from pylons.i18n import _, ungettext, N_ -from pylons.templating import render_mako as render +from pylons.templating import render_mako -from tw.mods.pylonshf import validate, valid +from mako.exceptions import TopLevelLookupException import bluechips.lib.helpers as h from bluechips import model from bluechips.model import meta -from paste.request import construct_url -from paste.httpexceptions import HTTPMovedPermanently class BaseController(WSGIController): @@ -23,17 +24,7 @@ class BaseController(WSGIController): # WSGIController.__call__ dispatches to the Controller method # the request is routed to. This routing information is # available in environ['pylons.routes_dict'] - if environ['pylons.routes_dict']['controller'] != 'error': - if environ['PATH_INFO'].endswith('/index'): - environ['PATH_INFO'] = environ['PATH_INFO'][:-5] - raise HTTPMovedPermanently(construct_url(environ)) - if not environ['PATH_INFO'].endswith('/') and \ - environ['pylons.routes_dict']['action'] == 'index': - environ['PATH_INFO'] += '/' - raise HTTPMovedPermanently(construct_url(environ)) try: - c.user = meta.Session.query(model.User).\ - filter_by(username=unicode(environ['REMOTE_USER'])).one() return WSGIController.__call__(self, environ, start_response) finally: meta.Session.remove() @@ -45,6 +36,36 @@ def update_sar(record, form_result): for key, value in form_result.items(): setattr(record, key, value) -__all__ = ['c', 'h', 'render', 'validate', 'valid', - 'model', 'meta', '_', 'ungettext', 'N_', 'BaseController', - 'update_sar'] +def redirect_on_get(action): + """ + Decorator for a controller action. If the action is called with a GET + method, 302 redirect to the action specified. + """ + + @decorator + def redirect_on_get_wrap(func, *args, **kwargs): + if request.method == 'GET': + controller = request.environ['pylons.routes_dict']['controller'] + return h.redirect_to(controller=controller, action=action) + else: + return func(*args, **kwargs) + return redirect_on_get_wrap + +def render(name, *args, **kwargs): + if any([x in request.user_agent for x in ('iPhone','webOS')]): + if 'use_non_mobile' in request.params: + session['use_non_mobile'] = (request.params['use_non_mobile'] == + 'yes') + if session.get('use_non_mobile'): + c.mobile_client = True + else: + try: + return render_mako('/mobile' + name, *args, **kwargs) + except TopLevelLookupException: + # If a mobile template doesn't exist for this page, don't show + # the 'use mobile interface' link. + c.mobile_client = False + return render_mako(name, *args, **kwargs) + +__all__ = ['c', 'h', 'render', 'model', 'meta', '_', 'ungettext', 'N_', + 'BaseController', 'update_sar', 'redirect_on_get']