Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# © 2022 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import requests
import logging
from odoo import api, models, tools
_logger = logging.getLogger(__name__)
class GeoCoder(models.AbstractModel):
_inherit = "base.geocoder"
def _geo_query_address_adressedatagouv(self, street=None, zip=None, city=None, state=None, country=None):
address = ("%s %s %s %s" % (street or '', zip or '', city or '', 'France')).strip()
addr = address.replace(' ', '+')
if zip:
addr += '&postcode=%s' % zip
return addr
def _call_adressedatagouv(self, addr, **kw):
"""
Use French Address API Data Gouv service to retrieve location
:return: (latitude, longitude) or None if not found
"""
if not addr:
_logger.info('invalid address given')
return None
url = 'https://api-adresse.data.gouv.fr/search/?q='
try:
response = requests.get(url + addr)
_logger.info('Address API Gouv service called')
if response.status_code != 200:
_logger.error('Request to Address API Gouv failed.\nCode: %s\nContent: %s'
% (response.status_code, response.content))
result = response.json()
except Exception as e:
self._raise_query_error(e)
if result.get('features', False):
geo = result.get('features')[0].get('geometry').get('coordinates')
return float(geo[1]), float(geo[0])