Tuesday, September 30, 2025
33 changes · saas-18.4
Enhancements to existing features
The self-ordering setup screens now present QR code actions more clearly across desktop and mobile. Users also get a clearer Settings label and a new option for free metal or wood stand references, making setup choices easier to understand.
Original PR description
In this commit: ------------------- - Removed the QR code icon from the desktop view of the `Get QR Code` button. - Moved the QR code button from the navbar into the burger menu for mobile view. - Added a new reference option `Free Metal / Wood Stands` in settings. - Renamed the `Edit` menu item to `Settings`, to make the button functionality clear from the label as it leads the user to the settings page for the selected config. task:5003448 Forward-Port-Of: odoo/odoo#228772 Forward-Port-Of: odoo/odoo#225856
Email content now preserves border styles more reliably when formatting is converted for sending. This helps images and other bordered elements appear as intended in recipients' email clients.
Original PR description
This commit ports the following fixes to `convert_inline` of `mail`: - https://github.com/odoo/odoo/commit/8923f32426fc64e90db249fad47d7ca7e338adef [FIX] web_editor: adapt border-style value based on border widths - https://github.com/odoo/odoo/commit/7de31c6261d2fe9f58b0c6cb635977e77eecd9d6 [FIX] web_editor: ensure image border visible in emails --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228970
Link tracking redirects now encode certain repeated-dot characters that some server setups may incorrectly block as suspicious. This helps tracked links work more reliably for users and customers behind stricter nginx configurations.
Original PR description
Purpose ======= It has been reported that some nginx configuration detect '...' as malicious. When testing, encoding the '...' solve the issue, and so we force the encoding for the redirection URL. Task-4920533 Forward-Port-Of: odoo/odoo#229060
IoT Boxes now receive a clear unauthorized error when they try to download drivers but are not recognized by the database. This makes connection or setup issues easier to identify and resolve instead of failing silently with an empty response.
Original PR description
When an iot box tries to download drivers from the database, but the db doesn't have a record corresponding to the IoT Box, the IoT Box receives an empty string, making it hard to debug why it couldn't download handlers. We now raise an unauthorized error to make it clearer. Forward-Port-Of: odoo/enterprise#93963 Forward-Port-Of: odoo/enterprise#93813
Resolved issues and error corrections
This fix ensures temporary database counters created for self-order point-of-sale sessions are removed once a session is closed. It helps prevent unnecessary database clutter over time, supporting smoother system maintenance without changing the user experience.
Original PR description
to avoid having too many postgres sequences, this make sure the sequence used by the pos session is cleaned up after being closed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229069 Forward-Port-Of: odoo/odoo#223758
The payment wizard now checks the bank account the user actually selects, rather than only the account originally tied to the bill. This prevents unnecessary warning banners when a trusted bank account is chosen for SEPA vendor payments.
Original PR description
**Steps to reproduce:** 1. Install the modules: `accounting` and `account_iso20022`. 2. Configure a bank journal with SEPA credit transfer in *Outgoing payment methods*. 3. Create a partner with two…
**Steps to reproduce:** 1. Install the modules: `accounting` and `account_iso20022`. 2. Configure a bank journal with SEPA credit transfer in *Outgoing payment methods*. 3. Create a partner with two bank accounts: one trusted, one untrusted. 4. Create a vendor bill for this partner. 5. Register a payment using the SEPA credit transfer method. 6. Manually select the trusted bank account from the dropdown. **Observed behavior:** * A warning banner is shown when the trusted account is selected. **Root cause:** * `_compute_trust_values` only validated the bank account from the batch (original invoice data) and ignored the `partner_bank_id` if the user changed it manually in the wizard. **Solution:** * Update `_compute_trust_values` to also validate the currently selected `partner_bank_id`, ensuring the trust check reflects the user’s actual selection. * added testcase for the same in account_iso20022 [#95124](https://github.com/odoo/enterprise/pull/95124) opw-5059740 Forward-Port-Of: odoo/odoo#227404
The CRM periodic digest now shows the correct number of free credits for targeted lead generation. This prevents customers from seeing an overstated offer and helps keep product communication accurate.
Original PR description
## Versions 17.0+ ## Issue The Periodic Digest contains wrong information in a tip. 20 credits are given for specific target lead generation, not 200. opw-5114252 Forward-Port-Of: odoo/odoo#228791
This fixes an issue in Odoo's web testing tools where creating records linked through many-to-many relationships could fail. The change improves reliability for automated tests and helps prevent false errors during development and quality checks.
Original PR description
Before this commit, using CREATE Command on a many2many field would result in an error. This is because upon record creation the inverse field would be set to the single id, which is incorrect for a many2many field. This commit fixes the issue by setting the inverse field of a many2many to a list containing the new id. Forward-Port-Of: odoo/odoo#208524
Fixed an issue where opening the barcode scanner in Attendance kiosk mode could trigger an error when debug mode was enabled. This keeps the kiosk scanning flow stable for administrators and users testing or troubleshooting the Attendances app.
Original PR description
**Step to reproduce:** - install Attendances app - turn on debug mode - go to Attendance -> kiosk mode - open the scanner **Observation:** - We get a traceback **Cause:** - we pass a extra prop `token` to BarcodeDialog component, which is not accepted by it https://github.com/odoo/odoo/blob/178dff30131a93680dfd994fd22b29a766ee9354/addons/web/static/src/core/barcode/barcode_dialog.js#L12 - this raises issue from OWL when we have debug-mode on **Fix:** - reuse the actual `scanBarcode` method and remove the faulty one. https://github.com/odoo/odoo/blob/178dff30131a93680dfd994fd22b29a766ee9354/addons/web/static/src/core/barcode/barcode_dialog.js#L47-L60 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#227551 Forward-Port-Of: odoo/odoo#225738
The SEPA payment flow now checks the bank account actually selected by the user before showing a trust warning. This prevents incorrect warning banners when a trusted account is chosen, reducing confusion during vendor payment processing.
Original PR description
**Steps to reproduce:** 1. Install the modules: `accounting` and `account_iso20022`. 2. Configure a bank journal with SEPA credit transfer in *Outgoing payment methods*. 3. Create a partner with two bank accounts: one trusted, one untrusted. 4. Create a vendor bill for this partner. 5. Register a payment using the SEPA credit transfer method. 6. Manually select the trusted bank account from the dropdown. **Observed behavior:** * A warning banner is shown when the trusted account is selected. **Root cause:** * `_compute_trust_values` only validated the bank account from the batch (original invoice data) and ignored the `partner_bank_id` if the user changed it manually in the wizard. **Solution:** * Update `_compute_trust_values` to also validate the currently selected `partner_bank_id`, ensuring the trust check reflects the user’s actual selection. opw-5059740 Forward-Port-Of: odoo/enterprise#95124
Arabic invoice reports for Saudi Arabia now display the description column with consistent alignment alongside the other invoice columns. This improves readability for users printing or sharing localized invoices without changing invoice data or workflow.
Original PR description
**Steps to reproduce:** 1. Install l10n_gcc_invoice. 2. Add and Switch to a Saudi Arabia company. 3. Select boxed layout (or keep any layout). 4. Create and print an invoice. **Issue:** - The…
**Steps to reproduce:** 1. Install l10n_gcc_invoice. 2. Add and Switch to a Saudi Arabia company. 3. Select boxed layout (or keep any layout). 4. Create and print an invoice. **Issue:** - The description column is misaligned in the Arabic invoice report. According to Saudi localization, it should be aligned to the left for better readability. The current alignment makes Arabic text inconvenient to read. **Cause:** - Other columns (e.g., quantity, taxes) already use the `text-end` class, but the description column has no alignment class, causing inconsistent layout and misalignment. **Solution:** - Added the `text-end` class to the description column to ensure proper alignment and consistent readability in Arabic invoice reports. **Before FIX:** <img width="831" height="329" alt="image" src="https://github.com/user-attachments/assets/857f9f7f-d930-4c73-b2fa-eacd7a153ea3" /> **After FIX** <img width="788" height="354" alt="image" src="https://github.com/user-attachments/assets/929acdb1-bb13-4e1e-829c-8fdbe18334a4" /> **opw-5087770** Forward-Port-Of: odoo/odoo#228118
This fix prevents an error from appearing when users change a website theme color and then save their changes. It improves the reliability of the website editing experience by handling the save process correctly.
Original PR description
This PR resolves a traceback that occurred when changing the theme color from the color palette and pressing the save button. This was due to an unhandled promise rejection. task-3919146 Forward-Port-Of: odoo/odoo#227946
The forum page cover block can now be selected and edited in the website builder. This restores expected editing behavior for website managers, making it easier to customize forum pages without workarounds.
Original PR description
Steps to reproduce: - Go to the "/forum" page and click "Edit". - Click the "s_cover" block. - Bug: the snippet is not editable. The cover snippet contains a link rendered with "t-attf-href", which makes the website builder refuse to mark the block as editable. This commit adds "t-ignore="True"" on the "oe_structure" so the branding stops before reaching the link and the snippet becomes editable again. task-5095234 Forward-Port-Of: odoo/odoo#227724
This update makes sure errors raised during automated tests are properly detected and reported. It helps improve product quality by preventing problems from being silently ignored before release.
Original PR description
This commit follows a community fix that restores proper error handling within and outside of unit tests. As such, it fixes tests reporting errors that were previously not picked up. Community PR: https://github.com/odoo/odoo/pull/228836
The internal web test runner now treats errors and warnings with clearer severity levels, so problems are reported appropriately depending on when they occur. This helps prevent test issues from being missed or from unnecessarily stopping test runs, improving confidence in automated quality checks.
Original PR description
This commit associates separate "issue levels" to the test runner's internal logger. These affect the logging and reporting of issues, i.e. errors and warnings: - suppressed (by 'test.todo'): issues are traced in the console but not reported in test results; - trace (default in test runs): issues are traced in the console and reported in test results; - global: issues are warned/errored in the console with "HOOT" prefix (i.e. won't interrupt the test run); - critical (default outside of test runs): issues are warned/errored in the console without "HOOT" prefix, thus interrupting the whole test run. This fix should hopefully solve errors that were too quiet before test run, or too "important" during the run. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228674
Users who open a product’s View Diagram without a warehouse configured for their company will now see a helpful warning instead of an error. This prevents a confusing crash and guides users toward completing warehouse setup.
Original PR description
Currently, if a user creates a new company without configuring its warehouse, clicking 'View Diagram' raises an error. **Steps to Reproduce:** 1) Install sale_stock module.(with Demo Data) 2)…
Currently, if a user creates a new company without configuring its warehouse, clicking 'View Diagram' raises an error. **Steps to Reproduce:** 1) Install sale_stock module.(with Demo Data) 2) Navigate to Inventory>Configuration>Warehouses and create a new Warehouse. 3) Create a new company and switch to that company. 4) Navigate to Inventory>Products>Products 5) Open any product and click on 'View Diagram' in the 'inventory tab'. **Error:** `AttributeError: 'bool' object has no attribute 'origin'` **Root Cause:** On following above steps, `default_get` method is called. At [1], it attempts to fetch the ID of the warehouse. Because Odoo does not create a default warehouse for a newly created company, the value received by `res` at [2] looks like `[(6, 0, ['False'])]` which causes an error during further computation. **Fix:** Raise a `Redirect Warehouse Warning` when clicking 'View Diagram' if no warehouse is found. [1]- https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/stock/wizard/stock_rules_report.py#L35 [2]- https://github.com/odoo/odoo/blob/a729578afb7fed79aac2d622aae4da4c0917f8e5/addons/stock/wizard/stock_rules_report.py#L36 **Note**: not adding a test case, as the issue is not reproducible in test mode as default warehouse is created for a company in the test mode https://github.com/odoo/odoo/blob/de264d99c22283390d18beb7c7c62c29824f72b3/addons/stock/models/res_company.py#L197-L198 sentry-6575082178 Forward-Port-Of: odoo/odoo#227810
Helpdesk team tag assignment now only shows internal users when selecting team members. This prevents portal users from being assigned to ticket dispatch rules by mistake, keeping automatic assignment setup accurate.
Original PR description
**Steps to Reproduce:** 1. Go to Helpdesk → Overview. 2. Open a team (e.g., 'Customer Care') and click on 'Settings'. 3. In the team settings, enable 'Automatic Assignment' → 'Dispatch tickets based on tags'. 4. Configure tags handled by team members. 5. In the 'Team Members' field, try to assign users. **Issue:** Portal users are displayed in the 'Team Members' selection list, even though they should not be assignable to helpdesk team tags. **Current behaviour:** - The 'Team Members' field shows all users, including portal users. **Expected behaviour:** - Only internal users should be selectable as 'Team Members'. - Portal users should not appear in the many2many list. **Fix:** Added a domain on the 'user_ids' field to exclude portal users from the 'Team Members' selection. **task-5093188** Forward-Port-Of: odoo/enterprise#95264
The website now keeps video size placeholders hidden until visitors accept optional cookies. This prevents blocked video areas from appearing incorrectly and keeps the page behavior aligned with privacy choices.
Original PR description
Commit [958b41c] introduced a way not to load videos if the user did not accept optional cookies. In doing so, the "video size" container was hidden. However, since [b9b3a60], the code was wrong: - Instead of a proper handler, the `optionalCookiesAccepted` listener wasn't a listener at all and immediately removed `d-none` on `media_iframe_video_size`. - It was all done in the `setup` instead of the `start` or `dynamicContent`. [958b41c]: https://github.com/odoo/odoo/commit/958b41c4acec7e1700ca4d6e0b25ee0ad2aac9f1 [b9b3a60]: https://github.com/odoo/odoo/commit/b9b3a605e0f4c5da3a258c980107d6162da7f44f Forward-Port-Of: odoo/odoo#226817
This update ensures the main DATEV account is only assigned to companies based in Germany, preventing incorrect reporting setup for companies in other countries. It also improves how debit and credit lines are gathered, making the process more efficient for larger accounting entries.
Original PR description
The main datev account should only be set for German companies (check for country code) Also fix the complexity of gathering the debit and credit lines: `+=` has a complexity of `O(n²)` whereas `filtered` has a complexity of `O(n)`. Forward-Port-Of: odoo/enterprise#69881
The task list now shows the allocated hours field even when the value is zero, so users can edit it directly during bulk task updates. This removes a small usability blocker for planning and timesheet management.
Original PR description
Before this commit, when the user would like to edit the allocated hours field of multiple tasks inside the list view, he cannot when the allocated hours is equal to 0. The reason is because the cell is hidden once the value is equal to 0. This commit makes that field is always editable in the list view of tasks even if the value is 0. task-5093288 Forward-Port-Of: odoo/odoo#228862 Forward-Port-Of: odoo/odoo#228188
This fixes an e-invoicing issue where OIN identifiers of a specific length could be marked with the wrong scheme code. It helps ensure BIS3 and NLCIUS electronic invoices are generated with the correct recipient identification, reducing rejection or compliance issues.
Original PR description
We previously [1] fixed the EAS that was incorrectly set to 0106 instead of 0190 in case of OIN (lenght = 20). This fix was overriden in the backport of the 19.0 dict helpers [2]. [1]: https://github.com/odoo/odoo/pull/219424 [2]: https://github.com/odoo/odoo/pull/215610 opw-5107445 Forward-Port-Of: odoo/odoo#228624
This fix removes a remaining source of unpredictable behavior in an automated Web Studio rename test. It helps keep quality checks stable, reducing false failures during development and release validation.
Original PR description
Similar to https://github.com/odoo/enterprise/commit/5574c52df8794b3f23d385a670cac8fb5355e229 There was still one indeterminism remaining runbot-232572 Forward-Port-Of: odoo/enterprise#95447
This fix keeps the website preview consistent after changing page styling, such as boxed layout or background color. It prevents a brief flicker of the previous design when the preview reloads, giving website editors a smoother and more reliable editing experience.
Original PR description
In this [commit], fallback iframe was added to avoid flickering between iframe reloads. But the flicker still happens if we change page's style, since we do not apply the new styles to the fallback iframe. To reproduce the issue: - Open Website and start editing - Move to the 'Theme' tab - Change page layout to 'Boxed' - Set background color to a non-transparent color, e.g. red - Save, and do any action to reload the iframe, e.g. go to /contactus => The iframe flickers from the previous color to red, which shouldn't be the case. Task-4985472 [commit]: https://github.com/odoo/odoo/commit/7b19831e1c624b483008feb526ba773ec8b23009 Forward-Port-Of: odoo/odoo#221391
This fix prevents an error when users open the General Ledger from the Trial Balance while working with multiple companies in Developer Mode. It ensures the report search opens correctly instead of showing a traceback, improving reliability for accounting users.
Original PR description
**Issue** When multiple companies are selected and Developer Mode is enabled, clicking "View General Ledger" for an account in the Trial Balance leads to a traceback. This affects accounts whose code is hidden. **Steps to Reproduce** 1. Go to Accounting > Reporting > Trial Balance. 2. Select multiple companies. 3. Click on an account where the account code is not visible. 4. From the three-dot menu, select "View General Ledger". 5. Observe the traceback error. **Root Cause** The error occurs because the `AccountReportSearchBar` component expects a string `initialQuery` prop, but in the multi-company scenario with developer mode enabled, the value passed can be `undefined` or non-string. Owl's strict prop validation then throws an `OwlError`, leading to the traceback. **Fix** Ensure that `initialQuery` is always a string when passed to `AccountReportSearchBar`. Opw-5050843 Forward-Port-Of: odoo/enterprise#94104
This fix ensures packaging details entered on a product are correctly carried over to its product variant, including products without attribute options. This prevents missing or inconsistent packaging information for users managing products and sales operations.
Original PR description
e158730ba16e898a13dd9a98ed96fa30fa95ab6f recently fixed a situation where one-variant products had duplicated packagings. In the aforementioned commit, we concluded that the logic to write (again) the templates values for variant-stored fields was useless because already applied to the generated variants. Nevertheless, while trying to remove in master this logic, we noticed that those varlues are only applied to variants of templates having at least one attribute line, whose creation will trigger the variants creation. This commit therefore partially reverts the previous commit, bringing back the first solution that is still the best approach in the end. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229080
This fix prevents font size values entered in the website builder from gaining unwanted decimal places after unit conversion. Users can now enter values like 19px and have them remain stable, improving trust and consistency when editing website styles.
Original PR description
__Current behavior before commit:__ When typing an integer value in the font size input, some decimals are added automatically because the value entered in `px` is first converted to `rem` then it's converted back to `px` but some precision is lost in `convertNumericToUnit` because `toFixed(3)` is called on the result. __Description of the fix:__ `toFixed` is removed from `convertNumericToUnit` to avoid any loss of precision on the value saved. However it's now used in `formatRawValue` so that the value displayed to the user is stays clean. This way we keep the behavior intended by [this PR]. __Steps to reproduce the issue on runbot:__ 1. Open the website builder. 2. Go to the *Theme* tab. 3. In Paragraph section, set the Font Size to 19px. => It gets changed to 19.008px automatically. [this PR]: https://github.com/odoo/odoo/pull/221754
This change ensures an online shop pricing test has pricelists enabled before it runs. It prevents false test failures in databases without demo data, helping keep release validation reliable without changing customer-facing behavior.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Have a database without demo data; 2. run `test_cart_new_pricelist_from_geoip`. Issue ----- Test fails, due to the order not having a pricelist. Cause ----- Pricelists aren't enabled by default without demo data. Solution -------- Call `self._enable_pricelists()` at the start of the test. runbot-232989 Forward-Port-Of: odoo/odoo#229224
A sales and manufacturing test was corrected so kits can be invoiced before delivery when they are set to invoice based on ordered quantities. This helps keep automated checks aligned with the intended business flow and prevents build failures around kit invoicing validation.
Original PR description
This change updates the test_sell_kit_invoice_before_delivery test to ensure that kit components and the kit product itself use an invoicing policy of Ordered Quantities rather than the default Delivered Quantities. build_error-232796 Forward-Port-Of: odoo/odoo#227870
This fixes an issue where Discuss could fail when receiving an update for a call session that had already been removed. Users benefit from a more stable messaging and calling experience, especially when session events arrive out of order.
Original PR description
Before this commit, since a regression introduced in https://github.com/odoo/odoo/pull/228601 A traceback could occur when updating a session that does not exist. For example if the event is received after the session is removed. Forward-Port-Of: odoo/odoo#229166 Forward-Port-Of: odoo/odoo#229073
The POS now correctly shows that a self-order has already been sent for preparation when staff open it from the ticket screen. This avoids confusing staff with an unnecessary highlighted Order button and helps prevent duplicate preparation actions.
Original PR description
In the POS UI, the "Order" button was wrongly highlighted when loading a self-order, even though it had already been sent Steps to reproduce: - Create an order using self-order mobile (or kiosk). - Open the related POS terminal. - Load the self-order from the ticket screen. - Notice the "Order" button remains highlighted. Fix: - Ensure the last order changes updated when loading self-order in pos Task: 5005161 Forward-Port-Of: odoo/odoo#228682 Forward-Port-Of: odoo/odoo#223560
Creating a salesperson from a CRM opportunity no longer copies unrelated lead phone or mobile details into the new salesperson record. This prevents incorrect contact information from being saved and helps keep CRM and salesperson records accurate.
Original PR description
To reproduce: ============= 1- add a lead 2- add a phone and a mobile number 3- convert it to opportunity 4- create salesperson from that view 5- salesperson contains lead number Problem: ========= Before this fix, creating a Salesperson inherited the global context, which included unrelated values as active_model was set to crm.lead. This led to incorrect default values being applied. https://github.com/odoo/odoo/blob/d155edfd729ab9b53f38939fe24b6d1e7b578083/addons/web/models/models.py#L872C13-L872C21 The default values contained the lead phone and lead number and was applied in the creation of salesperson. Solution: ========== Since we have some synchronization of some fields (email, phone) that is automatically done normally, it's reasonable to remove the code and see what it gives. opw-4871069 Forward-Port-Of: odoo/odoo#229171 Forward-Port-Of: odoo/odoo#217545
This fix prevents rare crashes when users quickly change website shop page options that reload the editor. It improves reliability of the product page editing experience and strengthens automated checks so the issue is caught consistently.
Original PR description
*: website_sale __Current behavior before commit:__ Some builder actions (e.g `ProductPageImageLayoutAction`) reload the editor after being applied. If another button in the builder is pressed…
*: website_sale __Current behavior before commit:__ Some builder actions (e.g `ProductPageImageLayoutAction`) reload the editor after being applied. If another button in the builder is pressed rapidly, `refreshCurrentItem` might be called after the editor is destroyed leading to the following error in [`isApplied`]: `TypeError: Cannot read properties of undefined (reading 'getAction')`. The "Product page options" test fails in rare occasion due to this issue. __Description of the fix:__ - Add a safety guard to make sure the editor is not destroyed before calling `refreshCurrentItem`. - Add some checks at the end of the test in order for the crash to appear consistently (if the fix is not applied). - Make the test more robust (some code is backported from [this commit]). [this commit]: https://github.com/odoo/odoo/commit/670b1daa2254d76 [`isApplied`]: https://github.com/odoo/odoo/blob/f258b263136f606f7896/addons/html_builder/static/src/core/utils.js#L939 Runbot error: https://runbot.odoo.com/odoo/runbot.build.error/232649
The Field Service onboarding guide now works correctly even when a Field Service project already contains task templates. This helps new users complete setup without being blocked by existing project data.
Original PR description
This commit's purpose is to allow the fsm onboarding tour to work even if there are existing task template within the fsm project. note : This commit has to be edited in the 19.0 forward port, since its IsActive selector was updated. It should be ["body:has(.o-kanban-button-new.o-dropdown-caret"] instead. task-5088820