89 lines
3.7 KiB
Python
89 lines
3.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
##############################################################################
|
|
#
|
|
# OpenERP, Open Source Management Solution
|
|
# Copyright (C) 2013_Today OpenERP SA (<http://www.openerp.com>).
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
##############################################################################
|
|
|
|
try:
|
|
import simplejson as json
|
|
except ImportError:
|
|
import json # noqa
|
|
import urllib
|
|
|
|
from openerp.osv import osv, fields
|
|
from openerp import tools
|
|
from openerp.tools.translate import _
|
|
|
|
|
|
def geo_find(addr):
|
|
url = 'https://maps.googleapis.com/maps/api/geocode/json?sensor=false&address='
|
|
url += urllib.quote(addr.encode('utf8'))
|
|
|
|
try:
|
|
result = json.load(urllib.urlopen(url))
|
|
except Exception, e:
|
|
raise osv.except_osv(_('Network error'),
|
|
_('Cannot contact geolocation servers. Please make sure that your internet connection is up and running (%s).') % e)
|
|
if result['status'] != 'OK':
|
|
return None
|
|
|
|
try:
|
|
geo = result['results'][0]['geometry']['location']
|
|
return float(geo['lat']), float(geo['lng'])
|
|
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 res_partner(osv.osv):
|
|
_inherit = "res.partner"
|
|
|
|
_columns = {
|
|
'partner_latitude': fields.float('Geo Latitude', digits=(16, 5)),
|
|
'partner_longitude': fields.float('Geo Longitude', digits=(16, 5)),
|
|
'date_localization': fields.date('Geo Localization Date'),
|
|
}
|
|
|
|
def geo_localize(self, cr, uid, ids, context=None):
|
|
# Don't pass context to browse()! We need country names in english below
|
|
for partner in self.browse(cr, uid, ids):
|
|
if not partner:
|
|
continue
|
|
result = geo_find(geo_query_address(street=partner.street,
|
|
zip=partner.zip,
|
|
city=partner.city,
|
|
state=partner.state_id.name,
|
|
country=partner.country_id.name))
|
|
if result:
|
|
self.write(cr, uid, [partner.id], {
|
|
'partner_latitude': result[0],
|
|
'partner_longitude': result[1],
|
|
'date_localization': fields.date.context_today(self, cr, uid, context=context)
|
|
}, context=context)
|
|
return True
|