[MERGE] Forward-port of saas-5 up to 9ce08b7
authorOlivier Dony <odo@openerp.com>
Mon, 8 Sep 2014 14:53:11 +0000 (16:53 +0200)
committerOlivier Dony <odo@openerp.com>
Mon, 8 Sep 2014 14:54:10 +0000 (16:54 +0200)
1  2 
addons/stock_account/stock_account.py
addons/website/models/ir_http.py
openerp/addons/base/ir/ir_http.py
openerp/http.py

Simple merge
@@@ -58,56 -53,23 +58,60 @@@ class ir_http(orm.AbstractModel)
  
          request.website_multilang = request.website_enabled and func and func.routing.get('multilang', True)
  
 +        if 'geoip' not in request.session:
 +            record = {}
 +            if self.geo_ip_resolver is None:
 +                try:
 +                    import GeoIP
 +                    # updated database can be downloaded on MaxMind website
 +                    # http://dev.maxmind.com/geoip/legacy/install/city/
 +                    geofile = config.get('geoip_database', '/usr/share/GeoIP/GeoLiteCity.dat')
 +                    if os.path.exists(geofile):
 +                        self.geo_ip_resolver = GeoIP.open(geofile, GeoIP.GEOIP_STANDARD)
 +                    else:
 +                        self.geo_ip_resolver = False
 +                        logger.warning('GeoIP database file %r does not exists', geofile)
 +                except ImportError:
 +                    self.geo_ip_resolver = False
 +            if self.geo_ip_resolver and request.httprequest.remote_addr:
 +                record = self.geo_ip_resolver.record_by_addr(request.httprequest.remote_addr) or {}
 +            request.session['geoip'] = record
 +            
          if request.website_enabled:
-             if func:
-                 self._authenticate(func.routing['auth'])
-             else:
-                 self._auth_method_public()
+             try:
+                 if func:
+                     self._authenticate(func.routing['auth'])
+                 else:
+                     self._auth_method_public()
+             except Exception as e:
+                 return self._handle_exception(e)
 -            request.redirect = lambda url: werkzeug.utils.redirect(url_for(url))
 +            request.redirect = lambda url, code=302: werkzeug.utils.redirect(url_for(url), code)
              request.website = request.registry['website'].get_current_website(request.cr, request.uid, context=request.context)
 +            langs = [lg[0] for lg in request.website.get_languages()]
 +            path = request.httprequest.path.split('/')
              if first_pass:
 -                request.lang = request.website.default_lang_code
 +                if request.website_multilang:
 +                    # If the url doesn't contains the lang and that it's the first connection, we to retreive the user preference if it exists.
 +                    if not path[1] in langs and not request.httprequest.cookies.get('session_id'):
 +                        if request.lang not in langs:
 +                            # Try to find a similar lang. Eg: fr_BE and fr_FR
 +                            short = request.lang.split('_')[0]
 +                            langs_withshort = [lg[0] for lg in request.website.get_languages() if lg[0].startswith(short)]
 +                            if len(langs_withshort):
 +                                request.lang = langs_withshort[0]
 +                            else:
 +                                request.lang = request.website.default_lang_code
 +                        # We redirect with the right language in url
 +                        if request.lang != request.website.default_lang_code:
 +                            path.insert(1, request.lang)
 +                            path = '/'.join(path) or '/'
 +                            return request.redirect(path + '?' + request.httprequest.query_string)
 +                    else:
 +                        request.lang = request.website.default_lang_code
 +
              request.context['lang'] = request.lang
              if not func:
 -                path = request.httprequest.path.split('/')
 -                langs = [lg[0] for lg in request.website.get_languages()]
                  if path[1] in langs:
                      request.lang = request.context['lang'] = path.pop(1)
                      path = '/'.join(path) or '/'
Simple merge
diff --cc openerp/http.py
Simple merge