Thursday, August 27, 2026
14 changes · saas-19.2
Resolved issues and error corrections
This fix makes an automated mail test more reliable by ensuring it waits for the correct mention suggestion list rather than an unrelated status update. It helps reduce false failures in Odoo's test system without changing the user experience.
Original PR description
Before this commit, the test "select @ mention from the suggestion list being filtered" could fail on runbot, on the check that follows the first "@": Failed to find 2 of ".o-mail-Composer-suggestion" (Timeout of 10 seconds). Found 0 instead. This happens because the test holds a render open on ImStatus, a component the member list renders as well as the composer. The composer tells the server that the user is typing, the bus sends the status back, and the member list re-renders its ImStatus with another class. The hold catches that render, the one that also brings the suggestions on screen. This commit gives the children of NavigableList an inNavigableList environment flag, and holds the render only on an ImStatus that has it. https://runbot.odoo.com/odoo/error/946282 Forward-Port-Of: odoo/odoo#284872 Forward-Port-Of: odoo/odoo#284484
This fix makes website page caching behave consistently when cached pages expire. It helps prevent rare website errors caused by storing an incomplete refreshed page response in the cache.
Original PR description
**Problem:** Normally, the cached response for an HTTP request will be 'flattened', meaning the QWEB template is force-rendered and stored as `response.response[0]`. However, when the cached response is too old, a new cache value is set which is not flattened. This is inconsistent with the value normally returned by `_get_response_cached()` which will cause a traceback when accessing `response.response[0]`. This issue is rarely reproducible because `flatten()` is usually called on the response later (outside `_get_response()`), and because the returned response points to the same object as in the cache, the cache gets flattened as well. **Solution:** When the cached response is too old, flatten the new response before caching it. opw-6382359 Forward-Port-Of: odoo/odoo#283861 Forward-Port-Of: odoo/odoo#277590
Sendcloud shipping labels now keep the requested label format, such as ZPL or PDF, when extra partner information is sent. This prevents businesses from unexpectedly receiving PDF labels when another format was selected, reducing printing and fulfillment friction.
Original PR description
We send the label type we want to get (zpl, pdf, ...) in the request headers. However, since odoo/enterprise#115999, we also send the partner ID in the headers. This was overriding the headers passed to the method, making Sendcloud always return a PDF label.
Users editing product translations no longer lose unsaved text when they drag the translation pop-up. This prevents accidental rework and makes translation updates more reliable before saving.
Original PR description
Step to reproduce: - have atleast two language and install sale - open any product, hover over product, and click on Translation button - Enter a value for one of language - drag the dialog Observation: - we lose the data, we just entered and fallback to original data Cause: - Inputs used `t-att-value="term.value"`, bound to original data. Since this content is passed to Dialog via slot, it is rendered/patched as part of Dialog's render cycle, - Dragging updates Dialog's state, triggering a patch that re-evaluated the slotted template and reset input values (which comes from `term.value`) Fix: - bind value to `updatedTerms[term.id] ?? term.value` so edits survive patches triggered by the parent Dialog opw-6431521 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283514
Copying an image that is already attached to another record now reuses the existing file instead of leaving an unnecessary duplicate. This helps keep stored files cleaner and avoids redundant attachments without changing the user workflow.
Original PR description
Copying an image attachment already linked to another record could leave a redundant duplicate behind instead of reusing the existing one. opw-6463012 Forward-Port-Of: odoo/odoo#283221 Forward-Port-Of: odoo/odoo#282287
Payment XML files now use uppercase encoding declarations to better match strict bank validation requirements. This helps avoid warnings or rejections from providers such as SIX in Switzerland, without changing the payment workflow.
Original PR description
The W3C recommendations for XML state that the encoding defined for an XML document should not be case-sensitive. However, some banking providers (SIX for Switzerland) are stricter and may throw warnings or errors if upper-case is not used. https://www.w3.org/TR/2008/REC-xml-20081126/#NT-EncodingDecl opw-4948708 Forward-Port-Of: odoo/enterprise#128301 Forward-Port-Of: odoo/enterprise#125807
The Turkish reports journal form now places the sales return account field in the correct position. This prevents labels and values from appearing under the wrong captions, making accounting setup clearer for users.
Original PR description
The journal form renders `default_account_id` as six standalone labels followed by two `nolabel="1"` fields, one for bank, cash and credit journals and one for sale, purchase and general ones. The xpath matched the first of those two fields, so the return from sales account was inserted between them. Its own label then landed in the middle of the label run, shifting the group grid: both labels rendered side by side with their values underneath, each next to the wrong caption. Anchor on the second field instead, so the new field follows the whole label and field run. Task-6438412 Forward-Port-Of: odoo/enterprise#128083
Users auditing accounting report figures can now switch between available views such as list, pivot, graph, and kanban. This makes it easier to analyze the journal items behind report numbers in the format best suited to the task.
Original PR description
Problem: When auditing reports, the audit cell action was only showing the journal items in the list view, and not enabling other view modes (pivot, graph, kanban). Steps to reproduce: 1. Go to Accounting > Reporting > Balance Sheet 2. Click on any cell with a number in the report 3. Notice how the journal items are only shown in the list view, and you cannot switch to other view modes. Cause: The action was hardcoded to only show the list view. opw-6403704 Forward-Port-Of: odoo/enterprise#129214 Forward-Port-Of: odoo/enterprise#128563
French companies can now update an employee's working schedule even when the employee has approved time off on a non-working day, such as a Saturday. The fix prevents those days-off leave records from being converted into an invalid date range, avoiding save errors while preserving existing valid leave behavior.
Original PR description
**Problem:** For a French company, an employee whose working schedule differs from the company's cannot have their Working Hours changed when they have a validated time off that falls on a…
**Problem:** For a French company, an employee whose working schedule differs from the company's cannot have their Working Hours changed when they have a validated time off that falls on a non-working day (e.g. a Saturday). Saving fails with "The operation cannot be completed: The start date must be before or equal to the end date." **Steps to reproduce:** 1. Install l10n_fr_hr_holidays and work in a French company. 2. Set the company Working Hours and a reference (Paid) Time Off type. 3. Give an employee a Monday-to-Friday schedule that differs from the company's. 4. Create a one day Paid Time Off for the employee on a Saturday. 5. Change the employee's Working Hours. **Current behavior:** Saving is rejected by the date_from <= date_to constraint; the Working Hours cannot be changed as long as the weekend time off exists. **Expected behavior:** The Working Hours can be changed and the time off keeps a valid date range. **Cause of the issue:** When the French computation applies, `_get_fr_date_from_to` moves `date_start` forward to the first working day and, in a separate loop, moves `date_target` forward while the next day is a non-working day. The two loops are asymmetric: for a leave lying entirely on non-working days (a single Saturday for a Monday-to-Friday employee) `date_start` is pushed to the following Monday while `date_target` only reaches the Sunday. The pair is then written to `date_from`/`date_to` as Monday > Sunday, violating the date_from <= date_to constraint. **Fix:** A leave that contains no working day has nothing to anchor the "lost days" extension on, so the adjustment must not apply. Detecting the crossed pointers and keeping the leave's original dates preserves a valid range while leaving every leave that contains at least one working day untouched. opw-6348425 Forward-Port-Of: odoo/odoo#278833
Shop Floor cards now handle long unit names, quantities, and manufacturing notes without spilling outside the card. This keeps production information readable and prevents confusing layouts for shop floor users.
Original PR description
Steps to reproduce --- 1. Enable Units of Measure (`uom.group_uom`) and give a unit a very long name. 2. Build a product using that unit for its components, and set a long note (plain text or an HTML…
Steps to reproduce --- 1. Enable Units of Measure (`uom.group_uom`) and give a unit a very long name. 2. Build a product using that unit for its components, and set a long note (plain text or an HTML table) on its manufacturing order. 3. Open that operation in Shop Floor. Observed: the finished-product name breaks one letter per line, the long unit next to the quantity and the note both run off the right edge of the card. Expected: name, unit and note stay within the card, wrapping or scrolling. Issue --- Each of these rows is a flexbox whose children keep the default `min-width: auto`, so they never shrink below their content's intrinsic width. A long UoM name therefore forces its flex sibling (the product name) down to min-content and wraps it one character per line, while long quantities and notes push past the fixed-width card instead of wrapping. Adding `min-w-0` lets the flex items shrink, replacing `text-nowrap` with `text-wrap` on the quantity lets the value wrap, and wrapping `logNote` in a `min-w-0 overflow-auto` span contains an HTML-table note within the card. opw-6496759
This fixes an issue where submitting expenses for multiple companies could send duplicate emails. The change helps ensure expense-related notifications are sent only as intended, reducing confusion for employees and approvers.
Original PR description
Fix a small issue resulting in mail duplication when submitting expenses from multiple companies that appeared in the infamous 704a5a19 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#283013
This update adjusts point-of-sale self-order behavior so an unnecessary IoT connection error popup is not shown during kiosk printer testing. It helps keep automated checks aligned with the intended customer flow and reduces false test failures.
Original PR description
This PR fixes the test where iot request triggers a "failed to contact your iot box on local network popup" Forward-Port-Of: odoo/enterprise#128546 Forward-Port-Of: odoo/enterprise#128388
A costly styling rule in the messaging interface was simplified because it added little visible value. This should help keep the interface responsive without changing the user experience.
Original PR description
This PR cleans up a complex selector that is quite costly without providing any striking visual value. task-6481656 Forward-Port-Of: odoo/enterprise#128906
The Japanese localization now uses accurate labels for domestic and overseas fiscal positions. This prevents misleading wording for users configuring accounting rules in Japan and fixes a small English spelling issue.
Original PR description
Japanese translation "海外取引先" for domestic was clearly wrong.
Also fixed the misspelling ("Oversea" -> "Overseas") and removed the unnecessary "Customer" context from the name.
@qrtl
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#284608