[MERGE] forward port of branch saas-5 up to e4cb520
[odoo/odoo.git] / addons / website / models / ir_http.py
index 4d8c4a9..8c09c99 100644 (file)
@@ -2,16 +2,20 @@
 import datetime
 import hashlib
 import logging
+import os
 import re
 import traceback
+
 import werkzeug
 import werkzeug.routing
+import werkzeug.utils
 
 import openerp
 from openerp.addons.base import ir
 from openerp.addons.base.ir import ir_qweb
 from openerp.addons.website.models.website import slug, url_for, _UNSLUG_RE
 from openerp.http import request
+from openerp.tools import config
 from openerp.osv import orm
 
 logger = logging.getLogger(__name__)
@@ -24,6 +28,7 @@ class ir_http(orm.AbstractModel):
     _inherit = 'ir.http'
 
     rerouting_limit = 10
+    geo_ip_resolver = None
 
     def _get_converters(self):
         return dict(
@@ -53,6 +58,25 @@ 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'])
@@ -92,20 +116,20 @@ class ir_http(orm.AbstractModel):
         return self._dispatch()
 
     def _postprocess_args(self, arguments, rule):
-        if not getattr(request, 'website_enabled', False):
-            return super(ir_http, self)._postprocess_args(arguments, rule)
+        super(ir_http, self)._postprocess_args(arguments, rule)
 
-        for arg, val in arguments.items():
+        for key, val in arguments.items():
             # Replace uid placeholder by the current request.uid
-            if isinstance(val, orm.browse_record) and isinstance(val._uid, RequestUID):
-                val._uid = request.uid
+            if isinstance(val, orm.BaseModel) and isinstance(val._uid, RequestUID):
+                arguments[key] = val.sudo(request.uid)
+
         try:
             _, path = rule.build(arguments)
             assert path is not None
         except Exception, e:
             return self._handle_exception(e, code=404)
 
-        if request.httprequest.method in ('GET', 'HEAD'):
+        if getattr(request, 'website_multilang', False) and request.httprequest.method in ('GET', 'HEAD'):
             generated_path = werkzeug.url_unquote_plus(path)
             current_path = werkzeug.url_unquote_plus(request.httprequest.path)
             if generated_path != current_path: