Monday, August 24, 2026
22 changes · master
Resolved issues and error corrections
Cancelling the product configurator in Point of Sale no longer shows optional products for an item that was not added. This prevents cashiers from being prompted to add extras for a discarded product, reducing confusion during checkout.
Original PR description
When discarding the product configurator, we still showed the optional product. We no longer do that as no one wants to add optional products to a not-added product. task-6442422 Forward-Port-Of: odoo/odoo#283378 Forward-Port-Of: odoo/odoo#282916
Fixes issues in Odoo's JSON logging so ignored fields and test-related log information are handled correctly. Adds automated checks to help prevent these logging problems from returning, improving reliability for monitoring and troubleshooting.
Original PR description
The JsonFormatter has two bugs - the ignore list is not working as expected - in 18.0-18.4 the 'test' key is broken This commit add tests to ensure those behavior works as expected While on it, also…
The JsonFormatter has two bugs - the ignore list is not working as expected - in 18.0-18.4 the 'test' key is broken This commit add tests to ensure those behavior works as expected While on it, also adds a `additional_record_keys` parameter to allow to specifically add keys to the default list, without having to override the whole list, and add additional default keys (exc_info and test) The previous `ignored_record_keys` default value was possible to remove by calling `JSONFormatter(ignore_record_keys=[])` The purpose was to be able to easily include all keys and ignore the default ingnore list, but this makes the additional blacklisting of a few keys more tedious, and the general usage and implementation more complex `JSONFormatter(ignore_record_keys=[*JSONFormatter.DEFAULT_IGNORED_RECORD_KEYS, 'other key'])` To simplify the logic, **this is not the case anymore**, so to include all keys something like this would be needed `JSONFormatter(additional_record_keys=JSONFormatter.DEFAULT_IGNORED_RECORD_KEYS)` Or an hardcoded list. Forward-Port-Of: odoo/odoo#284051 Forward-Port-Of: odoo/odoo#279049
This fix prevents planning shifts from failing when no related sales order line is attached. It ensures the customer field is still set safely, improving reliability for sales planning workflows.
Original PR description
Before this commit, when the shift has no SOL set, the `_compute_partner_id` crashes because the value for partner_id field is not set for that shift. This commit fixes the compute method of partner_id to make sure the value is correctly set for all shifts. Forward-Port-Of: odoo/enterprise#128965
This fixes an internal test for appointment rescheduling so it behaves consistently when demo data is present. It helps prevent false test failures without changing the customer-facing appointment experience.
Original PR description
In test_reschedule_appointment_event the tracking is rendered by the public user, which has no timezone hence fallback to UTC. But the expected values are formatted by the test environment, running as OdooBot, whose timezone demo data sets to Europe/Brussels. Without demo data both fall back to UTC and the test passes. Format the expected values in UTC as well. Runbot-946307
Argentine delivery operations using class X document types can now be saved without entering CAI authorization details or an expiration date. This aligns the workflow with local regulations, where those fields are only required for class R delivery notes.
Original PR description
Currently, when the user attempts to create a delivery operation for a class X document type, the system prompts the user to provide values for the CAI and CAI Expiration Date fields. ## Steps to…
Currently, when the user attempts to create a delivery operation for a class X document type, the system prompts the user to provide values for the CAI and CAI Expiration Date fields. ## Steps to produce: - Install `l10n_ar_stock` with demo data - Switch Company to `(AR) Exento` - Create a warehouse - Configuration > Operation Types > Delivery Orders - Set Document Type to `'(94) MAILING X' `and try to save ## Observed Behavior: The fields 'CAI' and 'CAI Expiration Date', which represent the authorization code and expiration date issued by the government, are currently configured as required fields. **Expected Behavior:** As specified on the [government site](https://www.argentina.gob.ar/normativa/nacional/resoluci%C3%B3n-1415-2003-81316/actualizacion#:~:text=Los%20datos%20indicados%20en%20el%20inciso%20a%29%2C%20puntos%207%2C%2010%2C%2011%2C%2012%20y%2013%2C%20s%C3%B3lo%20ser%C3%A1n%20para%20los%20remitos%20clase%20%27R%27%2E): > > 12. Printing authorization code, preceded by the acronym 'CAI No. ...'. > 13. Expiration date of the receipt, preceded by the legend 'Expiration Date ...' > > 'The data indicated in section a), points 7, 10, 11, 12 and 13, will only be for 'R' class delivery notes.' These statements indicate that the information mentioned in points 12 and 13, including the **CAI** and **CAI Expiration Date** fields, is applicable only to **'R'** class delivery notes. Therefore, for class X delivery notes, these fields should be optional rather than required. ## Root Cause: According to [1], the field is configured as a required field when a Document Type ID is selected. This configuration causes the **CAI** and **CAI Expiration Date** fields to become mandatory, regardless of the document type requirements defined by the government specification. [1]- https://github.com/odoo/odoo/blob/62b05c4ea61942072b6b1fb420fe3efedb11ed14/addons/l10n_ar_stock/views/stock_picking_type_views.xml#L11-L16 ## Solution: Apply constraints that align with the government specifications, allowing the CAI and CAI Expiration Date fields to remain optional for document types where they are not required. opw-6359503 Forward-Port-Of: odoo/odoo#283822 Forward-Port-Of: odoo/odoo#275533
The Belgian salary configurator now calculates wages consistently when employees have extra-legal leave and a mobility budget. This prevents the mobility budget from being incorrectly adjusted for leave, so employer cost and gross wage figures align with the standard payroll formula.
Original PR description
Forward-Port-Of: odoo/enterprise#112723
Adds automated coverage to ensure currency translation adjustments use the correct exchange rates when the company currency changes over time. This helps prevent inaccurate financial report values in fluctuating-rate scenarios.
Original PR description
Following the fix made in community branch, this adds a test veryfing the expected behavior in case of a fluctuating rate for the domestic currency. Scenario 2: fluctuating domestic (USD) rate USD…
Following the fix made in community branch, this adds a test veryfing the expected behavior in case of a fluctuating rate for the domestic currency. Scenario 2: fluctuating domestic (USD) rate USD rate=1 from Jan 1 to Jun 30, USD rate=3 from Jul 1 to Dec 31 EUR rates unchanged: 2 from Jan 1, 4 from Jul 1 Correct conversion factors (= USD_rate / EUR_rate): Jan 1 – Jun 30 (182 days): 1/2 = 0.50 Jul 1 – Dec 31 (184 days): 3/4 = 0.75 Current rate at 2020-12-31: 3/4 = 0.75 Correct average rate: (0.50 * 182 + 0.75 * 184) / 366 = 229/366 ≈ 0.62568 Previsouly bugged average rate (USD fixed at current=3): (1.50 * 182 + 0.75 * 184) / 366 = 411/366 ≈ 1.12295 Historical equity rates (correct vs previously bugged): Mar 1 (USD=1, EUR=2): correct = 1/2 = 0.50; buggy = 3/2 = 1.50 → 40 * 0.50 = 20 vs 40 * 1.50 = 60 Oct 1 (USD=3, EUR=4): correct = 3/4 = 0.75; buggy = 3/4 = 0.75 → 60 * 0.75 = 45 (same by coincidence) task-5953104 Forward-Port-Of: odoo/enterprise#125363 Forward-Port-Of: odoo/enterprise#123055
Sales order sections and subsections no longer show quantity delivered, delivery percentage, or unit price fields that do not apply to them. This keeps order lines easier to read and avoids confusion when reviewing structured sales orders.
Original PR description
On the SO form view, some fields that are not meant to be displayed on sections/subsections are displayed on them. These fields are: qty_delivered, qty_delivered_percent, and price_unit. Follow-up task: 6075605 and 6450100 <img width="1223" height="286" alt="screen" src="https://github.com/user-attachments/assets/f07e2343-c3ba-46b7-b6d3-b4e4d20491a2" />
This fixes a timing issue in the website page creation flow where the interface could remain blocked while redirecting to a newly created page. It makes the automated flow wait until navigation is fully complete, improving reliability of website testing and reducing false failures.
Original PR description
runbot-944311 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#278652
Belgian payroll demo records now use the correct meal voucher values and Belgian office work locations, making test employee data more accurate. The update also fixes a company mismatch on a demo vehicle to avoid multi-company errors during testing.
Original PR description
In Belgian demo data, several employees have an incorrect meal voucher employee share set to 0.00€ instead of the standard rate. Additionally, the default work address for BE test employees is set to a US location. This updates the demo records: - Sets meal voucher amount to 8.00€ and employee's share to 1.09€ (except for employees in JC 999). - Updates all BE test employees' work location to "Belgian offices". Task-6471822
The tax totals display no longer shows cash rounding controls in sales and purchase documents, where they are not intended to be used. This keeps rounding behavior limited to accounting and invoicing, reducing confusion for users preparing quotes, orders, or purchase documents.
Original PR description
The cash rounding on the tax totals widget is intended to work only with accounting/invoicing, but not sales/purchases.
Odoo now ignores a saved default search filter when its linked record no longer exists. This prevents affected screens from crashing and lets users continue working normally.
Original PR description
…'t exist Have a search view with a m2o field Have an action that sets search_default_m2o: [/BAD ID/] Before this commit there was a crash After this commit, we simply ignore the filter. task-6469841 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#282738
This fixes an issue where pressing Shift+Enter in Safari created a new paragraph instead of a soft line break in the editor. Users editing Knowledge articles on Mac Safari can now format text consistently with other browsers.
Original PR description
**Steps to reproduce:** - Use a Mac with Safari - Install Knowledge app - Go to any article - Press Shift+Enter to try to enter a soft line break - Hard split is done instead **Issue:** Shift+Enter causes a `insertParagraph` event instead of `insertLineBreak` in Safari, which triggers the `SplitPlugin` instead of the `LineBreakPlugin`. **Fix:** Check if the browser is Safari and call `insertLineBreak` from the `SplitPlugin` (when needed) by listening to the "keydown" events. (note: I was not able to find any other key combination to properly trigger the `insertLineBreak` event in Safari) opw-6413507 Forward-Port-Of: odoo/odoo#281458
This fix prevents certain Indian localization reports from failing when they use shared report handling logic. The B2C HSN line adjustment now only runs for the GSTR-1 report, improving reliability for other reports.
Original PR description
Currently, every l10n_in report is handled by a single handler. Therefore, a check condition is required for each report option. This check was missing in _custom_line_postprocessor, which removes the B2C HSN line conditionally. As a result, it could cause a traceback for reports other than GSTR-1. This PR fixes the issue by adding a condition to ensure that the B2C HSN line is removed only for the GSTR-1 report.
Quotation PDFs with product images now keep long product names and descriptions within their columns. This improves the readability and professionalism of sales quotes, especially when products have lengthy descriptions or unbroken text.
Original PR description
Currently, with images enabled for quotation reports and if the product name is long enough, it overflows through the column border a bit before breaking to the next line. This seems to be caused by…
Currently, with images enabled for quotation reports and if the product name is long enough, it overflows through the column border a bit before breaking to the next line. This seems to be caused by some incompatibility between wkhtmltopdf and d-flex, adding `col` to the product name container forces it to respect column boundaries. This commit also adds `text-break` as having a long uninterupded string in the description would end up stretching the column and making the next ones disapear. <img width="811" height="266" alt="image" src="https://github.com/user-attachments/assets/90043c88-d03f-4324-9935-e669f6a256ab" /> <img width="964" height="431" alt="image" src="https://github.com/user-attachments/assets/2b8e8a6c-6fd5-4813-8160-d94bbb5490d1" /> ### Steps to reproduce: - Enable Display Product Images in the setting - Create a product with an image - Create a quotation with said product and add a description that is long enough to break to the next line - Print said quotation - You will notice that before the line breaks it will overflow to the next column (you might need to tweak the description a bit by removing or adding a few lines) opw-6367076 Forward-Port-Of: odoo/odoo#275978
The Swiss payroll module no longer assigns a Swiss contract type by default when the employee or company context is not Swiss. This prevents incorrect employee contract information and avoids related automated test failures.
Original PR description
[FIX] l10n_ch: fix default contract type This task is runbot error fix that occured from 19.0 to 19.2 Bug reproduction: 1 - Go to version 19.0, install l10n_ch_hr_payroll_account 2 - Execute…
[FIX] l10n_ch: fix default contract type
This task is runbot error fix that occured from 19.0 to 19.2
Bug reproduction:
1 - Go to version 19.0, install l10n_ch_hr_payroll_account 2 - Execute test_version_timeline_auto_save_tour tour test 3 - It fails in .o_arrow_button_wrapper[data-tooltip^='Contract:'] step
Bug cause:
1 - When l10n_ch_hr_payroll_account is installed:
1.1 - contract type becomes "Permanent contract with monthly salary"
1.2 - the employee is not swiss but it has this CH contract type
2 - data-tooltip starts with Permanent contract instead of contract
2.1 - Tour fails
3 - contract_type_id is overwritten in swiss modules
3.1 - Default is assigned without looking to the country of self.env
Bug solution:
1 - If the country is not swiss, the default is assigned as False
1.1 -> fixed in l10n_ch_hr_payroll/hr_version
1.2 instead of assigning swiss contract type to the non-swiss emp.
Note: This is fix from saas-18.4 to master.
task-6392040
runbot error: https://runbot.odoo.com/odoo/runbot.build.error/941358
Forward-Port-Of: odoo/enterprise#127830
Forward-Port-Of: odoo/enterprise#126520Fixes an editor display issue where gradient-styled text inside a link could disappear when selected. Users editing website or email content can now clearly see linked text during selection, reducing confusion and editing mistakes.
Original PR description
Problem: When text formatted with `.text-gradient` is inside a link with `.o_link_in_selection`, the selected text becomes invisible. `.text-gradient` sets `-webkit-text-fill-color: transparent`, which prevents `color: black !important` on `.o_link_in_selection` from taking effect. Cause: `-webkit-text-fill-color: transparent` from `.text-gradient` overrides standard text `color` rendering, causing the text to stay transparent against the selection highlight background. Solution: Set `-webkit-text-fill-color: black` on `.o_link_in_selection` to ensure text inside gradient links is rendered in black and remains clearly visible when selected. Steps to reproduce: - Add text "ABCD". - Apply gradient color to all text. - Create a link on "BC". - Place cursor/selection inside the new link. - Observe that the text is not visible. opw-6479350 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282952
Belgian payroll now avoids showing a missing transport benefit warning for company executives. This prevents an incorrect alert from appearing on executive contracts where the rule should not apply.
Original PR description
The transport benefit warning incorrectly applies to company executives (Joint Committee = 999). This warning is intended solely for regular employees. Steps to reproduce: 1. Go to an employee's contract and set the Joint Committee to 999. 2. Set a monthly wage that results in an annual salary below 34,654€. 3. Ensure no transport benefits are selected. 4. Save the contract; the missing transport benefit warning is incorrectly displayed. This change skips the validation for Joint Committee 999 to ensure the warning only triggers when applicable. task-6442880 Forward-Port-Of: odoo/enterprise#126642
Projects linked to both standard sales orders and rental orders now show the full list when users open the Sales button. This makes the displayed sales count match the actual orders shown, reducing confusion for teams managing rental-related projects.
Original PR description
Steps to Reproduce --- 1. Install sale_renting_project. 2. Create a Project linked to 1 standard Sales Order and 1 Rental Order. 3. Observe the "Sales" stat button counts 2 Sales. 4. Click the stat button. Only the standard Sales Order is displayed. Issue --- In saas-18.4, the project Sales stat button calls action_view_sos without the from_embedded_action context key. As a result, _get_sale_orders_domain applies the non-rental filter by default, causing rental orders to be excluded from the action even though they are included in the displayed counter. Expected Behavior --- The Sales stat button should display all orders linked to the project, including both standard and rental orders, matching its total counter. Fix --- Return the base project domain unmodified when from_embedded_action is not set in the context. task-6140201 Forward-Port-Of: odoo/enterprise#128468 Forward-Port-Of: odoo/enterprise#121449
The LinkedIn social integration now handles cases where LinkedIn returns no account statistics. This prevents refresh failures and helps users keep their social account data up to date reliably.
Original PR description
Bug === When the LinkedIn API returns no statistics for the account, the refresh crashes. Task-6425391 Forward-Port-Of: odoo/enterprise#126326
The AI assistant for drafting social posts no longer crashes when preparing the request context, especially when using Google-backed AI services. This helps users reliably ask AI for help writing social content without interruption.
Original PR description
Bug === The `aiChatSourceId` contains `datapoint_x`. Also, look like now we should `json.dumps` the initial context. Task-6485440 Forward-Port-Of: odoo/enterprise#124832
Fixed an issue where inserting an AI-generated image from the media dialog could cause an error. This helps users complete social post content creation smoothly without being interrupted by a crash.
Original PR description
Bug === Since odoo/odoo@7427089969ab445dc86e37d628c9c59e7c73c632 , when we open the media dialog, click on the AI button, generate an image and then insert it, a traceback is raised. Task-6432288 Forward-Port-Of: odoo/enterprise#126229