From 0b41ed36f92a1973dda66e7479e062cd9658678a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonel=20C=C3=A2mara?= Date: Sun, 6 Aug 2017 19:20:01 +0100 Subject: [PATCH 1/2] mobilize is back Fixes #1721 --- gluon/contrib/user_agent_parser.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/gluon/contrib/user_agent_parser.py b/gluon/contrib/user_agent_parser.py index bba1e436..61fee028 100644 --- a/gluon/contrib/user_agent_parser.py +++ b/gluon/contrib/user_agent_parser.py @@ -673,3 +673,20 @@ 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. + """ + 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() From 8533fa0d00106f621c865f9db04a6044c84bf484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonel=20C=C3=A2mara?= Date: Tue, 8 Aug 2017 00:50:55 +0100 Subject: [PATCH 2/2] put is_mobile and is_tablet in the result of user_agent() --- gluon/contrib/user_agent_parser.py | 3 +++ gluon/globals.py | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gluon/contrib/user_agent_parser.py b/gluon/contrib/user_agent_parser.py index 61fee028..f966b616 100644 --- a/gluon/contrib/user_agent_parser.py +++ b/gluon/contrib/user_agent_parser.py @@ -678,6 +678,9 @@ def simple_detect(agent): 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 diff --git a/gluon/globals.py b/gluon/globals.py index 267ea661..e2ec33f1 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):