From 16b31f45b33329df39470af2a3acf086d21278f6 Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Tue, 10 Mar 2015 20:14:00 +0100 Subject: [PATCH 01/31] [ADD] New module extending base_geolocalize The modul add a new field 'geo_point' computed from partner_latitue and partner_longitude added by base_geolocalize. The geo_point is rendered in a map on the partner form --- geoengine_base_geolocalize/README.rst | 35 +++++++++++++++ geoengine_base_geolocalize/__init__.py | 21 +++++++++ geoengine_base_geolocalize/__openerp__.py | 39 +++++++++++++++++ geoengine_base_geolocalize/models/__init__.py | 21 +++++++++ .../models/res_partner.py | 40 ++++++++++++++++++ .../static/description/icon.png | Bin 0 -> 130328 bytes .../views/res_partner_view.xml | 16 +++++++ 7 files changed, 172 insertions(+) create mode 100644 geoengine_base_geolocalize/README.rst create mode 100644 geoengine_base_geolocalize/__init__.py create mode 100644 geoengine_base_geolocalize/__openerp__.py create mode 100644 geoengine_base_geolocalize/models/__init__.py create mode 100644 geoengine_base_geolocalize/models/res_partner.py create mode 100644 geoengine_base_geolocalize/static/description/icon.png create mode 100644 geoengine_base_geolocalize/views/res_partner_view.xml diff --git a/geoengine_base_geolocalize/README.rst b/geoengine_base_geolocalize/README.rst new file mode 100644 index 000000000..57beded68 --- /dev/null +++ b/geoengine_base_geolocalize/README.rst @@ -0,0 +1,35 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License + +Geospatial support for base_geolocalize +======================================= + +Geolocalise your partner based on longitude and latitude provided by base_geolocalize. + + +Installation +============ + +Take a look at the installation section in the description of the module +'base_geoengine'. + +Credits +======= + +Contributors +------------ + +* Laurent Mignon + +Maintainer +---------- + +.. image:: http://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: http://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/geoengine_base_geolocalize/__init__.py b/geoengine_base_geolocalize/__init__.py new file mode 100644 index 000000000..ec0571a70 --- /dev/null +++ b/geoengine_base_geolocalize/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Laurent Mignon +# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) +# +# 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 . +# +############################################################################## +from . import models diff --git a/geoengine_base_geolocalize/__openerp__.py b/geoengine_base_geolocalize/__openerp__.py new file mode 100644 index 000000000..3b7ea48cd --- /dev/null +++ b/geoengine_base_geolocalize/__openerp__.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Laurent Mignon +# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) +# +# 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 . +# +############################################################################## +{'name': 'Geospatial support for base_geolocalize', + 'version': '0.1', + 'category': 'GeoBI', + 'author': "ACSONE SA/NV, Odoo Community Association (OCA)", + 'license': 'AGPL-3', + 'website': 'http://www.acsone.eu', + 'depends': [ + 'base', + 'geoengine_partner', + 'base_geolocalize', + ], + 'data': [ + 'views/res_partner_view.xml' + ], + 'installable': True, + 'application': True, + 'autoinstall': True, + 'active': False, + } diff --git a/geoengine_base_geolocalize/models/__init__.py b/geoengine_base_geolocalize/models/__init__.py new file mode 100644 index 000000000..fcb3548e6 --- /dev/null +++ b/geoengine_base_geolocalize/models/__init__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Laurent Mignon +# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) +# +# 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 . +# +############################################################################## +from . import res_partner diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py new file mode 100644 index 000000000..e6306b605 --- /dev/null +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Laurent Mignon +# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) +# +# 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 . +# +############################################################################## + +from openerp import api + +from openerp.addons.base_geoengine import geo_model +from openerp.addons.base_geoengine import fields + + +class ResPartner(geo_model.GeoModel): + """Add geo_point to partner using a function field""" + _inherit = "res.partner" + + @api.depends('partner_latitude', 'partner_longitude') + def _get_geo_point(self): + if not self.partner_latitude or not self.partner_longitude: + self.geo_point = False + self.geo_point = fields.GeoPoint.from_latlon( + self.env.cr, self.partner_latitude, self.partner_longitude) + + geo_point = fields.GeoPoint( + readonly=True, store=True, compute='_get_geo_point') diff --git a/geoengine_base_geolocalize/static/description/icon.png b/geoengine_base_geolocalize/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b698310eefcab016c8372b688f495daacd3fe746 GIT binary patch literal 130328 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%0Aj5`*?xx_dV0 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 r#?5d*H!pjPiQ)gh{vW@AZ28Ba(=vW3ul + + + + geo_partner_form + res.partner + + + + + + + + + From 4d46547d0dee49dbb60a5083e2d7a0b967c8eff4 Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Tue, 31 Mar 2015 13:32:13 +0200 Subject: [PATCH 02/31] [FIX] add missing api decorator --- geoengine_base_geolocalize/models/res_partner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index e6306b605..abdd1e120 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -29,6 +29,7 @@ class ResPartner(geo_model.GeoModel): """Add geo_point to partner using a function field""" _inherit = "res.partner" + @api.one @api.depends('partner_latitude', 'partner_longitude') def _get_geo_point(self): if not self.partner_latitude or not self.partner_longitude: From 0a490a5985dad39ea7b803cbdd5860e74ab987d0 Mon Sep 17 00:00:00 2001 From: Laurent Mignon Date: Tue, 2 Jun 2015 10:24:50 +0200 Subject: [PATCH 03/31] [FIX] Add bug tracker url to the module description --- geoengine_base_geolocalize/README.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/geoengine_base_geolocalize/README.rst b/geoengine_base_geolocalize/README.rst index 57beded68..8b09d3d3c 100644 --- a/geoengine_base_geolocalize/README.rst +++ b/geoengine_base_geolocalize/README.rst @@ -13,6 +13,15 @@ Installation Take a look at the installation section in the description of the module 'base_geoengine'. +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed feedback +`here `_. + + Credits ======= From cb1bd3250b3a9dda0a86d969793202eba80aadb3 Mon Sep 17 00:00:00 2001 From: Laurent Mignon Date: Tue, 2 Jun 2015 14:57:09 +0200 Subject: [PATCH 04/31] Use the Nominatim service of OpenStreetMap to retrieve OSM data by address --- geoengine_base_geolocalize/README.rst | 11 +++- geoengine_base_geolocalize/__openerp__.py | 3 + .../models/res_partner.py | 57 +++++++++++++++++-- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/geoengine_base_geolocalize/README.rst b/geoengine_base_geolocalize/README.rst index 8b09d3d3c..ac333308e 100644 --- a/geoengine_base_geolocalize/README.rst +++ b/geoengine_base_geolocalize/README.rst @@ -4,8 +4,11 @@ Geospatial support for base_geolocalize ======================================= -Geolocalise your partner based on longitude and latitude provided by base_geolocalize. - +Geolocalise your partner based on longitude and latitude provided by +`OpenStreetMap via its Nominatim service +`_. Please read carefully the +`usage policy `_ +before using the module. Installation ============ @@ -13,6 +16,10 @@ Installation Take a look at the installation section in the description of the module 'base_geoengine'. +The module also requires one additional python libs: + +* `requests `_ + Bug Tracker =========== diff --git a/geoengine_base_geolocalize/__openerp__.py b/geoengine_base_geolocalize/__openerp__.py index 3b7ea48cd..b01e47efc 100644 --- a/geoengine_base_geolocalize/__openerp__.py +++ b/geoengine_base_geolocalize/__openerp__.py @@ -29,6 +29,9 @@ 'geoengine_partner', 'base_geolocalize', ], + 'external_dependencies': { + 'python': ['requests'], + }, 'data': [ 'views/res_partner_view.xml' ], diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index abdd1e120..f8ed0b377 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -19,23 +19,68 @@ # ############################################################################## -from openerp import api - +import logging +from openerp import api, fields +from openerp import exceptions +from openerp.tools.translate import _ from openerp.addons.base_geoengine import geo_model -from openerp.addons.base_geoengine import fields +from openerp.addons.base_geoengine import fields as geo_fields + +try: + import requests +except ImportError: + logger = logging.getLogger(__name__) + logger.warning('Shapely or geojson are not available in the sys path') + +_logger = logging.getLogger(__name__) class ResPartner(geo_model.GeoModel): """Add geo_point to partner using a function field""" _inherit = "res.partner" + @api.one + def geocode_address(self): + """Get the latitude and longitude by requesting "mapquestapi" + see http://open.mapquestapi.com/geocoding/ + """ + url = 'http://nominatim.openstreetmap.org/search' + pay_load = { + 'limit': 1, + 'format': 'json', + 'street': self.street or '', + 'postalCode': self.zip or '', + 'city': self.city or '', + 'state': self.state_id and self.state_id.name or '', + 'country': self.country_id and self.country_id.name or ''} + + r = requests.get(url, params=pay_load) + try: + r.raise_for_status() + except Exception as e: + _logger.exception('Geocoding error') + raise exceptions.Warning(_( + 'Geocoding error. \n %s') % e.message) + vals = r.json() + vals = vals and vals[0] or {} + self.write({ + 'partner_latitude': vals.get('lat'), + 'partner_longitude': vals.get('lon'), + 'date_localization': fields.Date.today()}) + + @api.one + def geo_localize(self): + self.geocode_address() + return True + @api.one @api.depends('partner_latitude', 'partner_longitude') def _get_geo_point(self): if not self.partner_latitude or not self.partner_longitude: self.geo_point = False - self.geo_point = fields.GeoPoint.from_latlon( - self.env.cr, self.partner_latitude, self.partner_longitude) + else: + self.geo_point = geo_fields.GeoPoint.from_latlon( + self.env.cr, self.partner_latitude, self.partner_longitude) - geo_point = fields.GeoPoint( + geo_point = geo_fields.GeoPoint( readonly=True, store=True, compute='_get_geo_point') From 972099015ee126f77b9486e45019ecefcf1438d6 Mon Sep 17 00:00:00 2001 From: Laurent Mignon Date: Tue, 2 Jun 2015 15:27:23 +0200 Subject: [PATCH 05/31] [IMP] Use the countryCode when querying OSM --- geoengine_base_geolocalize/models/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index f8ed0b377..294114096 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -52,7 +52,7 @@ def geocode_address(self): 'postalCode': self.zip or '', 'city': self.city or '', 'state': self.state_id and self.state_id.name or '', - 'country': self.country_id and self.country_id.name or ''} + 'countryCodes': self.country_id and self.country_id.code or ''} r = requests.get(url, params=pay_load) try: From fcdf99b7f7edf73ec1abeab07560aae7b955bd95 Mon Sep 17 00:00:00 2001 From: Laurent Mignon Date: Tue, 2 Jun 2015 15:45:51 +0200 Subject: [PATCH 06/31] [IMP] Use the countryCode and the country name when querying OSM --- geoengine_base_geolocalize/models/res_partner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index 294114096..f71cdda95 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -52,6 +52,7 @@ def geocode_address(self): 'postalCode': self.zip or '', 'city': self.city or '', 'state': self.state_id and self.state_id.name or '', + 'country': self.country_id and self.country_id.name or '', 'countryCodes': self.country_id and self.country_id.code or ''} r = requests.get(url, params=pay_load) From c2aba4a5c1d2068fad29e286db812e7ac49a310d Mon Sep 17 00:00:00 2001 From: Laurent Mignon Date: Tue, 2 Jun 2015 15:50:16 +0200 Subject: [PATCH 07/31] [PEP8] --- geoengine_base_geolocalize/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoengine_base_geolocalize/__openerp__.py b/geoengine_base_geolocalize/__openerp__.py index b01e47efc..6ab1eeb67 100644 --- a/geoengine_base_geolocalize/__openerp__.py +++ b/geoengine_base_geolocalize/__openerp__.py @@ -31,7 +31,7 @@ ], 'external_dependencies': { 'python': ['requests'], - }, + }, 'data': [ 'views/res_partner_view.xml' ], From 555b8a686a0faa762f82a51f0363e1fb502e5464 Mon Sep 17 00:00:00 2001 From: Laurent Mignon Date: Tue, 2 Jun 2015 16:40:26 +0200 Subject: [PATCH 08/31] [FIX] log message --- geoengine_base_geolocalize/models/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index f71cdda95..761f21470 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -30,7 +30,7 @@ import requests except ImportError: logger = logging.getLogger(__name__) - logger.warning('Shapely or geojson are not available in the sys path') + logger.warning('requests is not available in the sys path') _logger = logging.getLogger(__name__) From 38b33055d5f7a37b72e9c8f79adf3f244f723477 Mon Sep 17 00:00:00 2001 From: Laurent Mignon Date: Tue, 2 Jun 2015 16:43:29 +0200 Subject: [PATCH 09/31] [FIX] Better naming --- geoengine_base_geolocalize/models/res_partner.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index 761f21470..ceaf567db 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -55,14 +55,14 @@ def geocode_address(self): 'country': self.country_id and self.country_id.name or '', 'countryCodes': self.country_id and self.country_id.code or ''} - r = requests.get(url, params=pay_load) + request_result = requests.get(url, params=pay_load) try: - r.raise_for_status() + request_result.raise_for_status() except Exception as e: _logger.exception('Geocoding error') raise exceptions.Warning(_( 'Geocoding error. \n %s') % e.message) - vals = r.json() + vals = request_result.json() vals = vals and vals[0] or {} self.write({ 'partner_latitude': vals.get('lat'), From 95c5dee33dcfc4e8987a98284b6b9772dc56d0bb Mon Sep 17 00:00:00 2001 From: Jonathan Nemry Date: Tue, 2 Jun 2015 15:47:55 +0200 Subject: [PATCH 10/31] [ADD] some tests [FIX] * _get_geo_path method: fix condition * fix name of class bulk_encoder --- .../models/res_partner.py | 7 +++ geoengine_base_geolocalize/tests/__init__.py | 3 + .../tests/test_geoengine_partner.py | 61 +++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 geoengine_base_geolocalize/tests/__init__.py create mode 100644 geoengine_base_geolocalize/tests/test_geoengine_partner.py diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index ceaf567db..87fc2384e 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -77,6 +77,13 @@ def geo_localize(self): @api.one @api.depends('partner_latitude', 'partner_longitude') def _get_geo_point(self): + """ + Set the `geo_point` of the partner depending of its `partner_latitude` + and its `partner_longitude` + **Notes** + If one of those parameters is not set then reset the partner's + geo_point and do not recompute it + """ if not self.partner_latitude or not self.partner_longitude: self.geo_point = False else: diff --git a/geoengine_base_geolocalize/tests/__init__.py b/geoengine_base_geolocalize/tests/__init__.py new file mode 100644 index 000000000..1da520946 --- /dev/null +++ b/geoengine_base_geolocalize/tests/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import test_geoengine_partner diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py new file mode 100644 index 000000000..c4fa9e912 --- /dev/null +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# +# +# Authors: Jonathan Nemry +# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) +# +# 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 . +# +import openerp.tests.common as common + + +class TestGeoengineProjects(common.TransactionCase): + + def setUp(self): + common.TransactionCase.setUp(self) + + def test_get_geo_point(self): + partner_id = self.env.ref('base.user_root').partner_id + partner_id.partner_longitude = False + partner_id.partner_latitude = False + self.assertFalse( + partner_id.geo_point, 'Should not have geo_point with no latlon') + partner_id.partner_latitude = 20 + self.assertFalse( + partner_id.geo_point, 'Should not have geo_point with no latlon') + partner_id.partner_longitude = 20 + self.assertTrue( + partner_id.geo_point, 'Should have geo_point') + + def test_geo_localize(self): + vals = { + 'name': 'Partner Project', + 'street': 'Rue au bois la dame', + 'country_id': self.env.ref('base.be').id, + 'zip': '6800', + } + partner_id = self.env['res.partner'].create(vals) + partner_id.name = 'Other Partner' + partner_id.geo_localize() + self.assertAlmostEqual( + partner_id.partner_latitude, 49.95122, 5, + 'Latitude Should be equals') + self.assertAlmostEqual( + partner_id.partner_longitude, 5.3872, 5, + 'Longitude Should be equals') + domain = [('id', '=', partner_id.id)] + partner_id.unlink() + self.assertFalse( + self.env['res.partner'].search(domain), + 'Should not have this partner anymore') From bf868d3f0361e5f0196f50c538e8c3acfedf91c8 Mon Sep 17 00:00:00 2001 From: Laurent Mignon Date: Wed, 3 Jun 2015 12:18:01 +0200 Subject: [PATCH 11/31] [FIX] Adapt tests since the coordinates returned by OSM are not the same as Google Map --- geoengine_base_geolocalize/tests/test_geoengine_partner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py index c4fa9e912..1eaccf10e 100644 --- a/geoengine_base_geolocalize/tests/test_geoengine_partner.py +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -49,10 +49,10 @@ def test_geo_localize(self): partner_id.name = 'Other Partner' partner_id.geo_localize() self.assertAlmostEqual( - partner_id.partner_latitude, 49.95122, 5, + partner_id.partner_latitude, 49.95353, 5, 'Latitude Should be equals') self.assertAlmostEqual( - partner_id.partner_longitude, 5.3872, 5, + partner_id.partner_longitude, 5.40539, 5, 'Longitude Should be equals') domain = [('id', '=', partner_id.id)] partner_id.unlink() From 8efc4b8332c6a056b606691f69fb43a11cc96a9a Mon Sep 17 00:00:00 2001 From: "Jonathan Nemry (ACSONE)" Date: Fri, 17 Jul 2015 10:17:39 +0200 Subject: [PATCH 12/31] [CHG] * add a tracker into README.rst * rename test class --- geoengine_base_geolocalize/tests/test_geoengine_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py index 1eaccf10e..bdebff2b9 100644 --- a/geoengine_base_geolocalize/tests/test_geoengine_partner.py +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -20,7 +20,7 @@ import openerp.tests.common as common -class TestGeoengineProjects(common.TransactionCase): +class TestGeoenginePartner(common.TransactionCase): def setUp(self): common.TransactionCase.setUp(self) From 0dbe0d376b2aa239f5a309c169311bac21514d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Fri, 9 Oct 2015 10:00:17 +0200 Subject: [PATCH 13/31] [UPD] prefix versions with 8.0 --- geoengine_base_geolocalize/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoengine_base_geolocalize/__openerp__.py b/geoengine_base_geolocalize/__openerp__.py index 6ab1eeb67..7b3909b20 100644 --- a/geoengine_base_geolocalize/__openerp__.py +++ b/geoengine_base_geolocalize/__openerp__.py @@ -19,7 +19,7 @@ # ############################################################################## {'name': 'Geospatial support for base_geolocalize', - 'version': '0.1', + 'version': '8.0.0.1.0', 'category': 'GeoBI', 'author': "ACSONE SA/NV, Odoo Community Association (OCA)", 'license': 'AGPL-3', From a0671d8416d4b861d0a87970f5aef404262e0ba0 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 14 Oct 2015 02:25:35 +0200 Subject: [PATCH 14/31] [MIG] Make modules uninstallable --- geoengine_base_geolocalize/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoengine_base_geolocalize/__openerp__.py b/geoengine_base_geolocalize/__openerp__.py index 7b3909b20..e079e5360 100644 --- a/geoengine_base_geolocalize/__openerp__.py +++ b/geoengine_base_geolocalize/__openerp__.py @@ -35,7 +35,7 @@ 'data': [ 'views/res_partner_view.xml' ], - 'installable': True, + 'installable': False, 'application': True, 'autoinstall': True, 'active': False, From 0a3e2968c97cf711a9d673e3e58981334b80c45a Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 6 Oct 2016 14:51:48 +0200 Subject: [PATCH 15/31] [MIG] Rename manifest files --- geoengine_base_geolocalize/{__openerp__.py => __manifest__.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename geoengine_base_geolocalize/{__openerp__.py => __manifest__.py} (100%) diff --git a/geoengine_base_geolocalize/__openerp__.py b/geoengine_base_geolocalize/__manifest__.py similarity index 100% rename from geoengine_base_geolocalize/__openerp__.py rename to geoengine_base_geolocalize/__manifest__.py From ed58f5db7ba33efd0bf630020decab4591933ba8 Mon Sep 17 00:00:00 2001 From: Emanuel Cino Date: Fri, 20 Apr 2018 14:34:15 +0200 Subject: [PATCH 16/31] [FIX] Replace openerp imports --- geoengine_base_geolocalize/models/res_partner.py | 10 +++++----- .../tests/test_geoengine_partner.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index 87fc2384e..ef5f06eb2 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -20,11 +20,11 @@ ############################################################################## import logging -from openerp import api, fields -from openerp import exceptions -from openerp.tools.translate import _ -from openerp.addons.base_geoengine import geo_model -from openerp.addons.base_geoengine import fields as geo_fields +from odoo import api, fields +from odoo import exceptions +from odoo.tools.translate import _ +from odoo.addons.base_geoengine import geo_model +from odoo.addons.base_geoengine import fields as geo_fields try: import requests diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py index bdebff2b9..0c7c1887f 100644 --- a/geoengine_base_geolocalize/tests/test_geoengine_partner.py +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -17,7 +17,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # -import openerp.tests.common as common +import odoo.tests.common as common class TestGeoenginePartner(common.TransactionCase): From 5a72509690fddf48ada09fc4ae537cb1900dbf08 Mon Sep 17 00:00:00 2001 From: Benjamin Willig Date: Mon, 2 Oct 2017 12:04:12 +0200 Subject: [PATCH 17/31] [MIG] geoengine_base_geolocalize migration --- geoengine_base_geolocalize/__manifest__.py | 67 ++++++--------- geoengine_base_geolocalize/models/__init__.py | 20 ----- .../models/res_partner.py | 81 +++++++------------ .../tests/test_geoengine_partner.py | 23 +----- .../views/res_partner_view.xml | 28 +++---- 5 files changed, 71 insertions(+), 148 deletions(-) diff --git a/geoengine_base_geolocalize/__manifest__.py b/geoengine_base_geolocalize/__manifest__.py index e079e5360..68db218ad 100644 --- a/geoengine_base_geolocalize/__manifest__.py +++ b/geoengine_base_geolocalize/__manifest__.py @@ -1,42 +1,27 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Author: Laurent Mignon -# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) -# -# 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 . -# -############################################################################## -{'name': 'Geospatial support for base_geolocalize', - 'version': '8.0.0.1.0', - 'category': 'GeoBI', - 'author': "ACSONE SA/NV, Odoo Community Association (OCA)", - 'license': 'AGPL-3', - 'website': 'http://www.acsone.eu', - 'depends': [ - 'base', - 'geoengine_partner', - 'base_geolocalize', - ], - 'external_dependencies': { - 'python': ['requests'], - }, - 'data': [ - 'views/res_partner_view.xml' - ], - 'installable': False, - 'application': True, - 'autoinstall': True, - 'active': False, - } +# Copyright 2015-2017 ACSONE SA/NV () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + 'name': 'Geospatial support for base_geolocalize', + 'version': '10.0.1.0.0', + 'category': 'GeoBI', + 'author': "ACSONE SA/NV, Odoo Community Association (OCA)", + 'license': 'AGPL-3', + 'website': 'https://github.com/OCA/geospatial', + 'depends': [ + 'base', + 'geoengine_partner', + 'base_geolocalize', + 'base_geolocalize_openstreetmap', + ], + 'external_dependencies': { + 'python': [ + 'requests' + ], + }, + 'data': [ + 'views/res_partner_view.xml' + ], + 'application': True, + 'autoinstall': True, +} diff --git a/geoengine_base_geolocalize/models/__init__.py b/geoengine_base_geolocalize/models/__init__.py index fcb3548e6..91fed54d4 100644 --- a/geoengine_base_geolocalize/models/__init__.py +++ b/geoengine_base_geolocalize/models/__init__.py @@ -1,21 +1 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Author: Laurent Mignon -# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) -# -# 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 . -# -############################################################################## from . import res_partner diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index ef5f06eb2..d5ce2fda2 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -1,23 +1,6 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Author: Laurent Mignon -# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) -# -# 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 . -# -############################################################################## +# Copyright 2015 ACSONE SA/NV () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import logging from odoo import api, fields @@ -39,44 +22,37 @@ class ResPartner(geo_model.GeoModel): """Add geo_point to partner using a function field""" _inherit = "res.partner" - @api.one + @api.multi def geocode_address(self): """Get the latitude and longitude by requesting "mapquestapi" see http://open.mapquestapi.com/geocoding/ """ - url = 'http://nominatim.openstreetmap.org/search' - pay_load = { - 'limit': 1, - 'format': 'json', - 'street': self.street or '', - 'postalCode': self.zip or '', - 'city': self.city or '', - 'state': self.state_id and self.state_id.name or '', - 'country': self.country_id and self.country_id.name or '', - 'countryCodes': self.country_id and self.country_id.code or ''} - - request_result = requests.get(url, params=pay_load) - try: - request_result.raise_for_status() - except Exception as e: - _logger.exception('Geocoding error') - raise exceptions.Warning(_( - 'Geocoding error. \n %s') % e.message) - vals = request_result.json() - vals = vals and vals[0] or {} + self.ensure_one() + values = self.env[ + 'geoengine.geolocalize.openstreetmap' + ]._geocode_address( + self.street or '', + self.zip or '', + self.city or '', + self.state_id and self.state_id.name or '', + self.country_id and self.country_id.name or '', + self.country_id and self.country_id.code or '', + ) self.write({ - 'partner_latitude': vals.get('lat'), - 'partner_longitude': vals.get('lon'), - 'date_localization': fields.Date.today()}) + 'partner_latitude': values.get('lat'), + 'partner_longitude': values.get('lon'), + 'date_localization': fields.Date.today() + }) - @api.one + @api.multi def geo_localize(self): + self.ensure_one() self.geocode_address() return True - @api.one + @api.multi @api.depends('partner_latitude', 'partner_longitude') - def _get_geo_point(self): + def _compute_geo_point(self): """ Set the `geo_point` of the partner depending of its `partner_latitude` and its `partner_longitude` @@ -84,11 +60,12 @@ def _get_geo_point(self): If one of those parameters is not set then reset the partner's geo_point and do not recompute it """ - if not self.partner_latitude or not self.partner_longitude: - self.geo_point = False - else: - self.geo_point = geo_fields.GeoPoint.from_latlon( - self.env.cr, self.partner_latitude, self.partner_longitude) + for rec in self: + if not rec.partner_latitude or not rec.partner_longitude: + rec.geo_point = False + else: + rec.geo_point = geo_fields.GeoPoint.from_latlon( + rec.env.cr, rec.partner_latitude, rec.partner_longitude) geo_point = geo_fields.GeoPoint( - readonly=True, store=True, compute='_get_geo_point') + readonly=True, store=True, compute='_compute_geo_point') diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py index 0c7c1887f..75fdef188 100644 --- a/geoengine_base_geolocalize/tests/test_geoengine_partner.py +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -1,30 +1,11 @@ # -*- coding: utf-8 -*- -# -# -# Authors: Jonathan Nemry -# Copyright (c) 2015 Acsone SA/NV (http://www.acsone.eu) -# -# 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 . -# +# Copyright 2015-2017 ACSONE SA/NV () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import odoo.tests.common as common class TestGeoenginePartner(common.TransactionCase): - def setUp(self): - common.TransactionCase.setUp(self) - def test_get_geo_point(self): partner_id = self.env.ref('base.user_root').partner_id partner_id.partner_longitude = False diff --git a/geoengine_base_geolocalize/views/res_partner_view.xml b/geoengine_base_geolocalize/views/res_partner_view.xml index 29d419061..fcba4ec1d 100644 --- a/geoengine_base_geolocalize/views/res_partner_view.xml +++ b/geoengine_base_geolocalize/views/res_partner_view.xml @@ -1,16 +1,16 @@ - - - - geo_partner_form - res.partner - - - - - + + + + geo_partner_form + res.partner + + + + - - - + + + + From ec6d7a2be38aa05653525a94e2aeec79412b72c5 Mon Sep 17 00:00:00 2001 From: Lindsay Date: Tue, 2 Jun 2020 09:40:13 +0200 Subject: [PATCH 18/31] split the search for address using OSM + testing --- geoengine_base_geolocalize/__manifest__.py | 2 - .../models/res_partner.py | 38 ++++++------------- .../views/res_partner_view.xml | 4 +- 3 files changed, 13 insertions(+), 31 deletions(-) diff --git a/geoengine_base_geolocalize/__manifest__.py b/geoengine_base_geolocalize/__manifest__.py index 68db218ad..aae446203 100644 --- a/geoengine_base_geolocalize/__manifest__.py +++ b/geoengine_base_geolocalize/__manifest__.py @@ -11,8 +11,6 @@ 'depends': [ 'base', 'geoengine_partner', - 'base_geolocalize', - 'base_geolocalize_openstreetmap', ], 'external_dependencies': { 'python': [ diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index d5ce2fda2..b0399647f 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -22,33 +22,7 @@ class ResPartner(geo_model.GeoModel): """Add geo_point to partner using a function field""" _inherit = "res.partner" - @api.multi - def geocode_address(self): - """Get the latitude and longitude by requesting "mapquestapi" - see http://open.mapquestapi.com/geocoding/ - """ - self.ensure_one() - values = self.env[ - 'geoengine.geolocalize.openstreetmap' - ]._geocode_address( - self.street or '', - self.zip or '', - self.city or '', - self.state_id and self.state_id.name or '', - self.country_id and self.country_id.name or '', - self.country_id and self.country_id.code or '', - ) - self.write({ - 'partner_latitude': values.get('lat'), - 'partner_longitude': values.get('lon'), - 'date_localization': fields.Date.today() - }) - @api.multi - def geo_localize(self): - self.ensure_one() - self.geocode_address() - return True @api.multi @api.depends('partner_latitude', 'partner_longitude') @@ -68,4 +42,14 @@ def _compute_geo_point(self): rec.env.cr, rec.partner_latitude, rec.partner_longitude) geo_point = geo_fields.GeoPoint( - readonly=True, store=True, compute='_compute_geo_point') + store=True, compute='_compute_geo_point', inverse='_inverse_geo_point') + + @api.multi + def _inverse_geo_point(self): + for rec in self: + if not rec.geo_point: + # FIXME: For now, if no coordinates are provided, latitude and longitude are set to false + rec.partner_longitude, rec.partner_latitude = False, False + else: + rec.partner_longitude, rec.partner_latitude = geo_fields.GeoPoint.to_latlon(rec.env.cr, rec.geo_point) + \ No newline at end of file diff --git a/geoengine_base_geolocalize/views/res_partner_view.xml b/geoengine_base_geolocalize/views/res_partner_view.xml index fcba4ec1d..a535adcba 100644 --- a/geoengine_base_geolocalize/views/res_partner_view.xml +++ b/geoengine_base_geolocalize/views/res_partner_view.xml @@ -6,10 +6,10 @@ res.partner - + - + From 0cf22c0a5300bf0faf4fa7628f22ff61c33d614a Mon Sep 17 00:00:00 2001 From: Lindsay Date: Tue, 2 Jun 2020 15:08:04 +0200 Subject: [PATCH 19/31] [FIX] code format and pylint: Squashed commit of the following: commit 527e21551ce785168fdcacd85e949d04b7f4d439 Author: Lindsay Date: Tue Jun 2 14:47:52 2020 +0200 fixing typo commit dd9c3ecc2b870470228b8a65642730cf86b36734 Author: Lindsay Date: Tue Jun 2 14:42:47 2020 +0200 fixing pylint travis commit 7899f9b312da7c6023e6ddf3f007bfb6abe556db Author: Lindsay Date: Tue Jun 2 14:05:25 2020 +0200 fix travis flake8 linting commit 039e8670aa7938876e30efd6307358dd3019c8a4 Author: Lindsay Date: Tue Jun 2 13:54:07 2020 +0200 fix travis pylint commit fcfb09e0e3bddcda01071967d63b4cbc22d7dc15 Author: Lindsay Date: Tue Jun 2 13:45:09 2020 +0200 fixing travis tests commit ff2b39e66ddd6d8b73cd0150f0da527d88186031 Author: Lindsay Date: Tue Jun 2 12:07:45 2020 +0200 fix import commit cdf43dc0b6af7925fa2ac38acddcb93f743daf69 Author: Lindsay Date: Tue Jun 2 11:47:21 2020 +0200 add responses to travis for testing commit 79da0ee02a3ac76d605066f7a5d69ff336fb2bb5 Author: Lindsay Date: Tue Jun 2 11:40:55 2020 +0200 disable pylint warning W0622 commit d6eab49374d01cdff18f4a42c7e01ce0156f90dd Author: Lindsay Date: Tue Jun 2 10:29:58 2020 +0200 formatting for linters --- .../i18n/geoengine_base_geolocalize.pot | 20 +++++++++++++++++ .../models/res_partner.py | 22 ++++--------------- 2 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot diff --git a/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot b/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot new file mode 100644 index 000000000..ce8caf93f --- /dev/null +++ b/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot @@ -0,0 +1,20 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * geoengine_base_geolocalize +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: geoengine_base_geolocalize +#: model:ir.model,name:geoengine_base_geolocalize.model_res_partner +msgid "Partner" +msgstr "" + diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index b0399647f..858fedfc7 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -2,28 +2,15 @@ # Copyright 2015 ACSONE SA/NV () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -import logging -from odoo import api, fields -from odoo import exceptions -from odoo.tools.translate import _ +from odoo import api from odoo.addons.base_geoengine import geo_model from odoo.addons.base_geoengine import fields as geo_fields -try: - import requests -except ImportError: - logger = logging.getLogger(__name__) - logger.warning('requests is not available in the sys path') - -_logger = logging.getLogger(__name__) - class ResPartner(geo_model.GeoModel): """Add geo_point to partner using a function field""" _inherit = "res.partner" - - @api.multi @api.depends('partner_latitude', 'partner_longitude') def _compute_geo_point(self): @@ -48,8 +35,7 @@ def _compute_geo_point(self): def _inverse_geo_point(self): for rec in self: if not rec.geo_point: - # FIXME: For now, if no coordinates are provided, latitude and longitude are set to false - rec.partner_longitude, rec.partner_latitude = False, False + rec.partner_longitude, rec.partner_latitude = False, False else: - rec.partner_longitude, rec.partner_latitude = geo_fields.GeoPoint.to_latlon(rec.env.cr, rec.geo_point) - \ No newline at end of file + rec.partner_longitude, rec.partner_latitude = \ + geo_fields.GeoPoint.to_latlon(rec.env.cr, rec.geo_point) From 7938bff5187ac6af6df816dcf70f61dc170db440 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 19 Jun 2020 14:11:34 +0000 Subject: [PATCH 20/31] geoengine_base_geolocalize 10.0.1.0.1 --- geoengine_base_geolocalize/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geoengine_base_geolocalize/__manifest__.py b/geoengine_base_geolocalize/__manifest__.py index aae446203..abe55ec41 100644 --- a/geoengine_base_geolocalize/__manifest__.py +++ b/geoengine_base_geolocalize/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'Geospatial support for base_geolocalize', - 'version': '10.0.1.0.0', + 'version': '10.0.1.0.1', 'category': 'GeoBI', 'author': "ACSONE SA/NV, Odoo Community Association (OCA)", 'license': 'AGPL-3', From d22321babbca684c67afcea5b9efcff3c33d24ef Mon Sep 17 00:00:00 2001 From: sbejaoui Date: Mon, 6 Mar 2023 16:15:00 +0100 Subject: [PATCH 21/31] [16.0][MIG] - geoengine_base_geolocalize --- geoengine_base_geolocalize/__init__.py | 1 - geoengine_base_geolocalize/__manifest__.py | 32 +++++-------- .../i18n/geoengine_base_geolocalize.pot | 15 ++++-- .../models/res_partner.py | 28 +++++------ geoengine_base_geolocalize/tests/__init__.py | 2 - .../tests/test_geoengine_partner.py | 46 +++++++++---------- .../views/res_partner_view.xml | 15 ++++-- 7 files changed, 68 insertions(+), 71 deletions(-) diff --git a/geoengine_base_geolocalize/__init__.py b/geoengine_base_geolocalize/__init__.py index ec0571a70..19b92ca2b 100644 --- a/geoengine_base_geolocalize/__init__.py +++ b/geoengine_base_geolocalize/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- ############################################################################## # # Author: Laurent Mignon diff --git a/geoengine_base_geolocalize/__manifest__.py b/geoengine_base_geolocalize/__manifest__.py index abe55ec41..39a75ea27 100644 --- a/geoengine_base_geolocalize/__manifest__.py +++ b/geoengine_base_geolocalize/__manifest__.py @@ -1,25 +1,15 @@ -# -*- coding: utf-8 -*- # Copyright 2015-2017 ACSONE SA/NV () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { - 'name': 'Geospatial support for base_geolocalize', - 'version': '10.0.1.0.1', - 'category': 'GeoBI', - 'author': "ACSONE SA/NV, Odoo Community Association (OCA)", - 'license': 'AGPL-3', - 'website': 'https://github.com/OCA/geospatial', - 'depends': [ - 'base', - 'geoengine_partner', - ], - 'external_dependencies': { - 'python': [ - 'requests' - ], - }, - 'data': [ - 'views/res_partner_view.xml' - ], - 'application': True, - 'autoinstall': True, + "name": "Geospatial support for base_geolocalize", + "version": "16.0.1.0.1", + "category": "GeoBI", + "author": "ACSONE SA/NV, Odoo Community Association (OCA)", + "license": "AGPL-3", + "website": "https://github.com/OCA/geospatial", + "depends": ["base", "geoengine_partner", "base_geolocalize"], + "external_dependencies": {"python": ["requests"]}, + "data": ["views/res_partner_view.xml"], + "application": True, + "autoinstall": True, } diff --git a/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot b/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot index ce8caf93f..bf7f8e68d 100644 --- a/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot +++ b/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot @@ -1,12 +1,12 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * geoengine_base_geolocalize +# * geoengine_base_geolocalize # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 10.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: <>\n" +"Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -14,7 +14,12 @@ msgstr "" "Plural-Forms: \n" #. module: geoengine_base_geolocalize -#: model:ir.model,name:geoengine_base_geolocalize.model_res_partner -msgid "Partner" +#: model:ir.model.fields,field_description:geoengine_base_geolocalize.field_res_partner__geo_point +#: model:ir.model.fields,field_description:geoengine_base_geolocalize.field_res_users__geo_point +msgid "Address coordinates" msgstr "" +#. module: geoengine_base_geolocalize +#: model:ir.model,name:geoengine_base_geolocalize.model_res_partner +msgid "Contact" +msgstr "" diff --git a/geoengine_base_geolocalize/models/res_partner.py b/geoengine_base_geolocalize/models/res_partner.py index 858fedfc7..366397236 100644 --- a/geoengine_base_geolocalize/models/res_partner.py +++ b/geoengine_base_geolocalize/models/res_partner.py @@ -1,18 +1,15 @@ -# -*- coding: utf-8 -*- # Copyright 2015 ACSONE SA/NV () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import api -from odoo.addons.base_geoengine import geo_model -from odoo.addons.base_geoengine import fields as geo_fields +from odoo import api, fields, models -class ResPartner(geo_model.GeoModel): +class ResPartner(models.Model): """Add geo_point to partner using a function field""" + _inherit = "res.partner" - @api.multi - @api.depends('partner_latitude', 'partner_longitude') + @api.depends("partner_latitude", "partner_longitude") def _compute_geo_point(self): """ Set the `geo_point` of the partner depending of its `partner_latitude` @@ -25,17 +22,20 @@ def _compute_geo_point(self): if not rec.partner_latitude or not rec.partner_longitude: rec.geo_point = False else: - rec.geo_point = geo_fields.GeoPoint.from_latlon( - rec.env.cr, rec.partner_latitude, rec.partner_longitude) + rec.geo_point = fields.GeoPoint.from_latlon( + rec.env.cr, rec.partner_latitude, rec.partner_longitude + ) - geo_point = geo_fields.GeoPoint( - store=True, compute='_compute_geo_point', inverse='_inverse_geo_point') + geo_point = fields.GeoPoint( + store=True, compute="_compute_geo_point", inverse="_inverse_geo_point" + ) - @api.multi def _inverse_geo_point(self): for rec in self: if not rec.geo_point: rec.partner_longitude, rec.partner_latitude = False, False else: - rec.partner_longitude, rec.partner_latitude = \ - geo_fields.GeoPoint.to_latlon(rec.env.cr, rec.geo_point) + ( + rec.partner_longitude, + rec.partner_latitude, + ) = fields.GeoPoint.to_latlon(rec.env.cr, rec.geo_point) diff --git a/geoengine_base_geolocalize/tests/__init__.py b/geoengine_base_geolocalize/tests/__init__.py index 1da520946..f16f53569 100644 --- a/geoengine_base_geolocalize/tests/__init__.py +++ b/geoengine_base_geolocalize/tests/__init__.py @@ -1,3 +1 @@ -# -*- coding: utf-8 -*- - from . import test_geoengine_partner diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py index 75fdef188..03b86d783 100644 --- a/geoengine_base_geolocalize/tests/test_geoengine_partner.py +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -1,42 +1,42 @@ -# -*- coding: utf-8 -*- # Copyright 2015-2017 ACSONE SA/NV () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -import odoo.tests.common as common +from odoo.tests.common import TransactionCase -class TestGeoenginePartner(common.TransactionCase): - +class TestGeoenginePartner(TransactionCase): def test_get_geo_point(self): - partner_id = self.env.ref('base.user_root').partner_id + partner_id = self.env.ref("base.user_root").partner_id partner_id.partner_longitude = False partner_id.partner_latitude = False self.assertFalse( - partner_id.geo_point, 'Should not have geo_point with no latlon') + partner_id.geo_point, "Should not have geo_point with no latlon" + ) partner_id.partner_latitude = 20 self.assertFalse( - partner_id.geo_point, 'Should not have geo_point with no latlon') + partner_id.geo_point, "Should not have geo_point with no latlon" + ) partner_id.partner_longitude = 20 - self.assertTrue( - partner_id.geo_point, 'Should have geo_point') + self.assertTrue(partner_id.geo_point, "Should have geo_point") def test_geo_localize(self): vals = { - 'name': 'Partner Project', - 'street': 'Rue au bois la dame', - 'country_id': self.env.ref('base.be').id, - 'zip': '6800', + "name": "Partner Project", + "street": "Rue au bois la dame", + "country_id": self.env.ref("base.be").id, + "zip": "6800", } - partner_id = self.env['res.partner'].create(vals) - partner_id.name = 'Other Partner' - partner_id.geo_localize() + partner_id = self.env["res.partner"].create(vals) + partner_id.name = "Other Partner" + partner_id.with_context(force_geo_localize=True).geo_localize() self.assertAlmostEqual( - partner_id.partner_latitude, 49.95353, 5, - 'Latitude Should be equals') + partner_id.partner_latitude, 49.9535323, 2, "Latitude Should be equals" + ) self.assertAlmostEqual( - partner_id.partner_longitude, 5.40539, 5, - 'Longitude Should be equals') - domain = [('id', '=', partner_id.id)] + partner_id.partner_longitude, 5.4119073, 2, "Longitude Should be equals" + ) + domain = [("id", "=", partner_id.id)] partner_id.unlink() self.assertFalse( - self.env['res.partner'].search(domain), - 'Should not have this partner anymore') + self.env["res.partner"].search(domain), + "Should not have this partner anymore", + ) diff --git a/geoengine_base_geolocalize/views/res_partner_view.xml b/geoengine_base_geolocalize/views/res_partner_view.xml index a535adcba..1e1d104cf 100644 --- a/geoengine_base_geolocalize/views/res_partner_view.xml +++ b/geoengine_base_geolocalize/views/res_partner_view.xml @@ -1,14 +1,19 @@ - + - + geo_partner_form res.partner - + + + 1 + - + From d83517f9e71b043b2359aa650ad420c514d80793 Mon Sep 17 00:00:00 2001 From: mymage Date: Fri, 26 Jan 2024 07:19:26 +0000 Subject: [PATCH 22/31] Added translation using Weblate (Italian) --- geoengine_base_geolocalize/i18n/it.po | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 geoengine_base_geolocalize/i18n/it.po diff --git a/geoengine_base_geolocalize/i18n/it.po b/geoengine_base_geolocalize/i18n/it.po new file mode 100644 index 000000000..d0a37026f --- /dev/null +++ b/geoengine_base_geolocalize/i18n/it.po @@ -0,0 +1,28 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * geoengine_base_geolocalize +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-01-26 08:36+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: geoengine_base_geolocalize +#: model:ir.model.fields,field_description:geoengine_base_geolocalize.field_res_partner__geo_point +#: model:ir.model.fields,field_description:geoengine_base_geolocalize.field_res_users__geo_point +msgid "Address coordinates" +msgstr "Coordinate indirizzo" + +#. module: geoengine_base_geolocalize +#: model:ir.model,name:geoengine_base_geolocalize.model_res_partner +msgid "Contact" +msgstr "Contatto" From 4f3fa13cd472635a81d61a51d5e5354b53cd0f2a Mon Sep 17 00:00:00 2001 From: Antoni Marroig Campomar Date: Mon, 28 Oct 2024 08:30:50 +0100 Subject: [PATCH 23/31] [IMP] geoengine_base_geolocalize: pre-commit auto fixes --- geoengine_base_geolocalize/pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 geoengine_base_geolocalize/pyproject.toml diff --git a/geoengine_base_geolocalize/pyproject.toml b/geoengine_base_geolocalize/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/geoengine_base_geolocalize/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" From e476eda5221a137d9e871e2e7ddbc18bbc9959be Mon Sep 17 00:00:00 2001 From: Antoni Marroig Campomar Date: Mon, 28 Oct 2024 08:35:02 +0100 Subject: [PATCH 24/31] [MIG] geoengine_base_geolocalize: Migration to 17.0 --- geoengine_base_geolocalize/README.rst | 81 +++- geoengine_base_geolocalize/__manifest__.py | 2 +- .../i18n/geoengine_base_geolocalize.pot | 2 +- .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 3 + geoengine_base_geolocalize/readme/INSTALL.md | 6 + .../static/description/index.html | 442 ++++++++++++++++++ .../tests/test_geoengine_partner.py | 12 + 8 files changed, 530 insertions(+), 21 deletions(-) create mode 100644 geoengine_base_geolocalize/readme/CONTRIBUTORS.md create mode 100644 geoengine_base_geolocalize/readme/DESCRIPTION.md create mode 100644 geoengine_base_geolocalize/readme/INSTALL.md create mode 100644 geoengine_base_geolocalize/static/description/index.html diff --git a/geoengine_base_geolocalize/README.rst b/geoengine_base_geolocalize/README.rst index ac333308e..b5bd267f1 100644 --- a/geoengine_base_geolocalize/README.rst +++ b/geoengine_base_geolocalize/README.rst @@ -1,51 +1,94 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :alt: License - +======================================= Geospatial support for base_geolocalize ======================================= +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:d92cfbfb144aae040e97197cbecac7c6f4b663c59edb459339126e67473a5711 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fgeospatial-lightgray.png?logo=github + :target: https://github.com/OCA/geospatial/tree/17.0/geoengine_base_geolocalize + :alt: OCA/geospatial +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/geospatial-17-0/geospatial-17-0-geoengine_base_geolocalize + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/geospatial&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + Geolocalise your partner based on longitude and latitude provided by -`OpenStreetMap via its Nominatim service -`_. Please read carefully the -`usage policy `_ -before using the module. +`OpenStreetMap via its Nominatim +service `__. Please read +carefully the `usage +policy `__ +before using the module. + +**Table of contents** + +.. contents:: + :local: Installation ============ -Take a look at the installation section in the description of the module +Take a look at the installation section in the description of the module 'base_geoengine'. The module also requires one additional python libs: -* `requests `_ +- `requests `__ Bug Tracker =========== Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. -If you spotted it first, help us smashing it by providing a detailed and welcomed feedback -`here `_. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. +Do not contact contributors directly about support or help with technical issues. Credits ======= +Authors +------- + +* ACSONE SA/NV + Contributors ------------ -* Laurent Mignon +- Laurent Mignon +- `APSL-Nagarro `__: -Maintainer ----------- + - Antoni Marroig -.. image:: http://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: http://odoo-community.org +Maintainers +----------- This module is maintained by the OCA. -OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/geospatial `_ project on GitHub. -To contribute to this module, please visit http://odoo-community.org. +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/geoengine_base_geolocalize/__manifest__.py b/geoengine_base_geolocalize/__manifest__.py index 39a75ea27..a6b2b4e65 100644 --- a/geoengine_base_geolocalize/__manifest__.py +++ b/geoengine_base_geolocalize/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { "name": "Geospatial support for base_geolocalize", - "version": "16.0.1.0.1", + "version": "17.0.1.0.0", "category": "GeoBI", "author": "ACSONE SA/NV, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot b/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot index bf7f8e68d..d474910cf 100644 --- a/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot +++ b/geoengine_base_geolocalize/i18n/geoengine_base_geolocalize.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" diff --git a/geoengine_base_geolocalize/readme/CONTRIBUTORS.md b/geoengine_base_geolocalize/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..ec5970f4b --- /dev/null +++ b/geoengine_base_geolocalize/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- Laurent Mignon \<\> +- [APSL-Nagarro](https://www.apsl.tech): + - Antoni Marroig \<\> \ No newline at end of file diff --git a/geoengine_base_geolocalize/readme/DESCRIPTION.md b/geoengine_base_geolocalize/readme/DESCRIPTION.md new file mode 100644 index 000000000..455235eb1 --- /dev/null +++ b/geoengine_base_geolocalize/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +Geolocalise your partner based on longitude and latitude provided by +[OpenStreetMap via its Nominatim service](http://wiki.openstreetmap.org/wiki/Nominatim). Please read carefully the +[usage policy](https://operations.osmfoundation.org/policies/nominatim/) before using the module. \ No newline at end of file diff --git a/geoengine_base_geolocalize/readme/INSTALL.md b/geoengine_base_geolocalize/readme/INSTALL.md new file mode 100644 index 000000000..19c77a886 --- /dev/null +++ b/geoengine_base_geolocalize/readme/INSTALL.md @@ -0,0 +1,6 @@ +Take a look at the installation section in the description of the module +'base_geoengine'. + +The module also requires one additional python libs: + +- [requests](https://pypi.python.org/pypi/requests) \ No newline at end of file diff --git a/geoengine_base_geolocalize/static/description/index.html b/geoengine_base_geolocalize/static/description/index.html new file mode 100644 index 000000000..9e699fe02 --- /dev/null +++ b/geoengine_base_geolocalize/static/description/index.html @@ -0,0 +1,442 @@ + + + + + +Geospatial support for base_geolocalize + + + +
+

