[FIX] partner_geolocalize_usability: avoid Nominatim HTTP 429 rejections

The stock ``base_geocoder._call_openstreetmap`` sends a generic Odoo
``User-Agent`` shared across thousands of instances, which Nominatim
rate-limits and blocks (HTTP 429 "Too many requests"), so mass
geolocation fails regardless of client-side throttling.

Override ``_call_openstreetmap`` to:

- send a deployment-specific ``User-Agent`` read from a new system
  parameter ``partner_geolocalize_usability.user_agent`` (shipped with an
  obvious placeholder so an unconfigured instance fails loudly instead of
  silently reusing the banned generic agent);
- throttle requests to one per second (``time.sleep``) before each call,
  complying with the Nominatim usage policy even when callers loop over
  many partners;
- return ``None`` instead of raising ``IndexError`` when Nominatim
  returns an empty result for an unknown address.

Document the required system parameter in the README and add tests
covering the User-Agent selection, throttling and empty/blank results.
This commit is contained in:
Stéphan Sainléger
2026-07-21 17:23:43 +02:00
parent e161f431ec
commit e3fa6b8d6e
7 changed files with 210 additions and 2 deletions

View File

@@ -21,7 +21,25 @@ It also modify the partner form vieww for a better understanding of the geolocat
Configuration
=============
No configuration needed.
The OpenStreetMap Nominatim geocoding service requires a genuine, identifying
``User-Agent`` header with a valid contact address (see the `Nominatim usage
policy <https://operations.osmfoundation.org/policies/nominatim/>`_). The
default Odoo ``User-Agent`` is shared by many instances and gets rate-limited or
blocked (HTTP 429 "Too many requests").
To fix this, set the system parameter (Settings > Technical > System
Parameters):
- **Key**: ``partner_geolocalize_usability.user_agent``
- **Value**: a User-Agent identifying your deployment and a valid contact,
e.g. ``acme-crm/1.0 (contact: gis@acme.example)``
The module ships this parameter with a placeholder value; you MUST replace it
with your own, otherwise Nominatim will reject the requests.
Requests to Nominatim are additionally throttled to one request per second to
comply with the usage policy, so mass geolocation of many partners is slow by
design (roughly one partner per second).
Known issues / Roadmap
======================