From 434f539a47b59fdd027de5762735132617701911 Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Mon, 5 Oct 2026 22:48:18 +0200 Subject: [PATCH] [ADD] website_openstreetmap_link --- website_openstreetmap_link/README.rst | 94 ++++ website_openstreetmap_link/__init__.py | 1 + website_openstreetmap_link/__manifest__.py | 13 + website_openstreetmap_link/i18n/fr.po | 20 + website_openstreetmap_link/models/__init__.py | 1 + .../models/res_partner.py | 25 + website_openstreetmap_link/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 1 + .../readme/DESCRIPTION.md | 9 + .../static/description/index.html | 430 ++++++++++++++++++ .../description/website_event_exemple.png | Bin 0 -> 26577 bytes website_openstreetmap_link/tests/__init__.py | 1 + .../tests/test_website_openstreetmap_link.py | 40 ++ 13 files changed, 638 insertions(+) create mode 100644 website_openstreetmap_link/README.rst create mode 100644 website_openstreetmap_link/__init__.py create mode 100644 website_openstreetmap_link/__manifest__.py create mode 100644 website_openstreetmap_link/i18n/fr.po create mode 100644 website_openstreetmap_link/models/__init__.py create mode 100644 website_openstreetmap_link/models/res_partner.py create mode 100644 website_openstreetmap_link/pyproject.toml create mode 100644 website_openstreetmap_link/readme/CONTRIBUTORS.md create mode 100644 website_openstreetmap_link/readme/DESCRIPTION.md create mode 100644 website_openstreetmap_link/static/description/index.html create mode 100644 website_openstreetmap_link/static/description/website_event_exemple.png create mode 100644 website_openstreetmap_link/tests/__init__.py create mode 100644 website_openstreetmap_link/tests/test_website_openstreetmap_link.py diff --git a/website_openstreetmap_link/README.rst b/website_openstreetmap_link/README.rst new file mode 100644 index 0000000000..a2a5b6fe96 --- /dev/null +++ b/website_openstreetmap_link/README.rst @@ -0,0 +1,94 @@ +=========================== +Website OpenStreetMap Links +=========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:88ad463c621184b8de9692b19b2b15193505d0b794236c6c2a40d9c845b45ccd + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fwebsite-lightgray.png?logo=github + :target: https://github.com/OCA/website/tree/18.0/website_openstreetmap_link + :alt: OCA/website +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/website-18-0/website-18-0-website_openstreetmap_link + :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/website&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +By default, in Odoo when website module displays directions, it provides +an Google Map URL. + +With that module, it provides an OpenStreetMap URL. + +Also if the related partner has longitude and latitude defined, it used +it, instead of a approximative search URL. + +|website_event_exemple| + +.. |website_event_exemple| image:: https://raw.githubusercontent.com/OCA/website/18.0/website_openstreetmap_link/static/description/website_event_exemple.png + +**Table of contents** + +.. contents:: + :local: + +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 +------- + +* GRAP + +Contributors +------------ + +- Sylvain LE GAL + +Maintainers +----------- + +This module is maintained by the OCA. + +.. 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. + +.. |maintainer-legalsylvain| image:: https://github.com/legalsylvain.png?size=40px + :target: https://github.com/legalsylvain + :alt: legalsylvain + +Current `maintainer `__: + +|maintainer-legalsylvain| + +This module is part of the `OCA/website `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/website_openstreetmap_link/__init__.py b/website_openstreetmap_link/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/website_openstreetmap_link/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/website_openstreetmap_link/__manifest__.py b/website_openstreetmap_link/__manifest__.py new file mode 100644 index 0000000000..26e94db020 --- /dev/null +++ b/website_openstreetmap_link/__manifest__.py @@ -0,0 +1,13 @@ +# Copyright 2026 - Today: GRAP https://www.grap.coop +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +{ + "name": "Website OpenStreetMap Links", + "summary": "Replace google Map Links by OpenStreetMap Links.", + "version": "18.0.1.0.0", + "author": "GRAP, Odoo Community Association (OCA)", + "maintainers": ["legalsylvain"], + "website": "https://github.com/OCA/website", + "license": "AGPL-3", + "category": "Website", + "depends": ["website"], +} diff --git a/website_openstreetmap_link/i18n/fr.po b/website_openstreetmap_link/i18n/fr.po new file mode 100644 index 0000000000..ba9ad86c75 --- /dev/null +++ b/website_openstreetmap_link/i18n/fr.po @@ -0,0 +1,20 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_social_media_link +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: website_social_media_link +#: model_terms:ir.ui.view,arch_db:website_social_media_link.view_website_form +msgid "Social Media" +msgstr "Média Sociaux" diff --git a/website_openstreetmap_link/models/__init__.py b/website_openstreetmap_link/models/__init__.py new file mode 100644 index 0000000000..91fed54d40 --- /dev/null +++ b/website_openstreetmap_link/models/__init__.py @@ -0,0 +1 @@ +from . import res_partner diff --git a/website_openstreetmap_link/models/res_partner.py b/website_openstreetmap_link/models/res_partner.py new file mode 100644 index 0000000000..389d5fc014 --- /dev/null +++ b/website_openstreetmap_link/models/res_partner.py @@ -0,0 +1,25 @@ +# Copyright 2026 - Today: GRAP https://www.grap.coop +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +import werkzeug.urls + +from odoo import models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + def google_map_link(self, zoom=10): + self.ensure_one() + base_url = "https://www.openstreetmap.org" + country = self.country_id or self.env.company.country_id + lon, lat = self.partner_longitude, self.partner_latitude + if lon and lat: + return f"{base_url}/directions?from=&to={lat},{lon}#map={zoom}/{lat}/{lon}" + else: + params = { + "query": f"{self.street or ''}, {self.city or ''} {self.zip or ''}," + f" {country and country.display_name or ''}", + "zoom": zoom, + } + return f"{base_url}/search?" + werkzeug.urls.url_encode(params) diff --git a/website_openstreetmap_link/pyproject.toml b/website_openstreetmap_link/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/website_openstreetmap_link/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/website_openstreetmap_link/readme/CONTRIBUTORS.md b/website_openstreetmap_link/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..fea5f58349 --- /dev/null +++ b/website_openstreetmap_link/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Sylvain LE GAL \ No newline at end of file diff --git a/website_openstreetmap_link/readme/DESCRIPTION.md b/website_openstreetmap_link/readme/DESCRIPTION.md new file mode 100644 index 0000000000..5567606773 --- /dev/null +++ b/website_openstreetmap_link/readme/DESCRIPTION.md @@ -0,0 +1,9 @@ +By default, in Odoo when website module displays directions, +it provides an Google Map URL. + +With that module, it provides an OpenStreetMap URL. + +Also if the related partner has longitude and latitude defined, it used it, +instead of a approximative search URL. + +![website_event_exemple](../static/description/website_event_exemple.png) diff --git a/website_openstreetmap_link/static/description/index.html b/website_openstreetmap_link/static/description/index.html new file mode 100644 index 0000000000..d0531fd866 --- /dev/null +++ b/website_openstreetmap_link/static/description/index.html @@ -0,0 +1,430 @@ + + + + + +Website OpenStreetMap Links + + + + + + diff --git a/website_openstreetmap_link/static/description/website_event_exemple.png b/website_openstreetmap_link/static/description/website_event_exemple.png new file mode 100644 index 0000000000000000000000000000000000000000..69077de8e2e8c896c405bd17a11fc4aee227de60 GIT binary patch literal 26577 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 +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + + +from odoo.tests import TransactionCase + + +class TestModule(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner_with_address = cls.env["res.partner"].create( + { + "name": "Demo OpenStreetMap Partner", + "street": "3 Grande rue des feuillants", + "city": "lyon", + "zip": "69001", + "country_id": cls.env.ref("base.fr").id, + } + ) + + def test_with_lon_lat(self): + self.partner_with_address.write( + { + "partner_longitude": 4.837005, + "partner_latitude": 45.7702588, + } + ) + self.assertEqual( + self.partner_with_address.google_map_link(zoom=15), + "https://www.openstreetmap.org/directions?" + "from=&to=45.7702588,4.837005#map=15/45.7702588/4.837005", + ) + + def test_with_address(self): + self.assertEqual( + self.partner_with_address.google_map_link(zoom=15), + "https://www.openstreetmap.org/search?" + "query=3+Grande+rue+des+feuillants%2C+lyon+69001%2C+France&zoom=15", + )