diff options
| author | Thibault Delavallée <tde@openerp.com> | 2013-10-07 16:41:35 +0200 |
|---|---|---|
| committer | Thibault Delavallée <tde@openerp.com> | 2013-10-07 16:41:35 +0200 |
| commit | cc59f2d77a8b14c8536dc7a1b1bd59e0c9c044fc (patch) | |
| tree | c1bcdf3f51783050df3741c524b3b7596bf2d50d /addons/base_geolocalize/models/res_partner.py | |
| parent | dd2dd19b234cb5f3de05465215b745d3e93046c7 (diff) | |
[REF] crm_partner_assign: moved geolocalization stuff of res.partner inside a dedicated module.
[ADD] base_geolocalize, holding partner latitude, longitude and stuff necessary
for geo-localisation. This module will be used for the website, to be able to
use geo localization without having to rely on crm_partner_assign.
crm_partner_assign now contains the logic related to partner assignment and
opportunities geo localization.
bzr revid: tde@openerp.com-20131007144135-mwnpdznojr0ece7u
Diffstat (limited to 'addons/base_geolocalize/models/res_partner.py')
| -rw-r--r-- | addons/base_geolocalize/models/res_partner.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/addons/base_geolocalize/models/res_partner.py b/addons/base_geolocalize/models/res_partner.py new file mode 100644 index 00000000000..af43b990526 --- /dev/null +++ b/addons/base_geolocalize/models/res_partner.py @@ -0,0 +1,88 @@ +# -*- 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'), + 'partner_longitude': fields.float('Geo Longitude'), + '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 |
