Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 5c609e82af3b1c9128e8bf61b5ad064b4b5127b6
  • 14.0 par défaut
  • 12.0 protégée
  • 13.0
  • 12.0-lm-00 protégée
5 résultats

scop_address_wizard.py

Blame
  • res_partner.py 2,96 Kio
    # -*- coding: utf-8 -*-
    # Part of Odoo. See LICENSE file for full copyright and licensing details.
    import json
    import urllib2
    
    from odoo import api, fields, models, tools, _
    from odoo.exceptions import UserError
    
    import time
    
    def geo_find(addr):
        if not addr:
            return None
        url = 'https://nominatim.openstreetmap.org/search.php/'
        url += urllib2.quote(addr.encode('utf8'))
        url += '?format=json'
    
        try:
            result = json.load(urllib2.urlopen(url))
        except Exception as e:
            raise UserError(_('Cannot contact geolocation servers. Please make sure that your Internet connection is up and running (%s).') % e)
    
        try:
            if result:
                geo = result[0]
                return [float(geo['lat']), float(geo['lon'])]
            else:
                return None
        except (KeyError, ValueError):
            return None
    
    
    def geo_query_address(street=None, zip=None, city=None, state=None, country=None):
        if country and ',' in country and (country.endswith(' of') or country.endswith(' of the')):
            # put country qualifier in front, otherwise GMap gives wrong results,
            # e.g. 'Congo, Democratic Republic of the' => 'Democratic Republic of the Congo'
            country = '{1} {0}'.format(*country.split(',', 1))
        return tools.ustr(', '.join(filter(None, [street,
                                                  ("%s %s" % (zip or '', city or '')).strip(),
                                                  state,
                                                  country])))
    
    
    class ResPartner(models.Model):
        _inherit = "res.partner"
    
        partner_latitude = fields.Float(string='Geo Latitude', digits=(16, 5))
        partner_longitude = fields.Float(string='Geo Longitude', digits=(16, 5))
        date_localization = fields.Date(string='Geolocation Date')
    
        @api.multi
        def geo_localize(self):
            # We need country names in English below
            for partner in self.with_context(lang='en_US'):
                if partner.city:
                    result = geo_find(geo_query_address(street=partner.street,
                                                        zip=partner.zip,
                                                        city=partner.city,
                                                        country=partner.country_id.name))
    
                    if result is None:
                        result = geo_find(geo_query_address(
                            city=partner.city,
                            country=partner.country_id.name
                        ))
    
                    if result:
                        partner.write({
                            'partner_latitude': result[0],
                            'partner_longitude': result[1],
                            'date_localization': fields.Date.context_today(partner)
                        })
    
            return True
    
        ## CRON de géolocalisation des partner
        def _cron_geolocalize(self):
            partners = self.env['res.partner'].search([('partner_latitude','=', False)],)
            for p in partners:
                p.geo_localize()
                time.sleep(1)