Wednesday, May 20, 2026
5 changes · saas-18.3
Resolved issues and error corrections
This update fixes an issue where URLs with mixed or uppercase letters weren't automatically converted to clickable links within the HTML editor. The change ensures that all URLs, including single-character domains like 'x.com', are correctly recognized and linked. This improves the user experience by making it easier to share and navigate to online resources.
Original PR description
### Description of the issue/feature this PR addresses: - URL_REGEX was constructed with the "i" flag, but passing a RegExp object to new RegExp(regex, "g") silently drops the original flags, leaving only "g". This caused uppercase (ODOO.COM) and mixed-case (Odoo.Com) URLs to not be converted to links when pressing space. ### Desired behavior after PR is merged: - URL_REGEX.source with explicit "gi" flags to preserve case-insensitive matching in `prepareConvertToLink`. - Allow automatic URL detection for single-character domains such as `x.com`, `t.co`, and `a.io` by relaxing the minimum domain label length in the URL regex from 2 to 1 characters. task-6199269 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263255
This update resolves a minor error in the Mexican accounting module (l10n_mx) related to a typo in the account group data file. The correction ensures accurate reporting and compliance with Mexican tax regulations. This change was prompted by a document from the Mexican tax authority (SAT).
Original PR description
Source: https://www.sat.gob.mx/minisitio/NormatividadRMFyRGCE/documentos2026/rgce/anexos/Anexo24delasRGCEpara2026.pdf opw-6174385 Forward-Port-Of: odoo/odoo#262549
This update resolves an error that prevented users from initiating replenishment when no suitable routes were configured for a product. The fix ensures the system handles cases where routes aren't defined correctly, preventing a crash and allowing replenishment to proceed smoothly. This improves the reliability of the stock management process.
Original PR description
## Steps to Reproduce: 1. Install the stock module. 2. Activate "Multi-Step Routes" from settings. 3. Activate the "My Company (Chicago)" company. 4. Create a route for the Chicago company. 5. Create a new product and enable the created route on it. 6. Click on the "Replenish" button. ## Error: `IndexError - tuple index out of range` ## Cause: At [1], when none of the product routes belong to the current company or are shared routes, the filtering returns an empty recordset. As a result, trying to access the first route from the empty result raises an index error. ## Fix: This commit only assigns `route_id` when a route matches the given condition. Otherwise, it keeps the value as `False`. [1] - https://github.com/odoo/odoo/blob/13c0e082c260381a332fe1425fe2ba83a1c0c579/addons/stock/wizard/product_replenish.py#L78 sentry-7488075413 Forward-Port-Of: odoo/odoo#265179
This update resolves an issue where UBL invoices would fail to import due to extra spaces in the 'EndpointID' field. The change automatically removes these spaces, ensuring invoices are correctly processed and imported, improving data accuracy.
Original PR description
**PROBLEM** When importing a ubl that, for some reason, have trailing space on the text of the EndpointID node, we refuse it. This PR strips the trailing spaces on the import. **STEP TO REPRODUCE** 1. Import a ubl as a bill, with a trailing space in the EndpointID of the other party. 2. Notice the import fail, with the error: The Peppol endpoint (50238597645 ) is not valid. It should contain only letters and digit. opw-6227395
This update fixes a technical problem caused by a recent change in Odoo's Python environment. Specifically, it resolved a circular import issue related to a new library, preventing errors during startup. The change also cleaned up an unused import statement.
Original PR description
In Python 3.14, the introduction of `annotationlib` changes the standard library's internal import graph. When `inspect` imports `annotationlib`, it subsequently imports `ast`. Odoo's custom module…
In Python 3.14, the introduction of `annotationlib` changes the standard library's internal import graph. When `inspect` imports `annotationlib`, it subsequently imports `ast`.
Odoo's custom module loader intercepts this `ast` import to execute `odoo._monkeypatches.ast`. Previously, this monkeypatch had a top-level `import logging`. Loading `logging` triggers an import chain (`traceback` -> `_colorize` -> `dataclasses`) that ultimately attempts to call `annotationlib.get_annotations`. Because `annotationlib` is still in the middle of its initial load, this attribute does not exist yet, resulting in an AttributeError.
This commit defers the `logging` import inside the `ast` monkeypatch to the local scope, breaking the circular import chain and allowing Python 3.14 to finish initializing its core modules properly.
Also it cleans up a blocking and unused `logging` import in `_monkeypatches/num2words.py`.
runbot-938481
<hr>
For information, the actual traceback:
```
'Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/data/src/odoo/odoo/api/__init__.py", line 4, in <module>
from odoo.orm.identifiers import NewId
File "/data/src/odoo/odoo/orm/__init__.py", line 20, in <module>
import odoo.init # noqa: F401
File "/data/src/odoo/odoo/init.py", line 23, in <module>
from .orm.utils import SUPERUSER_ID
File "/data/src/odoo/odoo/orm/utils.py", line 8, in <module>
from odoo.tools import SQL
File "/data/src/odoo/odoo/tools/__init__.py", line 7, in <module>
from .cache import ormcache, ormcache_context
File "/data/src/odoo/odoo/tools/cache.py", line 7, in <module>
from decorator import decorator
File "/usr/lib/python3/dist-packages/decorator.py", line 37, in <module>
import inspect
File "/usr/lib/python3.14/inspect.py", line 146, in <module>
from annotationlib import Format, ForwardRef
File "/usr/lib/python3.14/annotationlib.py", line 3, in <module>
import ast
File "<frozen importlib._bootstrap>", line 1371, in _find_and_load
File "<frozen importlib._bootstrap>", line 1342, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 938, in _load_unlocked
File "/data/src/odoo/odoo/_monkeypatches/__init__.py", line 46, in exec_module
hook()
File "/data/src/odoo/odoo/_monkeypatches/__init__.py", line 70, in patch_module
module = importlib.import_module(f\'.{name}\', __name__)
File "/usr/lib/python3.14/importlib/__init__.py", line 88, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "/data/src/odoo/odoo/_monkeypatches/ast.py", line 4, in <module>
import logging
File "/usr/lib/python3.14/logging/__init__.py", line 26, in <module>
import sys, os, time, io, re, traceback, warnings, weakref, collections.abc
File "/usr/lib/python3.14/traceback.py", line 12, in <module>
import _colorize
File "/usr/lib/python3.14/_colorize.py", line 157, in <module>
@dataclass(frozen=True, kw_only=True)
File "/usr/lib/python3.14/dataclasses.py", line 1432, in wrap
return _process_class(cls, init, repr, eq, order, unsafe_hash,
File "/usr/lib/python3.14/dataclasses.py", line 1041, in _process_class
cls_annotations = annotationlib.get_annotations(
AttributeError: partially initialized module \'annotationlib\' from \'/usr/lib/python3.14/annotationlib.py\' has no attribute \'get_annotations\' (most likely due to a circular import)
'
```