Daily updates from Odoo
Friday, October 10, 2025
130 changes
20 changes
Enhancements to existing features
UBL invoice exports now include the delivery party in the delivery information. This gives recipients clearer shipping details by using the shipping contact when available, or the customer name as a fallback, while keeping existing delivery location and date behavior unchanged.
Original PR description
Previously, the Peppol UBL export only covered the mandatory delivery fields and did not include the `delivery party`. This commit adds the `<cac:DeliveryParty>` element under `<cac:Delivery>` to improve the exported information. - Include `<cac:DeliveryParty>` in the `<cac:Delivery>` section of UBL invoices. - Use the shipping partner name if set; otherwise, fallback to the customer name - Keep existing `<cac:DeliveryLocation>` and delivery date logic unchanged. <img width="766" height="306" alt="image" src="https://github.com/user-attachments/assets/d07c1b37-4c6d-42d1-99b4-66c5abc8e298" /> ----- task-5022404 Forward-Port-Of: odoo/odoo#223756
Resolved issues and error corrections
The time off request summary card has been adjusted so leave measured in hours displays clearly without overly long text. This improves readability for employees and managers reviewing time off requests.
Original PR description
On a time off request, there is a summary on the side. Problem: if we have time off in hours, the display is not adapted and the text is too long. This commit fixes the issue to display the hours correctly. task-5092855 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#227631
This fixes how tables copied into the HTML editor are handled so they automatically receive the standard Odoo table styling. Users get more consistent, properly bordered tables after pasting content, reducing manual formatting work.
Original PR description
### Purpose of this PR: - Ensure that pasted table elements get the standard classes: `table, table-bordered, and o_table.` --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230517 Forward-Port-Of: odoo/odoo#230208
The Attendance app now correctly groups records by department after correcting a typo. This helps users get accurate department-based attendance views and reports without workarounds.
Original PR description
- Fixed typo in groupby for 'department' task-id - 5109185 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228334
Creating a goal from an employee appraisal now assigns the goal to the employee being appraised, rather than the current user. Creating a goal directly from the Goals menu no longer pre-fills employee or manager fields, reducing incorrect goal assignments.
Original PR description
If you go on _appraisals -> any employee -> goals smart button -> new_, it will populate the employee field with the current user. Instead, the field should be filled by the appraisal's user. If the goal is created from the "Goals" menu item directly, then no user / manager should be put by default in the goal's fields. I changed the field's default value to use the employee already passed in the context. I also added some tests to make sure the bug doesn't happen again. task-5048292 Forward-Port-Of: odoo/enterprise#93522
This fix prevents Odoo from recreating the default employee administrator record during updates when companies have already replaced it with their own setup. This helps avoid unwanted sample-like employee records reappearing in HR data after upgrades.
Original PR description
The `employee_admin` is a default admin option. Later when clients set up their work flow they set up their own admin employee. This record is not present, and it doesn't make sense recreate it with every update. 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#230250 Forward-Port-Of: odoo/odoo#228117
This update corrects how table cells are selected in the HTML editor. A single cell is now selected only when all of its content is selected, preventing confusing or accidental selections while editing text in tables.
Original PR description
Current behavior before PR: - Create an m x n table. - Write some text in a cell. - Put cursor at the end of text. - Try to select cell by moving mouse rightwards. Notice that the cell is selected although the cell content is not fully selected. Desired behavior after PR: This PR backports commit [1] to ensure that single cell is selected only if the cell content is fully selected. [1]: https://github.com/odoo/odoo/commit/09d369e118f622f30149f46702f58c656a3cee04 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230133 Forward-Port-Of: odoo/odoo#230071
Videos added inside certain website layout blocks now expand to the full width available instead of appearing unexpectedly small. This improves the editing and viewing experience for website pages using Masonry or Quadrant-style sections.
Original PR description
To reproduce: ============= 1- In Website edit mode, drop the "Masonry" snippet. 2- Add a video in one of the text blocks. -> It will appear smaller than expected, with no way to make it larger Why: ==== The child iframe already had width: 100%, but it can only stretch to 100% of its parent container. If the parent container (.media_iframe_video) doesn't have an explicit width, it defaults to its minimum content size. This issue happens specifically in blocks where the columns are display: flex. As a result, the iframe ends up being too narrow despite having width: 100%. Solution: ========= By adding width: 100% to the container itself, it now fills the grid cell, and the iframe inside fills the container. opw-5104640 Forward-Port-Of: odoo/odoo#229001
Time off warning messages now appear in the right place with consistent spacing. This prevents the India-specific sandwich leave alert from appearing collapsed when creating a new time off request, making important guidance easier to notice.
Original PR description
Issue: The sandwich leave alert for l10n India was incorrectly shown folded when creating a new time off entry for Indian companies. Additionally, the leave_type_increases_duration alert lacked proper top margin, causing inconsistent spacing. Steps to Reproduce: - For the sandwich alert: When shown, it appears folded automatically when creating a new time off entry (only for Indian companies). - For leave_type_increases_duration: When displayed, it lacks top margin. Fixes: - Moved the sandwich leave alert to the header alongside other alerts for consistency. - Adapted margins for all alerts. Task ID: 5071899 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226229
This fix prevents the HTML editor from creating invalid page structure when users change the style of text inside certain inline elements displayed as blocks. It helps preserve the intended content layout and avoids unexpected browser rendering issues.
Original PR description
Before this commit we would insert a block inside of a phrasing content if it's displayed as a block and we change its font style. For example, if we tried to modify text inside of a `<small>` that has `display: block` style, it would insert a new block inside of it. Steps to see the issue: - Have an open editor with `<small>Text</small>` content, that has `display: block` style - Select "Text" and change the font style to paragraph => It will be `<small><p>Text</p></small>` which is not valid HTML, and it will be parsed by a browser as `<small></small><p>Text</p>`, which is not the expected behavior. task-5123274 Forward-Port-Of: odoo/odoo#229043
This fix restores Indian accounting localization updates that were missed during a previous forward-port. It corrects tax naming and chart of accounts data so businesses using the India localization see the intended accounting configuration.
Original PR description
During the following [fw-port](https://github.com/odoo/odoo/pull/229757/) and resolving conflicts few changes such as Renaming of taxes and change of CoA was missed out in this commit we resolve the issue and add the missing changes that were unintentially missout during fw-port --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230787
This fix prevents an error page when someone opens a course embed link that points to a course category instead of an individual lesson. Users are now redirected to the course homepage, keeping the learning experience stable and avoiding a confusing crash.
Original PR description
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the…
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the `Courses` menu. - Then go to `/slides/embed/<int:slide_id>` route. (http://localhost:8069/slides/embed/7) - The error will occur. Traceback: --- `ValueError: 7 is not in list` At [1], `slide_content_ids` contains the IDs of `channel content`. However, we are trying to access a slide from the `channel category` in URL. As a result, at [2], when attempting to find the index of the slide in `slide_content_ids`, an error occurs because the slide ID actually belongs to `slide_category_ids` and is not present in `slide_content_ids`. Solution: --- Added a special case for category slides — if the slide is a category, redirect to the channel homepage. [1]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L120 [2]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L121 sentry-6572999628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225374
This fix makes an automated barcode workflow test wait for the right screen state before validating an operation. It reduces random test failures, helping keep inventory barcode updates more stable and predictable for future releases.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
The Documents app no longer shows an unused tooltip field on document tags, reducing confusion for users managing tag settings. The field remains safely in the system for compatibility but is marked as deprecated until it can be fully removed in a future version.
Original PR description
The 'tooltip' field was introduced on document tags categories, but after couple of refactors it ended up unused on document tag. As we cannot remove fields from the data model in stable, this commit removes tooltip from the view and marks it as deprecated in the code. opw-4567814 ## Stems from https://github.com/odoo/odoo/pull/210147 https://github.com/odoo/enterprise/pull/79496 # Merge plan - hide `tooltip` in stable - remove `tooltip` in master Forward-Port-Of: odoo/enterprise#86504
This fix prevents sales orders and invoices from crashing when they use a contact that has no name. Sale warning messages now handle unnamed partners safely, allowing users to continue creating documents without interruption.
Original PR description
When creating a Sale Order or Invoice for a partner without a name, a traceback occurs. Steps to reproduce the error: - Install ``sale_management`` with demo data - Enable ``Sale Warnings`` from…
When creating a Sale Order or Invoice for a partner without a name, a traceback occurs. Steps to reproduce the error: - Install ``sale_management`` with demo data - Enable ``Sale Warnings`` from settings - Open ``Azure Interior`` Contact > In Contact, Add Contact > Type: invoice > Save & close - Create a sale order with the newly created partner AND - Create an invoice with the newly created partner Traceback: ``TypeError: unsupported operand type(s) for +: 'bool' and 'str'`` https://github.com/odoo/odoo/blob/7a1b27e5985b3b16768bea450c51226ae3659c76/addons/sale/models/sale_order.py#L822 https://github.com/odoo/odoo/blob/7a1b27e5985b3b16768bea450c51226ae3659c76/addons/sale/models/account_move.py#L59 Here, ``partner_id.name`` is ``False``, which leads to string concatenation with a boolean in sale warning messages and results in the above traceback. sentry-6912482256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229529
This fixes an editor issue where pasted plain text could lose an active style, such as bold, when inserted into an empty formatted area. Users can now rely on selected formatting being preserved while writing descriptions or other rich text content.
Original PR description
Problem: When text is inserted inside an empty format, the format is lost. Cause: After https://github.com/odoo/odoo/commit/ae33ca3d38d4a5adaad3015f036321d473713638, any empty format gets removed if content is inserted inside. Solution: Only remove the empty format if a media element is added. This preserves styling when inserting plain text inside an empty format. Steps to reproduce: 1. Copy some text from somewhere. 2. In an empty task description, press CTRL+B. 3. Press CTRL+SHIFT+V. 4. Notice that the text is not bold, even though the format was active. task-5136314 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230051
A problem in the Expenses app could cause an error message to be incorrectly defined, potentially preventing users from seeing the intended guidance. This fix ensures the message is raised properly so users get clearer feedback when an expense action cannot be completed.
Original PR description
in 953fac5, the new error was not given the proper arguments Forward-Port-Of: odoo/odoo#229488
An unstable automated test for the online shop was removed from version 18 releases because it was causing random failures in the validation system. This does not change customer-facing behavior, but it helps make release checks more reliable.
Original PR description
Versions -------- - 18.0 - saas-18.2 - saas-18.3 - saas-18.4 Issue ----- The `test_toggle_contact_us_button_visibility` causes random errors in runbot. Cause ----- Unsure, but with commit 26d22fc975e3f removing jQuery from `VariantMixin`, the random error no longer seems to pop up. Solution -------- Remove the test for versions before 19.0. runbot-145473 Forward-Port-Of: odoo/odoo#230728
Restaurant point-of-sale bill splitting now closes correctly once the last split item has been paid. This prevents staff from being left on a zero-balance split screen, reducing confusion and keeping checkout flow smooth.
Original PR description
When splitting a bill, a specific flow would leave the bill splitting screen open event when everything was paid. Steps to reproduce: ------------------- * In pos restaurant add 2 product to the order * Select Action > Split * Select a product * Click Pay(ment) and validate the payment * Continue * Select the last product * Click Pay(ment) and validate the payment * Continue > Observation: The Bill splitting screen is still open at 0$ Why the fix: ------------ When one or more products are selected a new order is created with those products. If the quantities match, it's the last payement for that bill, we can directly pay. The original order will then be closed. opw-5006042 Forward-Port-Of: odoo/odoo#230536 Forward-Port-Of: odoo/odoo#228991
Demo chat messages from Alex now display Alex as the sender instead of Odoobot. This makes the sample Discuss data clearer and avoids confusion when evaluating or demonstrating chat conversations.
Original PR description
Before this commit, Alex's messages in discuss demo data were displayed as "Odoobot" rather than Alex. This happens because message had proper author_guest_id but no author_id defined, thus it had default value Odoobot and since [1] the author_id has precedence over `author_guest_id`. Before [1] there was no bug because the server returned formatted data of a single author as a persona, and guest_author_id had precedence over author_id. [1]: https://github.com/odoo/odoo/pull/211868 Before <img width="811" height="279" alt="Screenshot 2025-10-10 at 16 18 53" src="https://github.com/user-attachments/assets/862cfd18-24a0-485f-89b6-77277b9098ad" /> After <img width="815" height="280" alt="Screenshot 2025-10-10 at 16 17 45" src="https://github.com/user-attachments/assets/f83b98dd-ffb1-4419-851c-f34f3261792d" />
8 changes
Enhancements to existing features
Tax calculation helpers now handle proportional distribution internally instead of relying on callers to prepare values in advance. This reduces the risk of rounding or sign-related inconsistencies in accounting calculations and makes future maintenance safer.
Original PR description
At the moment, `_distribute_delta_amounts_smoothly` requires the factors to be pre-nomalized. However, normalizing the factors robustly requires more logic than just dividing by the sum of factors, especially if the factors have different signs. This commit moves the normalization into `_distribute_delta_amounts_smoothly` itself meaning the calling code doesn't need to take care of it anymore. task-none
Resolved issues and error corrections
Users visiting an embedded course link that points to a course category instead of a lesson no longer see an error page. The system now redirects them safely to the course homepage, improving reliability for website visitors.
Original PR description
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the…
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the `Courses` menu. - Then go to `/slides/embed/<int:slide_id>` route. (http://localhost:8069/slides/embed/7) - The error will occur. Traceback: --- `ValueError: 7 is not in list` At [1], `slide_content_ids` contains the IDs of `channel content`. However, we are trying to access a slide from the `channel category` in URL. As a result, at [2], when attempting to find the index of the slide in `slide_content_ids`, an error occurs because the slide ID actually belongs to `slide_category_ids` and is not present in `slide_content_ids`. Solution: --- Added a special case for category slides — if the slide is a category, redirect to the channel homepage. [1]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L120 [2]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L121 sentry-6572999628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225374
This fixes a timing issue that could make a stock barcode test fail randomly when validating an operation right after saving changes. The validation step now waits for the right screen state, improving automated test reliability without changing day-to-day user behavior.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
The Documents app no longer shows an unused tooltip field on document tags, reducing confusion for users managing tag settings. The field remains safely in the background for compatibility in this stable version, but is marked as deprecated for future removal.
Original PR description
The 'tooltip' field was introduced on document tags categories, but after couple of refactors it ended up unused on document tag. As we cannot remove fields from the data model in stable, this commit removes tooltip from the view and marks it as deprecated in the code. opw-4567814 ## Stems from https://github.com/odoo/odoo/pull/210147 https://github.com/odoo/enterprise/pull/79496 # Merge plan - hide `tooltip` in stable - remove `tooltip` in master Forward-Port-Of: odoo/enterprise#86504
This fixes an issue where dragging from text inside a table cell could select the whole cell before all of its content was selected. Users now get more accurate table selection behavior when editing content, reducing accidental cell selections.
Original PR description
Current behavior before PR: - Create an m x n table. - Write some text in a cell. - Put cursor at the end of text. - Try to select cell by moving mouse rightwards. Notice that the cell is selected although the cell content is not fully selected. Desired behavior after PR: This PR backports commit [1] to ensure that single cell is selected only if the cell content is fully selected. [1]: https://github.com/odoo/odoo/commit/09d369e118f622f30149f46702f58c656a3cee04 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230133 Forward-Port-Of: odoo/odoo#230071
This fixes an incorrectly configured error message in the Expenses app. Users should now see the intended warning instead of a broken or confusing error when this situation occurs.
Original PR description
in 953fac5, the new error was not given the proper arguments Forward-Port-Of: odoo/odoo#229488
The point of sale scan button now opens the camera even when an order is selected on the ticket screen. This helps staff scan QR codes without needing extra navigation, reducing friction during checkout or order handling.
Original PR description
Before this commit: = - The scan button did not function when an order was selected. After this commit: = - The scan button now opens the camera to scan a QR code even when an order is selected. Task: 4778136 Forward-Port-Of: odoo/odoo#211875
This update removes an automated test that was causing random failures in Odoo's build checks for version 18 releases. It does not change customer-facing website shop behavior, but helps keep validation runs more reliable for maintenance releases.
Original PR description
Versions -------- - 18.0 - saas-18.2 - saas-18.3 - saas-18.4 Issue ----- The `test_toggle_contact_us_button_visibility` causes random errors in runbot. Cause ----- Unsure, but with commit 26d22fc975e3f removing jQuery from `VariantMixin`, the random error no longer seems to pop up. Solution -------- Remove the test for versions before 19.0. runbot-145473 Forward-Port-Of: odoo/odoo#230728
3 changes
Resolved issues and error corrections
This update fixes an automated test failure by ensuring the test user has the required sales quotation template permission. It helps keep quality checks stable without changing day-to-day business functionality.
Original PR description
This particular test case was failing for multiple instances, whenever user do not have `sale_management.group_sale_order_template` group. This fix ensure user has proper group, so the needed field exists in view
traceback
```
test_sale_order_template_change_after_open
so.sale_order_template_id = quotation_templates[1]
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/tests/form.py", line 352, in __setattr__
self[field_name] = value
~~~~^^^^^^^^^^^^
File "/data/build/odoo/odoo/tests/form.py", line 357, in __setitem__
assert field_info is not None, f"{field_name!r} was not found in the view"
^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'sale_order_template_id' was not found in the view
```
runbot error:232942
Forward-Port-Of: odoo/enterprise#96611This fixes a timing issue that could cause a stock barcode test to fail unpredictably when validating an operation after saving a form. The change makes automated validation wait for the right screen state, improving build stability without changing user-facing behavior.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
The Documents app no longer shows an unused tooltip field on document tags. This removes a confusing field from the interface while keeping the underlying data model stable for compatibility.
Original PR description
The 'tooltip' field was introduced on document tags categories, but after couple of refactors it ended up unused on document tag. As we cannot remove fields from the data model in stable, this commit removes tooltip from the view and marks it as deprecated in the code. opw-4567814 ## Stems from https://github.com/odoo/odoo/pull/210147 https://github.com/odoo/enterprise/pull/79496 # Merge plan - hide `tooltip` in stable - remove `tooltip` in master Forward-Port-Of: odoo/enterprise#86504
16 changes
Enhancements to existing features
This update adjusts a website helpdesk template so it continues to work correctly after related link text became translatable. It helps keep the Helpdesk, eLearning, and Forum website integration stable across languages without changing business workflows.
Original PR description
`href` cannot be used anymore as an xpath expression because it is now translatable. See PR https://github.com/odoo/odoo/pull/147698 task-3626918
The bank configuration screen now uses a better background color when dark mode is enabled. This makes the setup card easier to view and provides a more polished experience for users working in dark mode.
Original PR description
This commit will change the background color of the dark mode of the configure bank cart. no task id Forward-Port-Of: odoo/enterprise#96513
The VoIP setup suggestions now include Telnyx as an available provider option. This gives businesses another recommended provider to consider when configuring internet-based calling in Odoo.
Original PR description
Task-5144121
When users open planning from a payslip, it now starts on the month covered by that payslip. This makes it faster and easier for payroll teams to review the relevant schedule without manually navigating to the correct period.
Original PR description
By clicking on the planning smartbutton on a payslip, it will open by default the planning starting on the month of the date_from of the payslip. It was not the case before this commit. task-5116510
This update standardizes the internal naming of yes/no settings across several Point of Sale modules. It improves consistency and maintainability without changing expected business workflows or user-facing behavior.
Original PR description
pos_*: pos_enterprise, pos_iot, pos_blackbox_be, l10n_se_pos, l10n_in_reports_gstr_pos, pos_iot, pos_restaurant_preparation_display In this commit: ---------- - Standardized the naming of boolean fields in the pos.config model for better consistency and readability across the codebase. Related: - Community: https://github.com/odoo/odoo/pull/224423 - Upgrade: https://github.com/odoo/upgrade/pull/8300 task-5008370
This update removes a redundant internal setting used to identify chat window context. It helps keep the messaging code simpler and easier to maintain, with no expected change for users.
Original PR description
This is redundant with this.env.inChatWindow https://github.com/odoo/odoo/pull/231053
Resolved issues and error corrections
Manual bank account creation now assigns the new journal to the same company as the online account link. This prevents errors when users work across multiple companies and the system context points to a different company.
Original PR description
Before this commit, when a user does a manual bank account creation, we didn't pass the company id for the journal creation. It implies that we use the environment value which is problematic because it could be different from the one account online link one leading to an error. The aim of this commit is ensuring that we pass, as company_id the same value as the one we have on account online link. no task id Forward-Port-Of: odoo/enterprise#96715
Payroll calculations now retrieve payslip line values through Odoo's standard data handling instead of forcing a broad system refresh. This reduces unnecessary cache invalidation, helping payroll computations run more reliably and efficiently without changing user workflows.
Original PR description
Before this commit, when a compute needed to fetch the payslip lines values, we need to flush all to be able to correctly get the values thanks to a sql query. The problem is the `flush_all` will invalidate all recordset in cache and will do more than expected. This commit converts the sql query made to fetch the payslip lines values into a read_group to be able to remove the flush_all and let the orm invalidates the recordset/fields needed to correctly get what we want. Forward-Port-Of: odoo/enterprise#96741
This fixes a timing issue that could cause a stock barcode test to fail unpredictably during automated checks. By waiting for the right screen state before validating, the change improves reliability of testing without changing business workflows.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
The rental schedule once again shows product groupings correctly after they were lost when the schedule was made editable. This helps users review rental lines by product more easily and restores expected behavior without changing the broader workflow.
Original PR description
This commit restores the `group_expand` functionality for the product field in the rental schedule, which was inadvertently removed in [^1] when the schedule was made editable. [^1]: https://github.com/odoo/enterprise/pull/88689 Forward-Port-Of: odoo/enterprise#96558
Opening a reconciled statement line now shows only that line expanded, and clearing the filter restores the normal reconciliation view instead of expanding every line or hiding the summary. The statement creation button is also hidden when it is not useful, reducing confusion for accounting users.
Original PR description
When you open a statement line from a reconciled move, it opens the bank reconciliation widget with only the selected statement line, which is unfolded by default. However, there are a few issues with this behavior, which are fixed in this commit: 1 - When entering the bank reconciliation widget, the initial line is unfolded. If you remove the filter, all the other lines become unfolded as well. This should not be the case; only the original line should remain unfolded. 2 - By default, the statement summary line is hidden. When the filter is removed, the summary remains hidden. We now ensure the summary is displayed again when the filter is cleared. 3 - The Statement button on the statement line (which is meant to create a new statement) doesn't make any sense when there is only one line. It is now hidden in this case. task-5108118 Forward-Port-Of: odoo/enterprise#96670 Forward-Port-Of: odoo/enterprise#95558
The AI assistant now considers planned activities from the chatter alongside existing messages when preparing its response context. This helps produce more relevant answers by including upcoming tasks and follow-ups that were previously left out.
Original PR description
Append any planned activities to the chatter messages to be sent as a part of the prompt's context with the rest of the messages. task-id-5079055 Forward-Port-Of: odoo/enterprise#96668 Forward-Port-Of: odoo/enterprise#95764
Changing a quotation template on a sales order now removes the previously linked quote calculator spreadsheet. This prevents sales teams from accidentally using calculations from an old template and keeps the order aligned with the selected template.
Original PR description
Step to reproduce: - Create a new SO - Add a customer and quotation template to the order - Click on quote calculator smart button - Return to sale order (click on SO number in top left) - Change the quotation template - Result: it does not change the quote calculator that is linked to the new quotation template Cause: - Clicking on Quote Calculator creates a copy of the quotation template spreadsheet and links it to the SO. https://github.com/odoo/enterprise/blob/8bc6098335d283e6d210dc788463a8ef8c559b14/spreadsheet_sale_management/models/sale_order.py#L30-L35 - When the quotation template is later changed, the spreadsheet linked to the old template remains attached to the SO. Fix: - On changing the sale_order_template, the old spreadsheet should be unlinked from the SO. - Keeping it linked is inconsistent, as it does not matches the current template opw-4998587 Forward-Port-Of: odoo/enterprise#95861 Forward-Port-Of: odoo/enterprise#93970
This fix prevents an error from appearing when users click the “Offers (new)” button for a Mexican employee without salary cost details filled in. It improves reliability during employee setup by safely handling missing wage or yearly cost information.
Original PR description
steps to reproduce:
--------------------
1. Install l10n_mx_hr_payroll and hr_contract_salary (load with demo data)
2. Switch to the Mexican company and create a new employee
3. Click on Offers(new)
issue:
-------
A traceback occurs:
`TypeError('cannot unpack non-iterable NoneType object')`
cause:
-------
https://github.com/odoo/enterprise/blob/71cc92c9526234dcd44ec756375647a67729029f/l10n_mx_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml#L531
Unpacking fails because **find_rates(gross, isr_table)** returns `None`
when the [gross amount](https://github.com/odoo/enterprise/blob/8b96c67d0555702e88127a77edb6e3b8ef5e58cc/hr_payroll/models/hr_payslip.py#L1157-L1167) is empty. This occurs if wage or yearly costs
are not defined.
solution:
----------
Check that the gross amount is exists before calling `find_rates`
and unpacking its result.
opw-5128275
Forward-Port-Of: odoo/enterprise#96525The referral app now uses the term "job opportunity" instead of "job offer" in related templates, emails, SMS messages, and wizard screens. This keeps recruitment referral wording consistent and clearer for users sharing open roles.
Code cleanup and technical improvements
The accounting dashboard now uses one shared approach for bank synchronization actions such as connecting, reconnecting, refreshing, and extending access. This reduces inconsistencies and makes the bank connection experience easier to maintain and more reliable for users.
Original PR description
Refactor to centralize the different bank synchronization actions on the accounting dashboard (connect, reconnect, refresh, extend) into a single template. This removes redundancy and fixes inconsistencies that appeared because each action was handled separately. Task-5068208
24 changes
Enhancements to existing features
Users can now close the image description box in the HTML editor by pressing the Escape key. This makes editing images smoother and more consistent with common keyboard behavior.
Original PR description
This PR aims to ensure that image description box gets closed when pressing escape key. task-5114224 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Recruiters can now generate more than one salary offer for the same applicant from the applicant view. This makes it easier to revise or resend offers during the hiring process without unnecessary restrictions.
Original PR description
Purpose: Modified the visibility attribute on the Generate Offer button in the applicant view so the it allows the generation of multiple offers for the same applicant Task ID: 5088931
Additional automated tests were added to confirm that appointment booking capacity, unavailability, cart bookings, invoice confirmation, and event creation work as expected. This helps reduce the risk of booking errors across paid appointments and website appointment sales.
Original PR description
\* = website_appoinment_sale, appointment_account_payment Add tests to ensure correct behaviour for the various scenarios. The following tests are added: - Users/resource's capacity computation when manage capacity is on and off. - Unavailability computation of users/resources in the `calendar.event`. - Check the bookings of user/resource in the cart for the availability after the invoice is confirmed. - Creation of the actual event when the booking from the cart is confirmed. Task-4919317 Forward-Port-Of: odoo/enterprise#91676
Resolved issues and error corrections
Accessing a course category through an embedded slide link no longer causes an error page. Users are redirected back to the course homepage instead, keeping the learning experience stable when an invalid or category-only slide link is opened.
Original PR description
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the…
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the `Courses` menu. - Then go to `/slides/embed/<int:slide_id>` route. (http://localhost:8069/slides/embed/7) - The error will occur. Traceback: --- `ValueError: 7 is not in list` At [1], `slide_content_ids` contains the IDs of `channel content`. However, we are trying to access a slide from the `channel category` in URL. As a result, at [2], when attempting to find the index of the slide in `slide_content_ids`, an error occurs because the slide ID actually belongs to `slide_category_ids` and is not present in `slide_content_ids`. Solution: --- Added a special case for category slides — if the slide is a category, redirect to the channel homepage. [1]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L120 [2]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L121 sentry-6572999628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225374
This fixes a recent issue in the Adyen payment integration caused by an incorrect customization hook. It helps ensure payment provider behavior remains reliable for businesses using Adyen to process payments.
Original PR description
Commit [efc2788](https://github.com/odoo/odoo/commit/efc2788) introduced the bug by bad method override.
The time off request summary card now displays hourly leave amounts in a shorter, clearer format. This prevents overly long text and makes the side summary easier for employees and managers to read.
Original PR description
On a time off request, there is a summary on the side. Problem: if we have time off in hours, the display is not adapted and the text is too long. This commit fixes the issue to display the hours correctly. task-5092855 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#230693 Forward-Port-Of: odoo/odoo#227631
This fix prevents a stock barcode test from failing randomly when validation happens before a previous save is fully complete. It makes automated checks more reliable without changing normal user workflows.
Original PR description
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; -…
Sometime, the test `test_scrap_change_source_location` could fail randomly. The issue happens in last few steps of the tour. What we do is: - We edit a move line lot in the form view; - We save it; - We validate the operation. The validation is done by a barcode scan (`OBTVALI`) but since [1](https://github.com/odoo-dev/enterprise/commit/b3a855a870d1861515abaff8683081a39f95558f), barcodes scanned when the user is somewhere else than in the barcode lines view are skipped. With a little bit of bad luck, the tour scans `OBTVALI` while the save from the form view is not finished yet and thus, the scanned barcode is ignored. To reproduce that, run the test `test_scrap_change_source_location` locally in debug mode and add a throttling (eg.: Fast 4G) before to run the tour. To solve the issue, finetune the `validateBarcodeOperation` default trigger, so the error won't happen in this tour and other similar contexts. Runbot build error: [232331](https://runbot.odoo.com/odoo/runbot.build.error/232331) Forward-Port-Of: odoo/enterprise#96542
This fixes an issue in the HTML editor that could trigger a JavaScript error when inserting content. The change helps keep editing actions stable and prevents interruptions for users working with rich text content.
Original PR description
In `dom.insert`, the variable `container` was being redefined to a constant within a `while` loop, making it impossible to use the original variable within the loop. This caused an `Uncaught Javascript Error` ("Cannot access 'container' before initialization") whenever trying to access it within the loop but above the redefinition. This commit renames the constant to a previously unused name.
opw-5053872
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#230085The Documents app no longer shows an unused tooltip setting on document tags. This avoids confusion for users while keeping the underlying data model stable for compatibility.
Original PR description
The 'tooltip' field was introduced on document tags categories, but after couple of refactors it ended up unused on document tag. As we cannot remove fields from the data model in stable, this commit removes tooltip from the view and marks it as deprecated in the code. opw-4567814 ## Stems from https://github.com/odoo/odoo/pull/210147 https://github.com/odoo/enterprise/pull/79496 # Merge plan - hide `tooltip` in stable - remove `tooltip` in master Forward-Port-Of: odoo/enterprise#86504
The EC Sales report now correctly shows the Code filter again. This helps users narrow down sales report data as expected, matching behavior from the previous version.
Original PR description
Before: EC Sales report Code filter was not visible. As custom_display_config options was defined in the generic ec sales list code inside function `_custom_options_initializer` while it should actually be placed inside `_init_core_custom_options`. After: Like 18.4 now EC Sales report Code filter visible task-5109538
This fixes an issue where links selected from the editor could be incorrectly changed when used from non-Website apps, potentially sending users to the website homepage instead of the intended internal page. The change limits that behavior to the Website app, so backend apps like Knowledge keep their internal links working as expected.
Original PR description
Before this commit: we have the function in website to prefix a frontend url with `@` when clicking on the url in linkpopover. However, this function is usually used inside website. It also affects places where the url is an internal redirecting url like `/knowledge/article/33` and prefixing will lead to the website homepage. After this commit: we also check if the current url of the browser is also a frontend url, which means the user is inside the website app. Frontend links will not be prefixed in the backend pages, e.g. in all other apps except for website. The website patch doesn't influence public users as they won't have access to the website app anyways. task-5048403 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224605
Selecting “Remote” as a job location in the website Jobs editor now works without triggering an error. This restores the expected dropdown option and helps recruiters or website editors update job postings reliably.
Original PR description
Steps to reproduce: 1. Go to Website → Jobs. 2. Open any job application. 3. Change the Job Location to the option "Remote". 4. A traceback occurs. Before this commit: When selecting a job location, initially no Many2One field is selected, that's why no many2oneid is find. which results in a null value being returned. This caused a traceback error After this commit: The "Remote" option is explicitly included in the dropdown, restoring the previous behavior. Forward-Port-Of: odoo/odoo#220312
This fixes an issue where a newly added expense error message was not set up correctly. Users should now see the intended error instead of a broken or confusing message when the affected expense validation occurs.
Original PR description
in 953fac5, the new error was not given the proper arguments Forward-Port-Of: odoo/odoo#229488
This fixes an issue where formatting such as bold could disappear when users pasted plain text into an empty formatted area. The editor now keeps the selected style for normal text while still cleaning up empty formatting when media content is inserted.
Original PR description
Problem: When text is inserted inside an empty format, the format is lost. Cause: After https://github.com/odoo/odoo/commit/ae33ca3d38d4a5adaad3015f036321d473713638, any empty format gets removed if content is inserted inside. Solution: Only remove the empty format if a media element is added. This preserves styling when inserting plain text inside an empty format. Steps to reproduce: 1. Copy some text from somewhere. 2. In an empty task description, press CTRL+B. 3. Press CTRL+SHIFT+V. 4. Notice that the text is not bold, even though the format was active. task-5136314 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230051
Sales orders and invoices no longer crash when they are created for a contact that has no name. The warning message handling now works safely in this edge case, helping users continue sales and billing workflows without interruption.
Original PR description
When creating a Sale Order or Invoice for a partner without a name, a traceback occurs. Steps to reproduce the error: - Install ``sale_management`` with demo data - Enable ``Sale Warnings`` from…
When creating a Sale Order or Invoice for a partner without a name, a traceback occurs. Steps to reproduce the error: - Install ``sale_management`` with demo data - Enable ``Sale Warnings`` from settings - Open ``Azure Interior`` Contact > In Contact, Add Contact > Type: invoice > Save & close - Create a sale order with the newly created partner AND - Create an invoice with the newly created partner Traceback: ``TypeError: unsupported operand type(s) for +: 'bool' and 'str'`` https://github.com/odoo/odoo/blob/7a1b27e5985b3b16768bea450c51226ae3659c76/addons/sale/models/sale_order.py#L822 https://github.com/odoo/odoo/blob/7a1b27e5985b3b16768bea450c51226ae3659c76/addons/sale/models/account_move.py#L59 Here, ``partner_id.name`` is ``False``, which leads to string concatenation with a boolean in sale warning messages and results in the above traceback. sentry-6912482256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229529
This fix resolves an issue where the analytic distribution field could fail on payroll salary rules because it expected company information that was not available there. Payroll administrators can now edit analytic allocations on salary rules without encountering that widget error.
Original PR description
Before this commit, the widget analytic_distribution has a field dependency on company_id. But this widget is used for the field analytic_distribution in the model "hr.salary.rule" and this model doesn't have a field "company_id". So to solve this issue, this widget is duplicated (with/without company). task-5155490
When payroll teams split one salary adjustment across multiple employees, each individual record now keeps the selected duration type. This prevents limited-duration adjustments from being incorrectly treated as one-time items, helping payroll records stay accurate.
Original PR description
**Issue** When creating individual attachments from a salary adjustment with multiple employees, the duration_type field was not being copied to the individual records causing all split attachments to default to "One Time" instead of preserving the original duration type. **Steps to reproduce** - Go to Payroll > Employees > Salary Adjustments - Create a new Salary Adjustment for multiple employees - Set Duration to "Limited" and create individual attachments - Open any individual attachment, duration shows "One Time" instead of "Limited" Task ID: 5136664
This fix prevents an error when users open the Offers option for a new Mexican employee without wage or yearly cost information set. The payroll calculation now checks that the gross amount is available before using it, allowing the offer flow to continue instead of crashing.
Original PR description
steps to reproduce:
--------------------
1. Install l10n_mx_hr_payroll and hr_contract_salary (load with demo data)
2. Switch to the Mexican company and create a new employee
3. Click on Offers(new)
issue:
-------
A traceback occurs:
`TypeError('cannot unpack non-iterable NoneType object')`
cause:
-------
https://github.com/odoo/enterprise/blob/71cc92c9526234dcd44ec756375647a67729029f/l10n_mx_hr_payroll/data/salary_rules/hr_salary_rule_regular_pay_data.xml#L531
Unpacking fails because **find_rates(gross, isr_table)** returns `None`
when the [gross amount](https://github.com/odoo/enterprise/blob/8b96c67d0555702e88127a77edb6e3b8ef5e58cc/hr_payroll/models/hr_payslip.py#L1157-L1167) is empty. This occurs if wage or yearly costs
are not defined.
solution:
----------
Check that the gross amount is exists before calling `find_rates`
and unpacking its result.
opw-5128275This change adjusts a rental sales order used in testing so it is no longer treated as fully unpaid or empty and filtered out of the POS orders menu. It helps keep the POS rental flow reliable after recent order filtering changes, with no expected impact on normal business operations.
Original PR description
Because of https://github.com/odoo/odoo/pull/230809, it will cause the quotations/orders menu to filter out any sale orders which have an unpaid amount of 0. The test_rental_pos test tries to create a sale order with a quantity of 0 and then settle it in the POS, but because of the filter, the sale order will not show up in the menu causing the test to fail. This PR is to increase the quantity in the sale order to 1 so that the order shows up and the test can be executed properly. Task-5138081
Videos added inside website masonry text blocks now expand to the full width of their available area. This prevents embedded videos from appearing unexpectedly small and improves the visual consistency of edited website pages.
Original PR description
To reproduce: ============= 1- In Website edit mode, drop the "Masonry" snippet. 2- Add a video in one of the text blocks. -> It will appear smaller than expected, with no way to make it larger Why: ==== The child iframe already had width: 100%, but it can only stretch to 100% of its parent container. If the parent container (.media_iframe_video) doesn't have an explicit width, it defaults to its minimum content size. This issue happens specifically in blocks where the columns are display: flex. As a result, the iframe ends up being too narrow despite having width: 100%. Solution: ========= By adding width: 100% to the container itself, it now fills the grid cell, and the iframe inside fills the container. opw-5104640 Forward-Port-Of: odoo/odoo#229001
This fix keeps animated text highlights from making website pages scroll sideways on mobile screens. It improves the editing and viewing experience by ensuring highlighted text stays within the page width.
Original PR description
Steps to reproduce: ==================== 1. Open Website Builder and switch to mobile screen 2. Select any word of a text 3. Apply highlight and animation Bug: - Page becomes scrollable to the right Cause: ======= SVG elements default to a `300px` `width`, which can overflow on smaller screens (e.g. mobile). This commit sets a `width` to prevent horizontal overflow. This is the link for the same issue but for vertical overflow. https://github.com/odoo/odoo/pull/215826 Reference: https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Attribute/width opw-5120678 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230299
The website test for switching between websites now uses a standard helper instead of custom steps. This makes automated checks more stable and reduces false failures in the testing pipeline, with no expected change for end users.
Original PR description
`snippet_translation_switching_website` was previously using custom steps to switch the website. Though it worked, it was not very deterministic and broke the tour in a few runbot builds. This commit updates the `snippet_translation_switching_website` tour to use the `testSwitchWebsite` helper function instead of custom steps, providing a more reliable and deterministic way to switch websites. runbot-[229696](https://runbot.odoo.com/odoo/error/229696) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230547
Code cleanup and technical improvements
The IoT driver code now treats each device identifier as a stable value rather than recalculating or passing it around in multiple places. This internal cleanup reduces inconsistency risk and helps keep IoT device communication and setup more reliable without changing user-facing behavior.
Original PR description
As the IoT identifier is a serial number or a motherboard uuid, it is not meant to change. It then makes more sense for it to be a constant as `IS_WINDOWS` or `IS_LINUX` are. Enterprise PR: odoo/enterprise#96549 Task: 5149362
The Belgian POS blackbox integration now uses a shared identifier value for IoT Box detection instead of recalculating it through an internal method. This is an internal cleanup that improves consistency and maintainability without changing the user experience.
Original PR description
We now use a constant instead of a call to a cached method to get the identifier of the IoT Box. We updated the driver to use this constant. Community PR: odoo/odoo#230346 Task: 5149362
20 changes
Enhancements to existing features
This pull request improves Odoo's Hoot unit testing tools by fixing event simulation, error reporting, and documentation issues. It also simplifies how test helpers are imported, reducing confusion for developers while keeping changes limited to the test ecosystem and minimizing product risk.
Original PR description
## Pull Request HOOT 37 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Enterprise: https://github.com/odoo/enterprise/pull/96647 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
The course website now handles cases where someone opens an embed link for a course category instead of an individual lesson. Instead of showing an error page, visitors are redirected back to the course homepage, improving reliability and user experience.
Original PR description
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the…
When users try to access a `slide ID` that is not included in `channel_slides_ids`, a traceback occurs. Steps to reproduce: --- - Install `website_slides` module - Go to the Website and click on the `Courses` menu. - Then go to `/slides/embed/<int:slide_id>` route. (http://localhost:8069/slides/embed/7) - The error will occur. Traceback: --- `ValueError: 7 is not in list` At [1], `slide_content_ids` contains the IDs of `channel content`. However, we are trying to access a slide from the `channel category` in URL. As a result, at [2], when attempting to find the index of the slide in `slide_content_ids`, an error occurs because the slide ID actually belongs to `slide_category_ids` and is not present in `slide_content_ids`. Solution: --- Added a special case for category slides — if the slide is a category, redirect to the channel homepage. [1]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L120 [2]- https://github.com/odoo/odoo/blob/482bb19e103de9ddbe1b1942b94b33d3da38889b/addons/website_slides/controllers/main.py#L121 sentry-6572999628 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Dutch localization now uses the correct default accounts for deferred revenue and expenses. This helps Dutch companies record deferred items in the right accounting categories, improving accuracy in financial setup and reporting.
Original PR description
The default deferred accounts in the Dutch localization were incorrect. This commit sets the proper accounts and adjusts the `account_type` of the default deferred expense account from "Prepayments" to "Current Assets". task-5152529 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#230499
The HR setup data no longer recreates the default admin employee record during updates. This prevents customer-configured employee administration workflows from being disrupted by an unnecessary default record returning.
Original PR description
The `employee_admin` is a default admin option. Later when clients set up their work flow they set up their own admin employee. This record is not present, and it doesn't make sense recreate it with every update. 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#230250 Forward-Port-Of: odoo/odoo#228117
Invoices can no longer use SEPA direct debit mandates that have already been closed. This helps avoid invalid payment selections and ensures only currently active mandates are available for customer payments.
Original PR description
**The issue:** It's currently possible to create select SEPA payment for an invoice when the mandate is "closed" instead of "revoked". **Cause:** The search for usable mandates, is not taking into consideration the "closed" state and looking for non draft/revoked. **Fix:** Changed the query to look specifically for "active" mandate. opw-5048748 Forward-Port-Of: odoo/enterprise#96381
Printing Kanban views with many records now handles page breaks more reliably. This prevents cards from being cut off at the top of later printed pages, making printed reports easier to read and use.
Original PR description
This commit fixes the kanban view print to better handle the page break. The issue was caused by the flex layout: when printing, heights often misbehave on the last row or at page breaks. task-4630646 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
An unstable automated test for the website shop was removed from Odoo 18 versions because it was causing random failures in the validation system. This helps keep release checks reliable without changing customer-facing website shop behavior.
Original PR description
Versions -------- - 18.0 - saas-18.2 - saas-18.3 - saas-18.4 Issue ----- The `test_toggle_contact_us_button_visibility` causes random errors in runbot. Cause ----- Unsure, but with commit 26d22fc975e3f removing jQuery from `VariantMixin`, the random error no longer seems to pop up. Solution -------- Remove the test for versions before 19.0. runbot-145473
An unused section in the Swiss payroll ELM employee screen is now hidden. This keeps the interface cleaner and reduces confusion for payroll users without changing payroll processing behavior.
Fixes an issue in the HTML editor where power buttons could disappear after a user undid typed content. This keeps editing controls visible and reduces confusion while using undo in the editor.
Original PR description
Steps to Reproduce: 1. Insert some text into the editor (e.g., type "a"). 2. Press `Ctrl + Z` to undo the insertion. 3. Observe that the power buttons are not visible. Description of the issue/feature this PR addresses: Power buttons were not visible after pressing Ctrl+Z (undo). Desired behavior after PR is merged: Trigger `updatePowerButtons` when the `CONTENT_UPDATED` command is dispatched, ensuring that the power buttons are updated and made visible. task-4309762
This fix prevents an error when shoppers click to zoom a product page image where only one image is available. It keeps the product browsing experience smooth and avoids a disruptive client-side crash in the online store.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Enable zoom-on-click on product page; 2. have a product page with only a single image; 3. click on the image. Issue ----- > Odoo Client Error > Caused by: TypeError: can't access property "addEventListener", carousel is null Cause ----- Commit 83b79c198eac added event listeners to make the carousel interactive. Issue is that the carousel element doesn't exist in the DOM if there's no extra media. Solution -------- Check if the carousel element exists before adding event listeners. opw-4937009
Datetime fields now correctly hide the time portion when the option to show time is turned off. This prevents users from seeing unnecessary time information in date-related forms and keeps the display aligned with configuration choices.
Original PR description
### Before this PR show_time didn't affect the datetime field. With this PR, the time is correctly hidden if show_time is false ### After this PR show_time will hide the time in datetime field --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The manufacturing order overview now shows the same bill of materials cost as the bill of materials overview. This prevents mismatched cost figures and helps teams rely on consistent manufacturing cost information.
Original PR description
The BOM cost in the MO overview should be the same as the BOM cost in the BOM overview. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates test data so products are treated as properly configured instead of missing key setup details. It prevents false test failures caused by recent lead time handling changes, helping keep manufacturing planning and rental workflows reliable.
Original PR description
This PR addresses the issue where tests were failing due to unconfigured products (no vendor/ no BoM). Now unconfigured products' lead_time is incremented by 365 due to this PR: https://github.com/odoo/odoo/pull/216293 Before this fix: Products have `buy` route by default and no vendor, so they are considered unconfigured products and lead time is incremented by 365, and tests fail as any lead time refers to a date earlier than today would only affect the first period in the MPS which is not intended in the tests. After this fix: Products have `manufacture` route and there is BoM, so they are considered configured products and lead time is calculated normally from BoM which is 0. Task-4779057
The India localization test setup was adjusted so it no longer needs the US accounting module when demo data is absent. This improves reliability of internal testing and helps prevent avoidable errors during validation, without changing business features for users.
Original PR description
Standalone `l10n_in` tests were failing when running without demo data because outside-India companies (e.g., US) were defaulting to their country-based chart of accounts. This required the `l10n_us_account` module, causing errors when the module was not installed. <img width="518" height="28" alt="image" src="https://github.com/user-attachments/assets/748663a0-f329-459c-b0e8-0c3de7019258" /> This commit adapts the test cases to run without l10n_us_account dependency. task- 5116352
This update adjusts an internal workaround used by Odoo's Gantt app automated tests after recent testing infrastructure changes. It helps keep the test suite running consistently without changing customer-facing Gantt functionality.
Original PR description
## Pull Request HOOT 37 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Community: https://github.com/odoo/odoo/pull/230556
SEPA payments will now be marked as high priority only for Belgian companies. This helps avoid unnecessary bank fees in other countries, such as Switzerland, while preserving the expected handling for Belgium.
Original PR description
Having priority set as HIGH for SEPA payments can induce extra fees (ex. in CH). This commit only sets the priority to HIGH for BE companies. task-4874217 Forward-Port-Of: odoo/enterprise#95420
Maintenance equipment pages now open reliably even if customized workflows leave repair date fields empty. The system handles these unusual missing dates gracefully, preventing an error that could block users from viewing equipment records.
Original PR description
Using standard Odoo, `maintenance.request.close_date` should never be `False` when its `stage_id == 'done'`, but customizations/manual overrides allow users to force it to be `False` and block them…
Using standard Odoo, `maintenance.request.close_date` should never be `False` when its `stage_id == 'done'`, but customizations/manual overrides allow users to force it to be `False` and block them from opening equipment views that displayed fields that depended on it. Steps to reproduce: - Create new maintenance request for an equipment - Put maintenance request into a `maintenance.stage` where `done=True` (e.g. "Repaired") - Force `close_date` to not be `readonly` in form view + set it to `False` - Try to open the assigned equipment's form view Expected result: Form view opens without issue Actual result: `unsupported operand type(s) for -: 'bool' and 'datetime.date'` Issue was due to `mttr` calculation in `_compute_maintenance_request` not expecting `close_date` to be `False`. Since we want the request to still be considered for the rest of the compute, we count its "Time to Repair" as 0 in this case since we cannot use infinity in this case. Additionally, we also gracefully fail in the same way in case `request_date` is also forced to be `False` since it is not a mandatory field and can cause the same issue. 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#230821
This update adds safeguards so Danish Nemhandel connections in copied or test databases do not send or register data on production services. Existing proxy clients are switched to demo mode, while new connections use the test server.
Original PR description
To avoid sending/registering on production, add a neutralize script. The existing proxy client are put in demo mode. The new connections will be registered on the test server. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Discuss call interface now hides participant volume controls when the user is not actually in the call. This avoids confusing controls being shown to people who cannot use them, making the call experience clearer.
Original PR description
Before this PR, the volume slider for call participants was visible even when the user was not part of the call. This PR fixes the behavior by ensuring the volume slider is only available when the user is in the call. task-[5092826](https://www.odoo.com/odoo/project/1519/tasks/5092826) Forward-Port-Of: odoo/odoo#227803
Documentation and clarification updates
This update adds Tomasz Walter to Camptocamp's corporate contributor license agreement records. It confirms the contributor is covered for legal contribution purposes, with no effect on product functionality or users.
Original PR description
Please add me as a member of the Camptocamp organization. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
9 changes
Enhancements to existing features
Peruvian customer records no longer require a ZIP code. This makes customer data entry easier and better reflects local addressing practices, where ZIP codes are not commonly used.
Original PR description
As ZIP codes are not widely used in Peru, the requirement for a ZIP code to be provided for a Peruvian customer should not be present. task-5012593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This fixes an error that could prevent users from opening equipment records when a completed maintenance request had missing repair dates due to customization or manual override. The system now handles those unusual missing values gracefully and keeps the equipment view accessible.
Original PR description
Using standard Odoo, `maintenance.request.close_date` should never be `False` when its `stage_id == 'done'`, but customizations/manual overrides allow users to force it to be `False` and block them…
Using standard Odoo, `maintenance.request.close_date` should never be `False` when its `stage_id == 'done'`, but customizations/manual overrides allow users to force it to be `False` and block them from opening equipment views that displayed fields that depended on it. Steps to reproduce: - Create new maintenance request for an equipment - Put maintenance request into a `maintenance.stage` where `done=True` (e.g. "Repaired") - Force `close_date` to not be `readonly` in form view + set it to `False` - Try to open the assigned equipment's form view Expected result: Form view opens without issue Actual result: `unsupported operand type(s) for -: 'bool' and 'datetime.date'` Issue was due to `mttr` calculation in `_compute_maintenance_request` not expecting `close_date` to be `False`. Since we want the request to still be considered for the rest of the compute, we count its "Time to Repair" as 0 in this case since we cannot use infinity in this case. Additionally, we also gracefully fail in the same way in case `request_date` is also forced to be `False` since it is not a mandatory field and can cause the same issue. 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 fixes an issue in the website/editor tools where text converted into a button-style link did not visually keep the selected font size. Users can now format larger or smaller text as a button and see the expected size, improving consistency when editing content.
Original PR description
### Steps to reproduce: - Go to To-Do. - Type some text and increase its font size to 80. - Select the text and convert it into a button. - The font size appears as 80 in the toolbar but is not visually reflected. ### Description of the issue/feature this PR addresses: - Links with `.btn` class inside elements styled with font-size classes (e.g., display-3-fs) did not inherit the parent's font size. - The `.btn` class's own font-size definition overrode the expected styling. ### Desired behavior after PR is merged: - `.btn` links now use `font-size: inherit`, allowing them to respect and adopt their parent element’s font size. task-4731416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Mexican DIOT reports now correctly identify United Kingdom suppliers using the proper country code. This prevents UK-related records from being grouped under “Other country,” improving accuracy in tax reporting.
Original PR description
The DIOT country adaptation map lacked the ISO 3-letter code for the UK, causing records with country 'GB' to be reported as 'ZZZ' ("Other country").
Added mapping 'GB' → 'GBR' to ensure correct DIOT country code generation.
Administrators can now retry or cancel SMS messages sent automatically by the system without being blocked by an access error. This ensures technical support and operations teams can resolve failed or unwanted SMS notifications from debug settings when they have the proper permissions.
Original PR description
## Issue: In debug mode, the administrator could not resend or cancel an SMS that was sent by the system (e.g. delivery confirmation) using the `Retry` / `Cancel` button in the Technical Settings An…
## Issue: In debug mode, the administrator could not resend or cancel an SMS that was sent by the system (e.g. delivery confirmation) using the `Retry` / `Cancel` button in the Technical Settings An Access Error was raised ## Cause: When using the `Retry` or `Cancel` button, the method `_update_sms_notifications()` is called and finds `mail.notifications` records to update However, `notifications.write()` triggers an Access Error because only the recipient of a `mail.notification` is allowed to modify it: https://github.com/odoo/odoo/blob/98610ea2a1369b84b10adb8913c5d7725a0fad67/addons/mail/security/mail_security.xml#L184-L192 This happens even when the user has the rights to resend or cancel the SMS ## Steps to reproduce: - Install an app like stock_sms to create blocking entries - Create and confirm a Delivery - Choose Send SMS - Enable developer mode - Search for the technical settings SMS - Retry sending the automatically sent SMS https://github.com/odoo/odoo/pull/230733 opw-4904157
This fixes an unreliable automated test in the mail app related to channel subscriptions. The change helps prevent false runbot failures, keeping validation of future changes more dependable without affecting end users.
Original PR description
Before this commit, the test was checking the channels that were subscribed to in the websocket by filtering on their name. This could cause a condition with the debounce of the update_channel in the websocket. Indeed, if waiting too much time (300 ms at the present) between the presences subscription and the channel subscription, the first one would yield an empty array of subscription since not a discuss channel subscription. This commit fixes the issue by just taking the subscription into account if any channel is in the list, otherwise we simply avoid the step in the test. fixes-runbot-161477 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a small issue that could prevent users from creating a new analytic distribution model when an expected text value was missing. The change adds a safeguard so the process continues normally without affecting other behavior.
Original PR description
Current behavior before PR: When trying to create a new analytic distribution model might fail because string might not be defined and substr() could fail. <img width="1139" height="435" alt="odoo" src="https://github.com/user-attachments/assets/2be5a35c-600e-4484-af72-91f778681bcf" /> Desired behavior after PR is merged: We could check if there is string before de substr method. That would solve the problem and will not affect anywhere else. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Building a website with only the Events option selected will no longer automatically install ecommerce features. This keeps the website setup aligned with the user's chosen purpose and avoids adding unnecessary sales functionality.
Original PR description
Steps to reproduce: 1. Install website module 2. Select events in configurator 3. Build website. => Ecommerce is installed, which should not as it does not make sense with only the events. After this commit: - Ecommerce will no longer be installed when the events is configured. task-4922600
Employee contracts in Swiss payroll now only allow selecting insurance records that belong to the relevant company. This prevents accidental cross-company selections and improves data accuracy in multi-company setups.
Original PR description
Currently, in a multi-company setup, you are able to select insurances from other companies on the employee contract task-5157106