diff --git a/gluon/contrib/user_agent_parser.py b/gluon/contrib/user_agent_parser.py index bba1e436..f966b616 100644 --- a/gluon/contrib/user_agent_parser.py +++ b/gluon/contrib/user_agent_parser.py @@ -673,3 +673,23 @@ def simple_detect(agent): if os_version: os = " ".join((os, os_version)) return os, browser + + +class mobilize(object): + """ + Decorator for controller functions so they use different views for mobile devices. + + WARNING: If you update httpagentparser make sure to leave mobilize for + backwards compatibility. + """ + def __init__(self, func): + self.func = func + + def __call__(self): + from gluon import current + user_agent = current.request.user_agent() + if user_agent.is_mobile: + items = current.response.view.split('.') + items.insert(-1, 'mobile') + current.response.view = '.'.join(items) + return self.func() diff --git a/gluon/globals.py b/gluon/globals.py index 7ec9a0a1..c47c596c 100644 --- a/gluon/globals.py +++ b/gluon/globals.py @@ -331,11 +331,16 @@ class Request(Storage): user_agent = session._user_agent if user_agent: return user_agent - user_agent = user_agent_parser.detect(self.env.http_user_agent) + http_user_agent = self.env.http_user_agent + user_agent = user_agent_parser.detect(http_user_agent) for key, value in user_agent.items(): if isinstance(value, dict): user_agent[key] = Storage(value) - user_agent = session._user_agent = Storage(user_agent) + user_agent = Storage(user_agent) + user_agent.is_mobile = 'Mobile' in http_user_agent + user_agent.is_tablet = 'Tablet' in http_user_agent + session._user_agent = user_agent + return user_agent def requires_https(self):