summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2018-04-16 12:33:49 +0200
committerChristophe Simonis <chs@odoo.com>2018-04-16 12:33:49 +0200
commitaab0908818ab4bee0af136d4e693a90ab1b2d261 (patch)
tree6e70a833e43c139f010c019cb2a774baa38379fe /addons
parent412501a5dc8f8826f10eac0c19adfa82527ad4bb (diff)
parentc92d43c04b7025440a9919a2ab37b0d714c53d24 (diff)
[MERGE] forward port branch 10.0 up to c92d43c04b7
Diffstat (limited to 'addons')
-rw-r--r--addons/sale/wizard/sale_make_invoice_advance.py2
-rw-r--r--addons/website/geoipresolver.py60
-rw-r--r--addons/website/models/ir_http.py21
3 files changed, 69 insertions, 14 deletions
diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py
index ac7d9587d22..c04685a84aa 100644
--- a/addons/sale/wizard/sale_make_invoice_advance.py
+++ b/addons/sale/wizard/sale_make_invoice_advance.py
@@ -65,7 +65,7 @@ class SaleAdvancePaymentInv(models.TransientModel):
account_id = False
if self.product_id.id:
- account_id = self.product_id.property_account_income_id.id
+ account_id = self.product_id.property_account_income_id.id or self.product_id.categ_id.property_account_income_categ_id.id
if not account_id:
inc_acc = ir_property_obj.get('property_account_income_categ_id', 'product.category')
account_id = order.fiscal_position_id.map_account(inc_acc).id if inc_acc else False
diff --git a/addons/website/geoipresolver.py b/addons/website/geoipresolver.py
new file mode 100644
index 00000000000..1f9b0e22724
--- /dev/null
+++ b/addons/website/geoipresolver.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+import os.path
+
+try:
+ import GeoIP # Legacy
+except ImportError:
+ GeoIP = None
+
+try:
+ import geoip2
+ import geoip2.database
+except ImportError:
+ geoip2 = None
+
+class GeoIPResolver(object):
+ def __init__(self, fname):
+ self.fname = fname
+ try:
+ self._db = geoip2.database.Reader(fname)
+ self.version = 2
+ except Exception:
+ try:
+ self._db = GeoIP.open(fname, GeoIP.GEOIP_STANDARD)
+ self.version = 1
+ assert self._db.database_info is not None
+ except Exception:
+ raise ValueError('Invalid GeoIP database: %r' % fname)
+
+ def __del__(self):
+ if self.version == 2:
+ self._db.close()
+
+ @classmethod
+ def open(cls, fname):
+ if not GeoIP and not geoip2:
+ return None
+ if not os.path.exists(fname):
+ return None
+ return GeoIPResolver(fname)
+
+ def resolve(self, ip):
+ if self.version == 1:
+ return self._db.record_by_addr(ip) or {}
+ elif self.version == 2:
+ try:
+ r = self._db.city(ip)
+ except (ValueError, geoip2.errors.AddressNotFoundError):
+ return {}
+ return {
+ 'city': r.city.name,
+ 'country_code': r.country.iso_code,
+ 'country_name': r.country.name,
+ 'region': r.subdivisions[0].iso_code if r.subdivisions else None,
+ 'time_zone': r.location.time_zone,
+ }
+
+ # compat
+ def record_by_addr(self, addr):
+ return self.resolve(addr)
diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py
index ae25b716c59..e04b486a54a 100644
--- a/addons/website/models/ir_http.py
+++ b/addons/website/models/ir_http.py
@@ -14,7 +14,7 @@ import odoo
from odoo import api, models
from odoo import SUPERUSER_ID
from odoo.http import request
-from odoo.tools import config
+from odoo.tools import config, ustr
from odoo.exceptions import QWebException
from odoo.tools.safe_eval import safe_eval
@@ -22,6 +22,8 @@ from odoo.addons.base import ir
from odoo.addons.website.models.website import slug, url_for, _UNSLUG_RE
+from ..geoipresolver import GeoIPResolver
+
logger = logging.getLogger(__name__)
# global resolver (GeoIP API is thread-safe, for multithreaded workers)
@@ -100,25 +102,18 @@ class Http(models.AbstractModel):
if odoo._geoip_resolver is not None:
cls._geoip_resolver = odoo._geoip_resolver
return
+ geofile = config.get('geoip_database')
try:
- import GeoIP
- # updated database can be downloaded on MaxMind website
- # http://dev.maxmind.com/geoip/legacy/install/city/
- geofile = config.get('geoip_database')
- if os.path.exists(geofile):
- odoo._geoip_resolver = GeoIP.open(geofile, GeoIP.GEOIP_STANDARD)
- else:
- odoo._geoip_resolver = False
- logger.warning('GeoIP database file %r does not exists, apt-get install geoip-database-contrib or download it from http://dev.maxmind.com/geoip/legacy/install/city/', geofile)
- except ImportError:
- odoo._geoip_resolver = False
+ odoo._geoip_resolver = GeoIPResolver.open(geofile) or False
+ except Exception as e:
+ logger.warning('Cannot load GeoIP: %s', ustr(e))
@classmethod
def _geoip_resolve(cls):
if 'geoip' not in request.session:
record = {}
if odoo._geoip_resolver and request.httprequest.remote_addr:
- record = odoo._geoip_resolver.record_by_addr(request.httprequest.remote_addr) or {}
+ record = odoo._geoip_resolver.resolve(request.httprequest.remote_addr) or {}
request.session['geoip'] = record
@classmethod