Skip to content
Extraits de code Groupes Projets
base_geocoder.py 1,55 ko
Newer Older
  • Learn to ignore specific revisions
  • # © 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])