Wednesday, October 29, 2025
30 changes · saas-18.4
New functionality added to Odoo
The recruitment AI feature has been separated into its own bridge module, making it easier to manage and deploy independently. This helps keep recruitment functionality cleaner while preserving the AI-assisted applicant workflow.
Original PR description
Task-5079755
Enhancements to existing features
The accounting accrual orders wizard is being adjusted so future customizations can split reversal entries across multiple periods instead of relying on one reversal in the next period. This helps businesses that need accruals to better match invoices over time, improving period-by-period financial accuracy.
Original PR description
Add a dedicated hook method to facilitate customization of reversal entry generation in the accrued orders wizard. Reason: The current implementation creates a single reversal entry that is applied in the next period. For scenarios requiring accrual allocation across multiple periods, modules need the ability to generate multiple reversal entries (one per period) to properly net-off against actual invoices --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233295 Forward-Port-Of: odoo/odoo#233142
Resolved issues and error corrections
Rating icons in Live Chat, Discuss, and Ratings screens now use a transparent background instead of showing a white box in dark mode. This makes reporting and feedback views look consistent and easier to read for users working with dark mode enabled.
Original PR description
**Current behavior before PR:** The rating images have an unintended white background in dark mode. **Steps to Reproduce:** - Turn on Dark Mode - Go to livechat - Go to Report > Sessions History…
**Current behavior before PR:** The rating images have an unintended white background in dark mode. **Steps to Reproduce:** - Turn on Dark Mode - Go to livechat - Go to Report > Sessions History **Desired behavior after PR is merged:** This PR fixes the issue by applying a transparent background to rating images through the `img_class` option in image widget. The change is applied to: - discuss.channel (kanban, list, form views) - rating.rating (form, kanban views) --- **Before:** <img width="372" height="202" alt="image" src="https://github.com/user-attachments/assets/d573ab3e-62be-4ab2-9c7f-e39bf97cb542" /> **After:** <img width="394" height="141" alt="image" src="https://github.com/user-attachments/assets/6133c231-c634-4afd-a99f-5440ecfe72be" /> task-[4689867](https://www.odoo.com/odoo/project/1519/tasks/4689867) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231919 Forward-Port-Of: odoo/odoo#215207
This commit https://github.com/odoo/odoo/commit/74109a1b1a5d31fa55b08257f6a9365b0c1758f0 broke the po by not putting the module the term comes from. This resulting in a traceback when installing the language. It also breaks existing database with Arabic and l10n_jo already set. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233379
Original PR description
This commit https://github.com/odoo/odoo/commit/74109a1b1a5d31fa55b08257f6a9365b0c1758f0 broke the po by not putting the module the term comes from. This resulting in a traceback when installing the language. It also breaks existing database with Arabic and l10n_jo already set. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233379
This update corrects an internal test for timesheets involving time off and public holidays. It ensures the test uses the right user context, helping maintain reliability of holiday-related timesheet behavior without changing day-to-day functionality.
Original PR description
In the 'test_timesheet_time_off_including_public_holiday' test case, 'employee' was mistakenly passed to 'with_user'. This commit replaces 'employee' with 'user' for consistency. task-4809916 Forward-Port-Of: odoo/odoo#233366
Updating a customer statement email template now works even if all recipients have been removed. This prevents an unexpected error and lets accounting users continue preparing statements without interruption.
Original PR description
Currently, an error occurs if the recipients of the statement report are removed and the user tries to update the email template. **Steps to Reproduce:** 1. Install Accounting. 2. Customers (list view) > select any record > Actions > Customer Statement > Send. 3. Remove recipients and try to update the email template. **Error:** `KeyError - False` **Cause:** The system tries to fetch mail field values from an empty recipient list, leading to a KeyError. **Fix:** This commit recomputes the recipient partners before updating the email subject and body from the template. sentry-6918345730 Forward-Port-Of: odoo/enterprise#96273
This fix prevents Swedish IBAN payments from being incorrectly treated as local BBAN payments when account type information is missing. It helps avoid misclassification in payment batches and keeps payment processing logic reliable.
Original PR description
The method `_is_se_bban` is supposed to flag if payments are bban or iban. But since 8d77c0442d7912880c5da5976c92b24d3f9885ca,
the method returns True for batch of iban payments when you don't provide the `partner_acc_type` params, because
`len({'bban_se', 'plusgiro', 'bankgiro', *(partner_acc_type or {})}) == 3`
is always True if `partner_acc_type` is None.
This commit fix that behaviour, by replacing the empty set by `{'iban'}`, meaning the second condition will always be
False when `partner_acc_type` is None.
This bug has been found by failing runbot tests (error: 233465)
no-task
Forward-Port-Of: odoo/enterprise#97876The French accounting localization now restores the proper accounts for rounding differences after they were accidentally changed. This helps ensure accounting entries use the correct account type and stay consistent with French chart of accounts expectations.
Original PR description
These accounts were changed by mistake. Even more, they're of the wrong type. Re-add account to be consistent with 758 opw-5180702 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232902
Fixed an issue where the deadline date picker could remain visible after users navigated away from a task using the browser back button. This prevents a confusing leftover popup and keeps the interface clean when moving between pages.
Original PR description
Steps to reproduce ================== - Go to project - Open a project - Open a task - Click on the deadline field - Go to the previous page using the browser back button => The datepicker stays open Cause of the issue ================== `datetimePicker.create` was called using three parameters. But since bb1f912f04fbc4b1efe57847bceffce5895ced9b, it only accepts two. Solution ======== `createPopover` should be added to the `hookParams` This allows the popover to be closed when the owner component is destroyed. https://github.com/odoo/odoo/blob/bb1f912f04fbc4b1efe57847bceffce5895ced9b/addons/web/static/src/core/popover/popover_hook.js#L65 opw-4811594 Forward-Port-Of: odoo/odoo#213263 Forward-Port-Of: odoo/odoo#212580
This fixes how placeholder guidance text appears in the Web Studio report editor after an underlying editor change. It helps users continue editing reports with clear prompts instead of missing or incorrect hint text.
Original PR description
Since odoo/odoo@b4d96ac60b212224e7e9a4de13e76209f42c7eda the html_editor's hint text attribute has changed This commit just adapts the report's iframe css to take that into account. Forward-Port-Of: odoo/enterprise#97651
This fixes how Peppol-related partner screens are linked to the underlying electronic invoicing views. It prevents upgrade-time errors caused by the system looking for fields before they are available, improving reliability for companies using Peppol/e-invoicing.
Original PR description
Currently the following views inherit from `base.view_partner_tree`: - `res_partner_form_account_peppol` - `res_partner_view_tree` The views mentioned about contain xpath expressions based on the `ubl_cii_format` field. But the view in `base` does not include the field yet. It is added in module `account_edi_ubl_cii`. This commit changes the inheritance to be from the equivalent views in `account_edi_ubl_cii` instead. Otherwise there is an error in a test when upgrading from 16.0 to 17.0 with the backported `account_peppol` to 16.0. task-4925169 Forward-Port-Of: odoo/odoo#233461 Forward-Port-Of: odoo/odoo#231637
This fix prevents website forms from crashing when a form field is changed into an attachment upload field. It ensures file upload fields are skipped when the system tries to automatically prefill form values, improving reliability for website editors.
Original PR description
Steps to reproduce: =================== 1- Add a Contact Us form. 2- Change the "Phone" field type to "Attachment" and save. → Traceback occurs. Cause: ====== After changing the field type, the field…
Steps to reproduce: =================== 1- Add a Contact Us form. 2- Change the "Phone" field type to "Attachment" and save. → Traceback occurs. Cause: ====== After changing the field type, the field still keeps its `fillWith` value. When saving or refreshing, the system tries to prefill it with a phone number. Since the type is now "file", it cannot be prefilled, causing a traceback. Why it didn't happen before: ============================ In older versions, fields were fetched using `serializeArray()`: https://github.com/odoo/odoo/blob/ad03751ef0a9e617c2b24a30b1c06aa4e25d48a1/addons/website/static/src/snippets/s_website_form/000.js#L167 That method automatically filtered out unsupported input types: https://github.com/odoo/odoo/blob/ad03751ef0a9e617c2b24a30b1c06aa4e25d48a1/addons/web/static/lib/jquery/jquery.js#L9001 Fix: ==== Exclude fields of file-like types from the prefill logic, similar to the behavior of `serializeArray()`. opw-5145855 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231185
Product packaging screens now show a sensible unit name when a unit is missing a related reference unit. This prevents confusing labels such as "1 Undefined" when users configure packaging conversions.
Original PR description
### Steps to reproduce: - In the settings enable "Product Packaging" - Create a product and set its `uom_id` (next to sales price) to "pack of 6" - In the sales tab click on Packagings > This opens a list view of units with convertions #### > The "Units" is converted to "1 Undefined" ### Cause of the issue: The "Units" uom does not have any set `relative_uom_id` so that `record.relative_uom_id[1] ` is undefined: https://github.com/odoo/odoo/blob/e44ea4adbe56586349b78ae4796803777d8a782a/addons/uom/static/src/components/many2x_uom_tags/many2x_uom_tags.js#L74 opw-5189284 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233074
This fix prevents errors when Odoo updates analytic accounting lines that do not have a distribution set. Accounting workflows can continue smoothly instead of being interrupted by a failed update.
Original PR description
Description of the issue/feature this PR addresses: This pull request addresses a bug in Odoo's analytic accounting module. Specifically, when updating analytic lines that have empty distributions,…
Description of the issue/feature this PR addresses: This pull request addresses a bug in Odoo's analytic accounting module. Specifically, when updating analytic lines that have empty distributions, the vals_list[0] ends up being empty. This situation causes an error in the write method, which prevents the system from properly updating analytic lines without distributions. Current behavior before PR: Before this fix, attempting to update analytic lines with empty distributions triggers an error in the write method. As a result, operations that involve updating such lines fail, potentially interrupting normal accounting workflows. Desired behavior after PR is merged: After merging this PR, the system will first check whether an analytic line has a valid distribution before attempting to update it. Lines with empty distributions will be safely skipped, preventing errors and allowing the rest of the analytic updates to proceed smoothly. This ensures more robust handling of analytic lines and avoids runtime exceptions during updates. Video: https://app.screencastify.com/watch/03zuCLh984kWun2Q71tK Odoo Task: https://www.odoo.com/es_ES/my/tasks/5181171 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232176
This fix prevents SAF-T general ledger processing from failing or returning incorrect results when an accounting entry has no linked partner. It improves reliability for companies generating statutory accounting reports, especially where some transactions are not tied to a customer or supplier.
Original PR description
### Issue: After #95804 , some of the code was improved but the consideration for partner_id being None was not expected. To fix this issue, we add partner_id on the domain. OPW-5177365 Forward-Port-Of: odoo/enterprise#98240
This fix keeps the website editor's list styling from unintentionally changing list content elsewhere on the page. It helps preserve the intended appearance of frontend pages when the editor is loaded.
Original PR description
Problem: The CSS selector `li *` was applied globally, affecting all list content on pages where the editor is loaded — including frontend content outside the editor. Cause: The selector was not scoped to the editor context, so its styling leaked into non-editor elements. Solution: Restrict the `li *` selector to apply only within headers inside the editor to prevent unwanted global styling. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232336
This fixes a repair order issue where a serial number entered on a new repair line could disappear after saving. The serial number field is now only editable once the repair line has been saved, preventing lost selections and reducing rework for users.
Original PR description
When creating a repair order, if you add a line and assign a serial number before saving the line, the serial number is removed when saving. Steps to reproduce: - Create a repair order and save it. - Add a repair line with a product tracked by serial number. - Without saving the repair order, add a serial number on the line. - Save the repair order. - You will notice that the serial number is no longer assigned to the repair line. This PR fixes the issue by making the serial number field read-only until the repair line is saved. opw-5156267 Forward-Port-Of: odoo/odoo#233264 Forward-Port-Of: odoo/odoo#232973
Fixed an issue where course slides with a vertical bar character in their name could cause the browser tab title to show the wrong website name after navigating between slides. This keeps course navigation clearer and avoids confusing page titles for learners.
Original PR description
How to reproduce: - Go to a course with a slide containing "|" in its name. (e.g. Basics of Gardening) - Change slide to this special named slide. - Change back to another slide. - The browser title contains the string part after the "|" instead of the website name. This commit now handles slides with name containing the "|" character. Task-5152858 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230489
The website editor no longer crashes when updating the Terms and conditions link on product pages. The fix correctly handles text colors applied through preset styling classes, making link edits more reliable for website managers.
Original PR description
Problem: On website > shop > product page, when trying to edit the link of "Terms and conditions", a traceback occurs. Cause: When applying changes on "Terms and conditions" in `shop/product`, `ColorPlugin.removeAllColor()` is called on the `a` element. Its color was applied by the `text-muted` class. This case in color removal was not properly handled. Solution: In `getFonts`, consider elements that have those special classes (e.g., `text-muted`) when processing color removal. Steps to reproduce: 1. Open website/shop. 2. Open any product page. 3. Open the editor. 4. Select the "Terms and conditions" text. 5. Click edit in the link popover. 6. Click apply. 7. Traceback occurs. opw-5130016 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233305 Forward-Port-Of: odoo/odoo#229725
Dimona-related employee fields are now shown only for Belgian employees instead of appearing for all employees. This keeps employee records cleaner and reduces confusion for companies or staff outside Belgium.
Original PR description
Before this commit, the fields about dimona were shown for all employees, now these fields will be displayed only for belgian employees. task-5148931
Users whose contact record is linked to multiple user accounts can now create spreadsheets from the Documents app without hitting an error. This prevents a blocking crash in a specific contact setup, helping affected users continue their normal document workflow.
Original PR description
Before this commit: 1. connect with a user, the partner_id of which is linked to multiple users via the user_ids field (this can be done by manually setting it, or by merging contacts, for example) 2. go to the Documents app, click new, then spreadsheet --> expected singleton Traceback opw-5133850 Forward-Port-Of: odoo/enterprise#97767
This fix prevents unrelated demo products from interfering with an automated website shop test. It helps keep test results reliable when demo data is installed, reducing false failures during quality checks.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Set up a database with demo data; 2. run `:TestWebsiteSaleProductFilters.test_latest_sold_filter`. Issue ----- Test fails. Cause ----- The filter retrieves demo products that aren't part of the test suite. Solution -------- In `setUpClass`, execute a SQL query archiving all nonrelevant product templates/variants, bypassing any ORM-level constraints. runbot-233399
A stability fix was added to ensure the website wishlist is empty before an automated sales flow test continues. This reduces random test failures and helps keep updates to the online shop experience moving through validation reliably.
Original PR description
Add a step to make sure the wishlist is empty before continuing the tour runbot-229616 Forward-Port-Of: odoo/odoo#233262
The Tasks shortcut on a sales order now preserves the user's language settings when opening related tasks. This prevents menus from unexpectedly switching back to English for users working in another language.
Original PR description
Repro:
- Activate any language different than english
- Create a service product with create Project & Task
- Create a sales order with the product
- Navigate with smart buttons Project > Tasks > Activate Top Menu
- All good
- Now navigate directly to Tasks from the sales order
- Top Menu is in English
Issue:
- The issue here is the context language being lost due to context overriding in the code.
Fix:
- In this commit, I have updated the method from `with_context({'active_id': self.id})` to
`with_context(active_id=self.id)`. This fix ensures that the previous context is retained.
opw-5160373
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233362This update keeps Odoo installable on newer Debian and Ubuntu versions after an older PDF library package was removed from those operating system repositories. If the old package is unavailable, the setup now uses its replacement so deployments can continue without manual workaround.
Original PR description
pypdf2 is not present anymore in debian/trixie Fallback on pypdf if pypdf2 is not available Note that it should mainly fix the deb_install but future fixes may be needed Forward-Port-Of: odoo/odoo#233598
The recruitment refusal reason screen no longer includes an AI widget that has been moved to a separate bridge module. This prevents the recruitment app from depending on a component that now belongs elsewhere, keeping the user experience consistent and avoiding configuration issues.
Original PR description
The ai widget was moved to a new bridge module. Task-5079755
The Sign app now handles adding a new signer in a more reliable way. This prevents occasional display issues where signer fields might not appear consistently, helping users complete document setup without confusion.
Original PR description
Refactor setTimeout usage in sign_template_sidebar.js to prevent non-deterministic behavior. The previous implementation introduced potential timing issues by relying on a fixed 100ms delay, causing span and input components to not render consistently. The refactored code ensures proper rendering order and resolves the timing-related problem. task-4926187
This update ensures the employee admin payroll setup is defined in the payroll module where it is required. It helps prevent incomplete employee records from being created during payroll data loading or updates.
Original PR description
The field `structure_type_id` for the `hr.employee_admin` record was being set in the `hr` module, while it is required here. This fix moves the override to the module that needs it and adopts the forcecreate=0 that is added to the original `hr.employee_admin` record to avoid creating null values employee.
This fix improves Odoo's automated test cleanup by detecting leftover processes when tests finish. It helps prevent test runs or server shutdowns from getting stuck, making development and release validation more reliable.
Original PR description
In some case a process could remain aive at the end of a tests In addition to possible race condition, this can also cause a program to remain stuck at the end of the tests. This commit proposes to - catch all remaining processes at the end of a base case. - log a message if a process is found at the shutdown of the server. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231942
This update fixes an unreliable automated test in the Manufacturing area that could pass or fail depending on tiny timing differences. It helps keep quality checks consistent and reduces false alarms during development, with no direct impact on daily users.
Original PR description
### Issue: The test `test_mrp_backorder_operations` behaves non-deterministically. It may fail at this assertion:…
### Issue: The test `test_mrp_backorder_operations` behaves non-deterministically. It may fail at this assertion: https://github.com/odoo/odoo/blob/6e37542b53f9c9ec1baf8d58b1eeca376252186f/addons/mrp/tests/test_backorder.py#L986-L989 Because the `duration` of done workorder can vary. ### Cause: The delta time between `button_start()` and `button_finish()` https://github.com/odoo/odoo/blob/6e37542b53f9c9ec1baf8d58b1eeca376252186f/addons/mrp/tests/test_backorder.py#L983-L985 `button_finish()` triggers `Productivity._close()` https://github.com/odoo/odoo/blob/6e37542b53f9c9ec1baf8d58b1eeca376252186f/addons/mrp/models/mrp_workcenter.py#L572-L576 Which sets `Productivity.duration` to 0 if delta time is zero. Consequently, `workorder.duration` also becomes zero. When `bo_2.button_mark_done()` is called, the duration is set to `duration_expected` (240 in this test), which the assertion only can pass in that case. If delta time isn't zero, then duration will also be non-zero. So it will not set to `duration_expected`. As a result the assertion will fail. runbot-233247 Forward-Port-Of: odoo/odoo#231650