Alessandro Molina avatar Alessandro Molina committed 3ef2c37

Bring mtr changes but recover mobile.agents config option to avoid breaking apps that used it

Comments (0)

Files changed (2)

 Customizing User Agents Detection
 -----------------------------------
 
-**MobileMiddleware** by default checks user agent with a set of regular expressions defined in **DetectMobileBrowser**.  If you want to customize how mobile browsers are detected, you may create you own class, perhaps inheriting from **DetectMobileBrowser**, or callable object and supply it as an argument to **MobileMiddleware**, like::
+If you want to quickly customize the regular expression used to detect the mobile browser you can define *mobile.agents* 
+configuration variable in your application config file and set it to the regular expression that you want to use.
+
+For more complex customizations, you may create your own subclass of **DetectMobileBrowser**, 
+or callable object and supply it as an argument to **MobileMiddleware**, like::
 
     return MobileMiddleware(app, app_conf, mobile_browser_detector=YourClass)
 
-Please not that the argument to mobile_browser_detector can also be a
-general functor.
+**DetectMobileBrowser** behaviour can be changed by any subclass by overridding the **DetectMobileBrowser.perform_detection** method.
+If user has defined a custom regular expression it will be available inside the *perform_dection* method as *self.custom_mobile_re*

tgext/mobilemiddleware/middleware.py

     reg_v = re.compile(r"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|e\\-|e\\/|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\\-|2|g)|yas\\-|your|zeto|zte\\-", re.I|re.M)
 
     def __init__(self, application, config):
-        pass
-    
-    def _recognize_ua(self, request):
-        user_agent = request.headers.get('User-Agent', None)
-        
-        return user_agent and (self.reg_b.search(user_agent)
-                               or self.reg_v.search(user_agent[:4]))
+        super(DetectMobileBrowser, self).__init__()
+
+        mobile_re_config = config.get('mobile.agents', False)
+        if mobile_re_config:
+            self.custom_mobile_re = re.compile(mobile_re_config, re.I|re.M)
+            self._recognize_ua = self._recognize_ua_custom
+        else:
+            self.custom_mobile_re = None
+            self._recognize_ua = self._recognize_ua_default
+   
+    def _recognize_ua_custom(self, user_agent):
+        return self.custom_mobile_re.search(user_agent)
+
+    def _recognize_ua_default(self, user_agent):
+        return self.reg_b.search(user_agent) or self.reg_v.search(user_agent[:4])
+ 
+    def perform_detection(self, request):
+        user_agent = request.headers.get('User-Agent', None) 
+        return user_agent and self._recognize_ua(user_agent)
 
     def __call__(self, request):
-        return self._recognize_ua(request)
+        return self.perform_detection(request)
 
 class MobileMiddleware(object):
     def __init__(self, application, config,
             
     def __call__(self, environ, start_response):
         request = Request(environ)
-
         request.is_mobile = self.detect_mobile(request)
-
         response = request.get_response(self.application)
-        
         return response(environ, start_response)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.