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__)
_inherit = 'ir.http'
rerouting_limit = 10
+ geo_ip_resolver = None
def _get_converters(self):
return dict(
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'])
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: