Monday, September 14, 2026
11 changes · saas-19.4
Resolved issues and error corrections
This fixes an issue where unused database connections could remain open longer than intended during busy periods. The change helps keep connection usage under control and reduces the risk of the pool filling up unnecessarily.
Original PR description
Every `borrow()` used to push `_check_free_at` forward, so a busy pool never ran the periodic full idle scan. Oldest idle connections then stayed open until the pool filled. Reset the timer only when that full scan actually runs. I think it is the reason that we have to REV the code here https://github.com/odoo/odoo/pull/287008 for non-blocking connection pool Forward-Port-Of: odoo/odoo#288067
The MRP planning view now ignores maintenance entries that have only part of their scheduled time filled in. This prevents errors when opening the planning calendar and keeps manufacturing planning accessible even when older or incomplete maintenance data exists.
Original PR description
#### Issue: Opening the MRP planning view could raise a traceback when a maintenance request had a ``Scheduled End`` but no ``Scheduled Date``. ```TypeError: '<' not supported between instances of 'NoneType' and 'datetime.datetime'``` #### Cause: In `_get_maintenances_intervals`, `mrp_maintenance` loaded maintenance intervals for gantt unavailability without filtering out incomplete rows. If an interval like False, datetime reached Intervals, it crashed when comparing None with a datetime. #### Fix: Filter out incomplete maintenance intervals in the gantt query. Also added a constraint on `maintenance.request` to require `schedule_date` and `schedule_end` to either both be set or both be empty in this community PR: https://github.com/odoo/odoo/pull/265208 opw-6225772 Forward-Port-Of: odoo/enterprise#118050 Forward-Port-Of: odoo/enterprise#117710
This fix prevents an error in Manufacturing when users switch from sample work orders to real planning records by changing filters. The planning list now transitions cleanly, improving reliability for teams reviewing manufacturing work orders.
Original PR description
Go to Manufacturing > Planning > Workorders > Planning > list view. Sample data are displayed. Remove a filter such that real records match the domain. Tracebacks are displayed because we call…
Go to Manufacturing > Planning > Workorders > Planning > list view. Sample data are displayed. Remove a filter such that real records match the domain. Tracebacks are displayed because we call `get_duration` on records that don't exist. The `useRecordObserver` of MrpTimerField subscribes the callback to the `useSampleModel` flag and to the `record`. When the filter is removed, the model is reloaded and, atomically, both the flag and the root and updated on the model. As the flag is toggled, the callback is executed. However, the props of the MrpTimerField aren't updated yet, so the `record` used in the callback is still the old, sample, one. One could argue that there's a design flaw in the model as at some point, a `record` could contain sample data while it's model states that we're not in sample mode (`record.model.useSampleModel` is false). That's true and that's something we'll change in the future, but in master. We fix this issue with an easier patch, which consists in accessing the `useSampleModel` flag with `untrack`, i.e. to not subscribe to that flag's changes, as in that case, the component will be destroyed anyway. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Blog pages now count only real visitor discussions, not internal staff chatter logs. This prevents inflated comment totals and gives readers and editors an accurate view of engagement on blog posts.
Original PR description
Issue: The internal chatter logs were being counted as regular comments in the blog. Steps to reproduce: Create a website with a blog. Create a page for the blog and activate comments. While editing go into blog post. Send a log in the chatter, and the blog will show one more message than it should. Cause: Both logs and comments have the same type: `Comment` and when doing the counting of comments we used this broader type, encompassing all of them. Fix: Corrected it to use the subtype `Discussions` as this one seems to be more relevant to actual blog post comments. opw-6287196 Forward-Port-Of: odoo/odoo#270998
Delivery pricing rules based on quantity no longer display the word "False" where a unit would normally appear. This makes rule names clearer for users configuring delivery methods and avoids confusing labels in shipping setup.
Original PR description
Quantity-based delivery pricing rules have no unit. The computed name formatted the empty value directly, displaying `False` in the rule name. Use an empty string when the computed variable unit is not defined. Steps to reproduce: 1. Open a delivery method configured as Based on Rules. 2. Add a pricing rule using Quantity as its condition. 3. Observe `False` after the quantity in the generated rule name. Before this commit: Quantity-based pricing rules displayed `False` as their unit. After this commit: Quantity-based pricing rules no longer display an invalid unit. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update prevents an error when users set a partner's country to Saudi Arabia after entering a Company ID as an additional identifier. It helps keep partner creation and updates working smoothly for Saudi Arabia localization users.
Original PR description
Currently, an error occurs when the user sets the partner's country to Saudi Arabia. **Steps to Reproduce:** - Install the `l10n_sa` module with demo data. - Switch to `My Saudi Arabia Company`. -…
Currently, an error occurs when the user sets the partner's country to Saudi Arabia. **Steps to Reproduce:** - Install the `l10n_sa` module with demo data. - Switch to `My Saudi Arabia Company`. - Create a `partner` and click the `+` icon next to the VAT Number. - Select `Company ID`, set any `value`. - Set the partner's country to `Saudi Arabia`. `KeyError: 'OTHER'` After the [recent commit], OTHER is removed from vals [1] when at least one other EN identifier, excluding OTHER, is available. If a user selects OTHER (Company ID) as an additional identifier and then changes the partner's country to Saudi Arabia, the available additional identifier metadata is recomputed. With the [second commit], it checks whether the stored additional identifier is applicable to Saudi Arabia by looking up its metadata [2]. However, since OTHER was removed from the available additional identifier metadata because another EN identifier is available, directly accessing the metadata for OTHER raises a KeyError. This commit ensures that the additional identifier is safely accessed in the metadata. [recent commit]: https://github.com/odoo/odoo/commit/9087c2ddc1de3e9ef9431188a9b6dddbd6b58552 [second commit]: https://github.com/odoo/odoo/commit/fddf7653ba898f5db9d97ae3cd9f885c6c5c658a [1]- https://github.com/odoo/odoo/blob/1d50ff71a1edf2c4226cb2f68cf3bbe4e39485f6/odoo/addons/base/models/res_partner.py#L1423-L1425 [2]- https://github.com/odoo/odoo/blob/1d50ff71a1edf2c4226cb2f68cf3bbe4e39485f6/addons/l10n_sa/models/res_partner.py#L17-L18 sentry-7717445803 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Error logs now include the missing attachment's filename, making it easier for support teams to identify what went wrong. This helps speed up troubleshooting when attachment IDs are unavailable or not useful.
Original PR description
When an attachment is not found, we should log the filename as well as often the attachment id is None and tells us nothing.
Odoo now keeps its HTTP error handling reliable when a request address is too long and rejected early by the server. This prevents an additional internal error during the response process, helping keep server behavior stable in edge cases.
Original PR description
- When the request URI is too long, the HTTP server rejects the request before parsing the headers. As a result, `self.headers` is not available when the WebSocket compatibility code in `send_header()` and `end_headers()` is executed. - Access `self.headers` safely to avoid an AttributeError while handling the 414 response. **opw-6501275** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286494 Forward-Port-Of: odoo/odoo#285870
This change cleans up references to an old developer option that no longer exists. It reduces confusion for administrators and developers by ensuring configuration and routing code no longer mention unsupported behavior.
Original PR description
The feature was removed in odoo/odoo#115076 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287515 Forward-Port-Of: odoo/odoo#283352
Belgian payroll now checks that remuneration codes are entered as whole numbers. This helps prevent invalid payroll configuration data and reduces the risk of reporting or processing issues.
Original PR description
Task: 6536560 Forward-Port-Of: odoo/enterprise#130425
Product cards using the Chips layout now keep proper spacing when shown in dynamic product snippets outside the shop page. This prevents cramped or collapsed cards on website pages, improving the storefront presentation for visitors.
Original PR description
Steps to reproduce: --- - Install the website_sale module with demo data. - Go to /shop and switch the product layout to Chips. - Exit the editor. - On the home page, open the editor and add the…
Steps to reproduce: --- - Install the website_sale module with demo data. - Go to /shop and switch the product layout to Chips. - Exit the editor. - On the home page, open the editor and add the Dynamic Products snippet. Issue: --- The Products snippet has collapsed card padding when the Chips layout is active. Root cause: --- - The Chips card layout defines `--_padding-base` using `var(--o-wsale-products-grid-gap)` with no fallback value. https://github.com/odoo/odoo/blob/4307f657c73a860c755e1499138a878268882f7a/addons/website_sale/static/src/scss/product_tile.scss#L632 - When the Products snippet renders outside /shop, the variable is undefined, causing the `calc()` to resolve to a guaranteed-invalid value which collapses the card padding. All other layouts are unaffected because they either do not use `--o-wsale-products-grid-gap` in their padding chain, or already provide a `16px` fallback at the point of use. https://github.com/odoo/odoo/blob/4307f657c73a860c755e1499138a878268882f7a/addons/website_sale/static/src/scss/product_tile.scss#L407-L410 Solution: --- - 16px matches the default value of `shop_gap` on the website model, ensuring correct padding whenever the variable is not explicitly set. https://github.com/odoo/odoo/blob/4307f657c73a860c755e1499138a878268882f7a/addons/website_sale/models/website.py#L128 ### Before: <img width="1456" height="563" alt="image" src="https://github.com/user-attachments/assets/c28ab183-0af3-4a2a-858d-b85d9995eb07" /> ### After: <img width="1427" height="550" alt="image" src="https://github.com/user-attachments/assets/e0ba80ec-10ad-433f-bf9a-acbaffd56a76" /> opw-6511483 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286185