Geospatial support for base_geolocalize

+ + +

Beta License: AGPL-3 OCA/geospatial Translate me on Weblate Try me on Runboat

+

Geolocalise your partner based on longitude and latitude provided by +OpenStreetMap via its Nominatim +service. Please read +carefully the usage +policy +before using the module.

+

Table of contents

+ +
+

Installation

+

Take a look at the installation section in the description of the module +‘base_geoengine’.

+

The module also requires one additional python libs:

+ +
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/geospatial project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py index 03b86d783..3dc86bdc7 100644 --- a/geoengine_base_geolocalize/tests/test_geoengine_partner.py +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -1,9 +1,21 @@ # Copyright 2015-2017 ACSONE SA/NV () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import requests + from odoo.tests.common import TransactionCase class TestGeoenginePartner(TransactionCase): + @classmethod + def setUpClass(cls): + cls._super_send = requests.Session.send + super().setUpClass() + + @classmethod + def _request_handler(cls, s, r, /, **kw): + """Don't block external requests.""" + return cls._super_send(s, r, **kw) + def test_get_geo_point(self): partner_id = self.env.ref("base.user_root").partner_id partner_id.partner_longitude = False From 5fe5ea8f4285f1b11a49925e0c0a2c73f0880f24 Mon Sep 17 00:00:00 2001 From: xtanuiha Date: Mon, 25 Nov 2024 06:41:04 +0000 Subject: [PATCH 25/31] Added translation using Weblate (Chinese (Simplified) (zh_CN)) --- geoengine_base_geolocalize/i18n/zh_CN.po | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 geoengine_base_geolocalize/i18n/zh_CN.po diff --git a/geoengine_base_geolocalize/i18n/zh_CN.po b/geoengine_base_geolocalize/i18n/zh_CN.po new file mode 100644 index 000000000..e9fad85b1 --- /dev/null +++ b/geoengine_base_geolocalize/i18n/zh_CN.po @@ -0,0 +1,28 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * geoengine_base_geolocalize +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-11-25 09:06+0000\n" +"Last-Translator: xtanuiha \n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: geoengine_base_geolocalize +#: model:ir.model.fields,field_description:geoengine_base_geolocalize.field_res_partner__geo_point +#: model:ir.model.fields,field_description:geoengine_base_geolocalize.field_res_users__geo_point +msgid "Address coordinates" +msgstr "地址坐标" + +#. module: geoengine_base_geolocalize +#: model:ir.model,name:geoengine_base_geolocalize.model_res_partner +msgid "Contact" +msgstr "联系人" From 97e8a1ab5bacef8eb016b6dba42419d2225ba804 Mon Sep 17 00:00:00 2001 From: Yannick Payot Date: Wed, 25 Feb 2026 14:50:43 +0100 Subject: [PATCH 26/31] [FIX] geoengine_base_geoengine: avoid external calls in unit tests --- .../tests/test_geoengine_partner.py | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py index 3dc86bdc7..6e9acb6ff 100644 --- a/geoengine_base_geolocalize/tests/test_geoengine_partner.py +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -1,20 +1,59 @@ # Copyright 2015-2017 ACSONE SA/NV () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -import requests +import re + +from requests import PreparedRequest, Response, Session from odoo.tests.common import TransactionCase +PAYLOAD = [ + { + "place_id": 108312997, + "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright", + "osm_type": "way", + "osm_id": 318222295, + "lat": "49.9549071", + "lon": "5.4085830", + "class": "highway", + "type": "unclassified", + "place_rank": 26, + "importance": 0.053386585030899485, + "addresstype": "road", + "name": "Rue Au Bois la Dame", + "display_name": ( + "Rue Au Bois la Dame, Séviscourt, Bras, Libramont-Chevigny," + "Neufchâteau, Luxembourg, Wallonia, 6800, Belgium" + ), + "boundingbox": ["49.9535323", "49.9566288", "5.4053940", "5.4115772"], + } +] + +TEST_URL = "https://nominatim.openstreetmap.org/search?format=json&q=Rue+au+bois+la+dame%2C+6800%2C+Belgium" + class TestGeoenginePartner(TransactionCase): @classmethod def setUpClass(cls): - cls._super_send = requests.Session.send super().setUpClass() + cls.nominatim_osm_request_re = re.compile( + r"https://nominatim.openstreetmap.org/search\?format=json&q=(.*)" + ) + @classmethod - def _request_handler(cls, s, r, /, **kw): - """Don't block external requests.""" - return cls._super_send(s, r, **kw) + def _request_handler(cls, session: Session, request: PreparedRequest, /, **kwargs): + response = Response() + response.status_code = 200 + url = request.url.lower() + matching = cls.nominatim_osm_request_re.match(url) + if matching: + response = Response() + response.status_code = 200 + query = matching.group(1) + if query == "rue+au+bois+la+dame%2c+6800%2c+belgium": + response.json = lambda: PAYLOAD + return response + return super()._request_handler(session, request, **kwargs) def test_get_geo_point(self): partner_id = self.env.ref("base.user_root").partner_id From 8d24959ab58367df8dbe6849b52d885e466b3ebb Mon Sep 17 00:00:00 2001 From: Yannick Payot Date: Thu, 26 Feb 2026 18:34:32 +0100 Subject: [PATCH 27/31] Refactor _request_handler to simplify response setup Removed redundant response initialization in request handler. --- geoengine_base_geolocalize/tests/test_geoengine_partner.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py index 6e9acb6ff..7a82601b7 100644 --- a/geoengine_base_geolocalize/tests/test_geoengine_partner.py +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -42,8 +42,6 @@ def setUpClass(cls): @classmethod def _request_handler(cls, session: Session, request: PreparedRequest, /, **kwargs): - response = Response() - response.status_code = 200 url = request.url.lower() matching = cls.nominatim_osm_request_re.match(url) if matching: From f4ee6b876e67546732833f026b4e75d95a1ae4b6 Mon Sep 17 00:00:00 2001 From: Yannick Payot Date: Thu, 26 Feb 2026 18:35:27 +0100 Subject: [PATCH 28/31] Remove unused artifact --- geoengine_base_geolocalize/tests/test_geoengine_partner.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/geoengine_base_geolocalize/tests/test_geoengine_partner.py b/geoengine_base_geolocalize/tests/test_geoengine_partner.py index 7a82601b7..7b03c4d13 100644 --- a/geoengine_base_geolocalize/tests/test_geoengine_partner.py +++ b/geoengine_base_geolocalize/tests/test_geoengine_partner.py @@ -28,8 +28,6 @@ } ] -TEST_URL = "https://nominatim.openstreetmap.org/search?format=json&q=Rue+au+bois+la+dame%2C+6800%2C+Belgium" - class TestGeoenginePartner(TransactionCase): @classmethod From 426f68a1fd329990056d1f7cedbd6a24aaaa0c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Paradis?= Date: Fri, 10 Apr 2026 15:15:44 +0000 Subject: [PATCH 29/31] [IMP] geoengine_base_geolocalize: pre-commit auto fixes --- geoengine_base_geolocalize/views/res_partner_view.xml | 2 -- requirements.txt | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 requirements.txt diff --git a/geoengine_base_geolocalize/views/res_partner_view.xml b/geoengine_base_geolocalize/views/res_partner_view.xml index 1e1d104cf..4194dff5f 100644 --- a/geoengine_base_geolocalize/views/res_partner_view.xml +++ b/geoengine_base_geolocalize/views/res_partner_view.xml @@ -1,6 +1,5 @@ - geo_partner_form res.partner @@ -17,5 +16,4 @@
- diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..b4d39fb9e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +# generated from manifests external_dependencies +requests From 685caad4b17fec02f46910bc824cac2dcb37b0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Paradis?= Date: Fri, 10 Apr 2026 15:15:44 +0000 Subject: [PATCH 30/31] [MIG] geoengine_base_geolocalize: Migration to 19.0 --- geoengine_base_geolocalize/README.rst | 24 ++++++++------- geoengine_base_geolocalize/__manifest__.py | 2 +- .../static/description/index.html | 30 +++++++++++-------- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/geoengine_base_geolocalize/README.rst b/geoengine_base_geolocalize/README.rst index b5bd267f1..3a11e09ed 100644 --- a/geoengine_base_geolocalize/README.rst +++ b/geoengine_base_geolocalize/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ======================================= Geospatial support for base_geolocalize ======================================= @@ -13,17 +17,17 @@ Geospatial support for base_geolocalize .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fgeospatial-lightgray.png?logo=github - :target: https://github.com/OCA/geospatial/tree/17.0/geoengine_base_geolocalize + :target: https://github.com/OCA/geospatial/tree/19.0/geoengine_base_geolocalize :alt: OCA/geospatial .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/geospatial-17-0/geospatial-17-0-geoengine_base_geolocalize + :target: https://translation.odoo-community.org/projects/geospatial-19-0/geospatial-19-0-geoengine_base_geolocalize :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/geospatial&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/geospatial&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -48,7 +52,7 @@ Take a look at the installation section in the description of the module The module also requires one additional python libs: -- `requests `__ +- `requests `__ Bug Tracker =========== @@ -56,7 +60,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -71,10 +75,10 @@ Authors Contributors ------------ -- Laurent Mignon -- `APSL-Nagarro `__: +- Laurent Mignon +- `APSL-Nagarro `__: - - Antoni Marroig + - Antoni Marroig Maintainers ----------- @@ -89,6 +93,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/geospatial `_ project on GitHub. +This module is part of the `OCA/geospatial `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/geoengine_base_geolocalize/__manifest__.py b/geoengine_base_geolocalize/__manifest__.py index a6b2b4e65..456c29126 100644 --- a/geoengine_base_geolocalize/__manifest__.py +++ b/geoengine_base_geolocalize/__manifest__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { "name": "Geospatial support for base_geolocalize", - "version": "17.0.1.0.0", + "version": "19.0.1.0.0", "category": "GeoBI", "author": "ACSONE SA/NV, Odoo Community Association (OCA)", "license": "AGPL-3", diff --git a/geoengine_base_geolocalize/static/description/index.html b/geoengine_base_geolocalize/static/description/index.html index 9e699fe02..28fca0ef2 100644 --- a/geoengine_base_geolocalize/static/description/index.html +++ b/geoengine_base_geolocalize/static/description/index.html @@ -3,7 +3,7 @@ -Geospatial support for base_geolocalize +README.rst -
-

Geospatial support for base_geolocalize

+
+ + +Odoo Community Association + +
+

Geospatial support for base_geolocalize

-

Beta License: AGPL-3 OCA/geospatial Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/geospatial Translate me on Weblate Try me on Runboat

Geolocalise your partner based on longitude and latitude provided by OpenStreetMap via its Nominatim service. Please read @@ -390,7 +395,7 @@

Geospatial support for base_geolocalize

-

Installation

+

Installation

Take a look at the installation section in the description of the module ‘base_geoengine’.

The module also requires one additional python libs:

@@ -399,23 +404,23 @@

Installation

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • ACSONE SA/NV
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -433,10 +438,11 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/geospatial project on GitHub.

+

This module is part of the OCA/geospatial project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
From f654a021ba0ad2c0098369a0ee24ae01596e6438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Paradis?= Date: Fri, 10 Apr 2026 15:41:41 +0000 Subject: [PATCH 31/31] [DON'T MERGE] test-requirements.txt --- test-requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 test-requirements.txt diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 000000000..dab3d0e78 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,2 @@ +odoo-addon-base_geoengine @ git+https://github.com/OCA/geospatial.git@refs/pull/414/head#subdirectory=base_geoengine +odoo-addon-geoengine_partner @ git+https://github.com/OCA/geospatial.git@refs/pull/450/head#subdirectory=geoengine_partner