Daily updates from Odoo
Wednesday, November 19, 2025
67 changes
7 changes
Resolved issues and error corrections
This change fixes a problem where attaching a file could fail after users interacted with elements inside modern, embedded UI components. It makes file uploads work reliably in those cases, reducing frustrating errors for testers and users.
Original PR description
Before this commit, using 'setInputFile' after interacting with an element contained in any shadow root would not work ("no input has been interacted with" error).
This commit allows the listeners responsible for detecting clicks/focus on file inputs to handle the shadow root cases properly.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#235961This change restores the expected behavior of the VoIP keypad backspace key when highlighted text starts at the beginning of the field. It prevents a regression where deleting selected characters could stop working, while still keeping the input safe when the cursor is in sensitive positions.
Original PR description
This commit fixes a regression introduced in commit [1] prevented deleting when a selection began at index 0; extend the guard so the numpad (keypad) backspace still removes the highlighted characters while keeping the cursor-safety logic. [1]: https://github.com/odoo/enterprise/commit/73b01fa5e1f56d4ab71d67760b15942fb2fa0e31 task-5217676 Forward-Port-Of: odoo/enterprise#99655 Forward-Port-Of: odoo/enterprise#99358
The import panel now recognizes CSV files whether their extension is written as .csv or .CSV. This avoids confusing differences in the import screen and makes file uploads behave more consistently for users.
Original PR description
Before this fix, the import side panel displayed the formatting options only when the uploaded file had a lowercase .csv extension. Files with an uppercase .CSV extension could still be imported but did not show the format selection section, leading to inconsistent behavior. This commit updates the condition to perform a case-insensitive comparison on the file extension. Task-5145031 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236020 Forward-Port-Of: odoo/odoo#235061
This update prevents a payroll calculation from failing when an employee’s contract start date is not set. It adds a safeguard so the system can continue processing instead of crashing on incomplete employee data.
Original PR description
The test_version_cron_update_no_fields from hr/tests/test_hr_employee.py didn't pass on runbot saas-18.4 due to the absence of a start date of contract leading to an error when trying to substract False to a datetime object. I added a verification in the concerned compute function in order to ensure the employee has a contract_date_start. If it's not the case, I set it to 0 as the compute method needs to compute the target field. Runbot error: 233590
Email-style messages in the chatter could show the read more/less control without its icon, making the button less clear for users. This update ensures the needed icon styling is available inside those messages so the control displays correctly.
Original PR description
Before this commit, when a message is of type "email" and contains parts are in foldable with more/less (like `<quote>`), the icon of the button for fold/unfold is missing. This happens because the icon is `.oi` and requires `odoo_ui_icons`. Message of type "email" have their content inside a shadow DOM, because we want to preserve the style of email inside the web client, at least in white theme. Shadow-DOM prevents the parent document to pass `odoo_ui_icons` thus the Shadow-DOM could not apply expected style on `.oi` icons. This commit fixes the issue by passing the required CSS as stylesheet to the shadow DOM, so that `.oi` icons are working inside the shadow DOM of message content of type "email". Forward-Port-Of: odoo/odoo#228741
This fix corrects the activity counters shown in the top bar for Tasks, To-Dos, and Mailings. Previously, if several activities were linked to the same record, they were all counted separately; now each record is counted once based on its most urgent activity, matching the expected behavior.
Original PR description
Issue: When multiple activities were created on a single record (e.g., a Task, To-Do, or Mass Mailing), the systray counters for late/today/future activities would incorrectly count *all* of them. The standard behavior is to count only one (the most urgent) per record. Cause: Modules that split activity groups: `project` (for Tasks/To-Dos) and `mass_mailing` (for Email/SMS), used custom counting logic. This logic was outdated and did not follow the "one count per record" rule. Solution: Refactor the custom activity-grouping logic to make the count conform to the general rule again. This aligns all systray counters, ensuring Tasks, To-Dos, and Mailings are now correctly counted only once, based on their most urgent activity. Task-5059640 Forward-Port-Of: odoo/odoo#226940
Contract templates now show only records that have assigned activities when users open the Activities view. This prevents the list from displaying all templates by mistake and makes it easier to find items that need attention.
Original PR description
The contract template’s activity view incorrectly displays all contracts, instead of only those with assigned activities. **Steps to reproduce this issue:** 1) Install the hr module. 2) Open Employees → Employees → Contract Templates. 3) Create multiple contract templates and add an activity to one of them. 4) Open the activities from the Activities (top right corner). **Issue:** You will end up in the all contract templates list, with no filters applied. **Cause:** When the user clicks on the activities, a default search filter is added in the context, which is then applied to the view. But in the contract template, we don't have any search filters for the activities. Therefore, it renders all contract records. **Solution:** Add the activity search filters for the contract template records. opw-5209691
4 changes
Resolved issues and error corrections
When a product was edited and saved in Point of Sale, its reference could briefly appear before the product name. This fix keeps the display consistent so staff see the expected product name instead of the reference code.
Original PR description
In PoS, when editing and saving a product’s information, there was a bug where the product reference was shown before its name. Steps to reproduce: ------------------- * Add a reference to a product available in PoS * Open PoS * Click on the 'i' on the top right of that product * Click on Edit * Click on Save (no need to do any modification) > Observation: The reference appears before the name. Refreshing the page removes, as it triggers a new read. Why the fix: ------------ Reference are never shown in pos thank to this context key `display_default_code: false` opw-5001355 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233812 Forward-Port-Of: odoo/odoo#222640
The import screen now correctly shows formatting options for CSV files even when the file name ends with .CSV in uppercase. This makes the import experience more consistent and avoids confusion for users importing data from different sources.
Original PR description
Before this fix, the import side panel displayed the formatting options only when the uploaded file had a lowercase .csv extension. Files with an uppercase .CSV extension could still be imported but did not show the format selection section, leading to inconsistent behavior. This commit updates the condition to perform a case-insensitive comparison on the file extension. Task-5145031 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236020 Forward-Port-Of: odoo/odoo#235061
This change makes event markers easier to see when an event is displayed with a hatched style, such as unpublished items. It also moves the styling to the correct place so the display stays consistent even when the calendar app is not installed, which helps modules like Planning show the right appearance.
Original PR description
When pills are hatched (unpublished event) in the calendar view (eg. planning) the `o_event_dot` is barely visible. Additionally the styling to display the dot as outlined on hatched event is wrongly scoped in `/calendar` with the calendar status styling. It should be in the view instead. Otherwise, for the planning module which doesn't depend on calendar, the styling is not applied if calendar is not installed, rendering the filled dot. task-3916768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235978 Forward-Port-Of: odoo/odoo#235286
This update corrects an automated test so it matches how users actually change a product in the interface. As a result, the test now properly detects invalid event-related product settings and prevents false passes in simpler installations.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a minimal database with `event_product` installed; 2. run `:TestEventProduct.test_ensure_event_service_tracking`. Issue ----- > FAIL:…
Versions -------- - 18.0+ Steps ----- 1. Have a minimal database with `event_product` installed; 2. run `:TestEventProduct.test_ensure_event_service_tracking`. Issue ----- > FAIL: TestEventProduct.test_ensure_event_service_tracking > AssertionError: ValidationError not raised Cause ----- The test works as expected with `sale_project` installed due to a `write` override of `product.product`, setting the `service_tracking` to 'no' if `type` is no longer 'service': https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/sale_project/models/product_product.py#L25-L30 This change still occurs without `sale_project` installed, but via the `_compute_service_tracking` method defined in `product`: https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/product/models/product_template.py#L181-L183 As this value is set via a compute method instead of `write`, the `_check_event_ticket_service_tracking` method isn't triggered, and no error is raised. Solution -------- Simulate a front-end flow by changing the `type` to 'consu' on a product form. This way, the constraint method does get triggered as expected. runbot-234024 Forward-Port-Of: odoo/odoo#236045
20 changes
Resolved issues and error corrections
When the Belgian POS cannot reach the Blackbox due to a timeout, it now shows a more accurate error instead of saying the fiscal module is missing. This helps cashiers and support teams understand the real issue faster and avoid unnecessary troubleshooting.
Original PR description
Before this commit, in the case when there is a timeout communicating with the Blackbox in the POS, an incorrect error message was shown stating that "The IoT Box is connected but the Fiscal Data Module isn't". This message should only be shown when we receive a reply from the IoT box, but it tells us it cannot find the Blackbox. <img width="695" height="240" alt="image" src="https://github.com/user-attachments/assets/ec011f4a-42dd-4ffd-8741-350032897471" /> Forward-Port-Of: odoo/enterprise#99652
German companies with a dot in their name can now export DATEV reports without encountering an error. This prevents export failures in the General Ledger and keeps accounting reporting workflows running smoothly.
Original PR description
Currently companies with a dot ('.') in the name cannot export the DATEV report due to a traceback.
Steps to reproduce:
- Select a German (DE) Company having a dot in the name.
- Open Accounting / Reporting / Ledgers / General Ledger
- Click cog > Datev DATA (zip)
Issue:
A Traceback will occur
`Error "ValueError: too many values to unpack (expected 2)"`
This occurs because the system separate the filename from the extension without halting to the first `.`, leading to the error.
opw-5232073
Forward-Port-Of: odoo/enterprise#99578Spreadsheet sharing now avoids showing a warning that cannot lead to any action when edit access is blocked for external users. This makes the sharing dialog less confusing by presenting only the relevant message.
Original PR description
Bug === 1. Create a spreadsheet 2. Add a partner as viewer 3. Set access vial link to edit => 2 warning are displayed (that the right will be extended, and that we can not share spreadsheet in edit mode to non-internal users). The first warning make no sens, because we can not save the modal. Task-5169034 Forward-Port-Of: odoo/enterprise#97857
This update prevents an intermittent failure in an automated manufacturing work order test by avoiding a timing issue in the component selection dialog. It also ensures the intended product appears first, making the test more stable without changing business workflows.
Original PR description
The search in the "Add Component" dialog caused a re-render race, making the tour ``test_add_component_from_shop_foor_in_multi_step_manufacturing`` fail intermittently. This fix removes the search steps and marks the “Courage” product as favorite so it appears first in the catalog. runbot-227694 Forward-Port-Of: odoo/enterprise#92403
VoIP now avoids starting a new connection registration when a user naturally leaves or closes the page. This prevents conflicting requests that could trigger errors during page unload, improving call service stability without changing user workflows.
Original PR description
On page unload, two conflicting things happen: - A REGISTER request with expires=0 is sent to invalidate the registration - The WebSocket disconnects, triggering the reconnection mechanism that attempts to reissue a registration These two concurrent and conflicting REGISTER requests result in the following error: > RequestPendingError: REGISTER request already in progress, waiting for final response This commit prevents the reconnection mechanism from occurring in the event of a "natural" disconnection, such as one triggered by a page unload. This way, the two conflicting REGISTER requests aren't sent on page unload. [Task-5261940](https://www.odoo.com/odoo/project/5778/tasks/5261940) Forward-Port-Of: odoo/enterprise#99560 Forward-Port-Of: odoo/enterprise#99376
The report editor now keeps the user's cursor and selection in the right place after inserting an X2Many table in a new report. This prevents editing disruptions and lets users continue typing immediately after adding the table.
Original PR description
On a new report, add a X2Many table in a new Report. In many cases there will be some issues with the selection as, when inserting the Element via the command of the report Editor we explicitly focus the editable of the html_editor. We need the document inside the iframe to get the focus, because our flow implied to click on some popover bound to the main window. But focusing the editable element changed the selection. So, instead, we focus the iframe's inner window, and the selection stays at the right place, and the user can immediately interact with it (by continuing typing after the insertion) task-5159482 Forward-Port-Of: odoo/enterprise#99430 Forward-Port-Of: odoo/enterprise#97642
This change fixes a payroll configuration issue that caused automated build tests to fail for some country-specific payroll setups. The overtime attendance setting is now handled only by the module that provides it, improving reliability without changing day-to-day payroll workflows.
Original PR description
The issue occurs because the _get_whitelist_fields_from_template() method includes the overtime_from_attendance field, introduced in this https://github.com/odoo/enterprise/pull/92093. This field comes from the hr_work_entry_attendance module, which is not listed as a dependency in all payroll localisations. As a result, the field cannot be found during test execution. Solution: Remove the overtime_from_attendance field from all _get_whitelist_fields_from_template overrides in the localisation modules, and instead include this field by overriding the function in the hr_work_entry_attendance module. build error-243483 task-5169211 Forward-Port-Of: odoo/enterprise#97201
The French reporting EDI export form now shows formatted status and error messages instead of raw HTML text. This makes report results easier to read and helps users quickly identify errors highlighted in the interface.
Original PR description
Currently, the message field in the EDI export form displays raw HTML tags instead of properly formatted content, making it difficult for users to read the report status and error details. We now ensure that HTML is rendered. This allows the structured list of statuses and error details (with proper formatting and red color for errors) to display correctly in the UI Note: Wrap the computed message with Markup() during concatenation in _compute_message() to prevent the HTML from being escaped when combined with translated strings. Task-5113752
This update fixes an internal link from payslips so it opens the related employee record in the proper form view. Payroll users can navigate more reliably without being sent to the wrong screen or view.
Original PR description
The contract template form view is now written on the formview_action directly. This is a backport of https://github.com/odoo/enterprise/pull/97463 task-5082709 Forward-Port-Of: odoo/enterprise#99486
Vendor batch payments now use the correct outgoing payment numbering sequence instead of accidentally using the incoming payment sequence. This prevents confusing or incorrect batch names when validating supplier payment batches.
Original PR description
Currently when creating a vendor batch payment, the system may incorrectly use the inbound batch payment sequence to generate the batch name Steps to reproduce: - Create a Vendor payment. - Create a Vendor batch payment, add the payment, validate it. Issue: Name has been set using the incoming batch payment sequence This occurs because `batch_type` is set to readonly when a payment is added to the list. As result, the current batch type is never sent to the backend that will use the default 'inbound'. opw-5128426 Forward-Port-Of: odoo/enterprise#99570
Restaurant floor plans now receive website table booking notifications only when the booking uses the appointment type configured for that POS. If table booking is disabled or no appointment type is selected, irrelevant notifications are avoided, reducing confusion for staff.
Original PR description
Task: [#5005216](https://www.odoo.com/odoo/my-tasks/5005216) Enterprise v17.0: [#93714](https://github.com/odoo/enterprise/pull/93714) --- **Before:** If no appointment type is specified in the POS config and a table is booked via the website, the floor plan is notified of a new booking because the resource used is one of the POS config resources. However, if the page is refreshed, the booking disappears since no appointment type is defined in the POS config **After:** The floor plan is notified of a new booking only if the appointment type of the booking matches the one specified in the POS config. If no appointment type is set in the POS config, no booking notifications are sent. Additionally, when the "Table Booking" field is unchecked in the POS config, the appointment type is automatically unset. Forward-Port-Of: odoo/enterprise#98887 Forward-Port-Of: odoo/enterprise#93636
OSS sales returns will no longer be created when their eligibility conditions are not met. OSS import returns now use similar eligibility checks, reducing unnecessary reports and helping users avoid incorrect compliance paperwork.
Original PR description
The OSS Sales returns was generated even when its condition wasn't met since auto_generate was still at True. The OSS Imports didn't have any condition and has one which is similar to the OSS Sales. Forward-Port-Of: odoo/enterprise#99700
Draft payslips can now have their period date removed without causing an exception. This prevents interruptions for payroll users while editing payslips and adds test coverage to help keep the flow reliable.
Original PR description
When removing the date in a draft payslip an exception was raised. This was fixed and a test was added to check the flow. Related to odoo/odoo#231247 task-5159666 Forward-Port-Of: odoo/enterprise#99723 Forward-Port-Of: odoo/enterprise#97013
Fixed an issue that could prevent users from opening the payroll payrun view. This restores access to payrun information in the Payroll app after an underlying interface template changed.
Original PR description
Reproduce: 1. open payroll app 2. try to access the payrun view Issue: The `web.KanbanHeader` template is update and replace a `t-esc` with `t-out` when we have an xpath on the old value Solution: update the xpath expr Task: 5323275
This update corrects how IoT websocket messages are sent so the message type is included as expected. It helps ensure websocket communication can be tested reliably and reduces the risk of issues in connected IoT workflows.
Original PR description
In order to allow testing the websocket protocol, we need to provide the message type to the `sendMessage` method. This was forgotten in odoo/enterprise#97525. Forward-Port-Of: odoo/enterprise#98568
The due button on a contact now remains visible whenever that contact has at least one customer or vendor invoice, even if nothing is currently owed. This keeps quick access to financial details and customer statements available when teams need to review past activity.
Original PR description
The `Due Button` on `res.partner` is a convenient shortcut to access the partner’s current financial situation, especially the Customer Statement report. Even if the partner has no outstanding balance, the shortcut remains useful. So in this commit, we update the visibility logic of the `Due Button` so it appears as long as the partner has at least one `invoice (in/out)` linked to them. This means the button will remain visible even when the total `due amount is `zero`, ensuring the shortcut is always accessible. Task-5264512 Forward-Port-Of: odoo/enterprise#99514
The employee profile's Reviews button now correctly displays related contract review records after an offer is signed. This prevents users from seeing an empty list even when the button indicates records exist, improving confidence in employee contract workflows.
Original PR description
Issue:
When an offer is created and signed by the employee, the `Reviews` smart button appears on the employee profile. Although it indicates that there are records, clicking the button redirects to an empty list.
Reason:
After converting contracts to the versioning system, the action for the Reviews button does not properly display contract versions, regardless of whether they are active or inactive, as it did in the previous version.
Fix:
Added a context `{"active_test": False}` to show active or inactive records.
task-5155455
Forward-Port-Of: odoo/enterprise#96808The spreadsheet pivot side panel now respects debug mode when adding a column, so advanced users can search and see technical field names as expected. This restores the intended behavior for configuring pivot data in spreadsheets and reduces friction for support, implementation, and power users.
Original PR description
Steps to reproduce: - Activate debug mode - Insert a pivot in a spreadsheet - In the side panel, click on "Add column" => the component is not in debug mode, so the technical name cannot be searched and is not displayed Task: 5264589 Forward-Port-Of: odoo/enterprise#99484
Payroll now respects the setting that disables change tracking when employees are edited through the salary configurator. This avoids unnecessary log entries and keeps employee records cleaner for HR teams.
Original PR description
We use a hack to force the tracking of some fields on the employee. It causes some problem when you work with the salary configurator as we don't want the changes logged in this case. The solution is to not track prepare the fields if there is a tracking disable in the context, like mail does. Forward-Port-Of: odoo/enterprise#99800
Check messages in the EU OSS reports now display in a cleaner, more consistent format. This improves readability for users reviewing report checks and removes an awkward multi-line presentation issue.
Original PR description
Multi-line messages for checks are displayed on multiples lines starting in 19.0. This is ugly and we fix this so every checks have a similar look. Before: <img width="368" height="103" alt="image" src="https://github.com/user-attachments/assets/67bb84f9-ac61-4c0d-84ba-b8a886763546" /> After: <img width="337" height="74" alt="image" src="https://github.com/user-attachments/assets/4f45b368-cf60-4b46-b10a-dd1b75ceb9f9" /> Forward-Port-Of: odoo/enterprise#99772
20 changes
Resolved issues and error corrections
The Job Page button on job listings now appears only when Online Posting is enabled, and stays hidden when it is disabled. This avoids confusion and makes the button match the job’s publishing status, while still linking directly to the job page when available.
Original PR description
This commit fixes the visibility of the "Job Page" button on the job kanban view. The job page button is now invisible when the `Online Posting` setting is disabled and visible when it is enabled, and directs to the job link. task-5153230 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233421
This update adds a database index to a field used to link invoice symbols with invoice templates in the Vietnam e-invoicing module. It helps the system retrieve related records more efficiently and keeps the module aligned with Odoo’s performance rules.
Original PR description
TestIndex.test_enforce_index_on_one2many_inverse Traceback (most recent call last): AssertionError: The following fields should be indexed with a btree index, as they are inverse of an One2many field: - if the field is sparse -> 'btree_not_null' - if the field is Required or low fraction of False/NULL values -> True or 'btree' - if not sure -> 'btree_not_null': l10n_vn_edi_viettel.sinvoice.symbol.invoice_template_id (inverse of l10n_vn_edi_viettel.sinvoice.template.invoice_symbols_ids) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix improves the message shown when an accounting entry is not balanced. If several entries are affected, users will now see the full list instead of only the first one, making it easier to identify and resolve the issue.
Original PR description
The commit 3467b5971423f70581c6be2caf7f8a8d86ee70f1 intended to improve the error message in `_check_balanced()` by tailoring it based on the number of affected entries. However, in the case of multiple affected entries, the error was raised after the first iteration, preventing the full list of unbalanced entries from being collected and displayed to the user. no-task --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236212
This update stops the system from recording unnecessary field changes when using the salary configurator. It helps keep employee change history accurate and avoids confusing log entries during payroll setup.
Original PR description
We use a hack to force the tracking of some fields on the employee. It causes some problem when you work with the salary configurator as we don't want the changes logged in this case. The solution is to not track prepare the fields if there is a tracking disable in the context, like mail does.
This change adds a database index to a key link used by the Vietnam Viettel e-invoicing feature. It helps Odoo find related records faster, improving performance and reducing delays in processes that rely on these invoice templates.
Original PR description
`TestIndex.test_enforce_index_on_one2many_inverse Traceback (most recent call last): AssertionError: The following fields should be indexed with a btree index, as they are inverse of an One2many field: - if the field is sparse -> 'btree_not_null' - if the field is Required or low fraction of False/NULL values -> True or 'btree' - if not sure -> 'btree_not_null': l10n_vn_edi_viettel.sinvoice.symbol.invoice_template_id (inverse of l10n_vn_edi_viettel.sinvoice.template.invoice_symbols_ids)` 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 update adjusts the website builder test setup so it works reliably in Firefox. It prevents a test-only browser behavior from blocking the builder tests, helping ensure the website editing experience can be validated consistently across browsers.
Original PR description
In the website builder test suite, Chrome doesn't load the initial iframe (we load a dummy iframe instead) and never goes through `preparePublicRootReady` from the `WebsiteBuilderClientAction`. On the contrary, Firefox does load the initial iframe. We already have a partial fix for it in the html_builder test helpers (see `originalIframeLoaded`), but it stopped working at some point. As Firefox loads the iframe and goes through `preparePublicRootReady`, it re-assigns `this.publicRootReady` to a deferred that is never resolved in tests, which prevents any Hoot builder test from working. Solution: completely override `preparePublicRootReady` with an empty method in tests. task-5266212 Forward-Port-Of: odoo/odoo#235830
The Alternative Products section on the website now displays clean product names instead of including internal reference codes for certain products. This makes the product cards match the main product page and improves the customer shopping experience.
Original PR description
**Steps to reproduce:** 1. Install eCommerce. 2. Open a product > Sales Tab > Alternative Products 3. Add products with an internal reference (default_code) and Attributes. 4. Go to website > scroll…
**Steps to reproduce:**
1. Install eCommerce.
2. Open a product > Sales Tab > Alternative Products
3. Add products with an internal reference (default_code) and Attributes.
4. Go to website > scroll down to the alternative products section.
**Issue:**
- The "Alternative Products" snippet displays the product's internal reference
in the title.
- This occurs only for products with attributes and variants(attribute_line_ids)
- The behavior is inconsistent with the main product page, where only the
product name is shown
Cause :
- The QWeb template was accessing the product name through values['data']['_record'] (which is a product.template)
whose display_name includes internal reference (e.g., [E-COM06] Corner Desk Right Sit).
This occurs for products that have attribute_line_ids.
https://github.com/odoo/odoo/blob/f0a34badefd432e9c2ab36acaf018d20d0e342fe/addons/website_sale/data/product_snippet_template_data.xml#L17-L20
<img width="1920" height="458" alt="image" src="https://github.com/user-attachments/assets/c3088149-b6c8-4cd7-8db4-129f0282a09d" />
- However, values['data'] already contains a clean display_name
(e.g., Corner Desk Right Sit) i.e. as expected.
**Solution:**
- Updated the QWeb template to use the correct field from the prepared data:
`t-out="data.get('display_name') or product.display_name"`
- This ensures that the title displays a clean product name consistent with the
main product page, without the internal reference
**opw-5122632**This fix makes mail record existence checks update correctly when a record is deleted. It ensures the interface reacts immediately to changes instead of showing outdated information.
Original PR description
The `exists` function of mail records is not reactive. Indeed, it uses a symbol, stored on the proxy internal field which is not observed. This commit fixes the issue by storing it on the record and ensuring we write on the full proxy when the record is deleted. 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#236346 Forward-Port-Of: odoo/odoo#236042
The Recruitment app now displays the job position email field correctly in the kanban view. This small visual fix improves readability and makes the job card layout look consistent after adding an email alias.
Original PR description
Steps to reproduce: --------------------------- 1. Install the Recruitment app with demo data. 2. In Settings, add an Email Alias for the company. 3. Open the Recruitment app. 4. Click the Configure…
Steps to reproduce: --------------------------- 1. Install the Recruitment app with demo data. 2. In Settings, add an Email Alias for the company. 3. Open the Recruitment app. 4. Click the Configure button on the job position kanban card. 5. In the Job Position form view, add an email alias. 6. Use the breadcrumbs to navigate back to the job positions. Observation: --------------------------- The email field for the job position is misaligned in the kanban card. Issue: --------------------------- The `div` containing the email is missing a `justify-content-*` class https://github.com/odoo/odoo/blob/5ab45d45073463495e517aca9fd061415a73e893/addons/hr_recruitment/views/hr_job_views.xml#L77 Solution: --------------------------- Add the missing `justify-content-between` class to align the email properly. Before: <img width="1909" height="749" alt="before" src="https://github.com/user-attachments/assets/51790c71-f30d-4402-ae24-a5ccfb30ff9a" /> After: <img width="1914" height="697" alt="after" src="https://github.com/user-attachments/assets/711f83f6-208e-44c3-83e2-8b736c697a9d" /> opw-5246587
The VoIP keypad now correctly removes highlighted digits when using backspace, even if the selection starts at the first character. This restores expected editing behavior while keeping input handling safe and prevents users from being blocked by the earlier regression.
Original PR description
This commit fixes a regression introduced in commit [1] prevented deleting when a selection began at index 0; extend the guard so the numpad (keypad) backspace still removes the highlighted characters while keeping the cursor-safety logic. [1]: https://github.com/odoo/enterprise/commit/73b01fa5e1f56d4ab71d67760b15942fb2fa0e31 task-5217676 Forward-Port-Of: odoo/enterprise#99655 Forward-Port-Of: odoo/enterprise#99358
When a vendor bill has only one related landed cost, clicking the Landed Costs button now opens that record directly instead of first showing a list. This removes an extra click and makes the workflow faster and smoother for users.
Original PR description
## Before this commit: When a user clicked the Landed Costs smart button on a vendor bill, even if there was only a single landed cost, the system opened the list view first. The user then had to click again to open the form view, which was unnecessary and inconvenient. ## After this commit: The system now opens the landed cost form view directly if only one record exists, avoiding the unnecessary step of displaying the list view. > Task-5231913 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The small dot shown on calendar events is now easier to see when an event is unpublished or hatched. The styling was also moved so it works consistently in related views, including Planning even when the Calendar app is not installed.
Original PR description
When pills are hatched (unpublished event) in the calendar view (eg. planning) the `o_event_dot` is barely visible. Additionally the styling to display the dot as outlined on hatched event is wrongly scoped in `/calendar` with the calendar status styling. It should be in the view instead. Otherwise, for the planning module which doesn't depend on calendar, the styling is not applied if calendar is not installed, rendering the filled dot. task-3916768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235978 Forward-Port-Of: odoo/odoo#235286
The import screen now shows the same formatting options for files ending in either .csv or .CSV. This makes the import experience more consistent and avoids confusion for users uploading CSV files with uppercase extensions.
Original PR description
Before this fix, the import side panel displayed the formatting options only when the uploaded file had a lowercase .csv extension. Files with an uppercase .CSV extension could still be imported but did not show the format selection section, leading to inconsistent behavior. This commit updates the condition to perform a case-insensitive comparison on the file extension. Task-5145031 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236348 Forward-Port-Of: odoo/odoo#235061
This change updates the payment methods Odoo enables for Mollie so they match what Mollie actually supports by default. It also removes a payment method that Mollie is phasing out, reducing setup confusion and avoiding unavailable options for customers.
Original PR description
**[FIX] payment_mollie: remove iDEAL from the default payment methods** When a new Mollie account is created, it only accepts card payments out of the box. In Odoo, both the Cards and iDEAL payment methods were activated by default upon enabling the payment provider, while iDEAL required manual activation from Mollie's dashboard. --- **[FIX] payment_mollie: remove Sofort from the linked payment methods** See https://help.mollie.com/hc/en-us/articles/20904206772626-SOFORT-Deprecation-30-September-2024ard. Forward-Port-Of: odoo/odoo#236182 Forward-Port-Of: odoo/odoo#236044
When website content generation runs into a known user-facing error, the system now records it as a warning instead of an error. This better matches the fact that users are already notified in the interface and avoids creating unnecessary error-level logs.
Original PR description
- Currently, we log an error whenever an error occurs during content generation for any webpage. - However, it is a non-blocking error so it can be safely converted to a `_logger.warning`, as we already notify user about the error through a notification [1]. - Additionally, the errors caught here will be all UserErrors so no need to log another error, so we log a warning instead. - This commit converts the `_logger.error` into `_logger.warning`. [1]: https://github.com/odoo/enterprise/blob/b001e9cc2af0f800e2a7965b61aa9b9c5bd4e89e/ai_website/static/src/components/dialog/add_page_dialog.js#L74-L80 sentry-6974000714
This change removes a Northern Ireland business-to-business tax setup that was no longer needed. When applicable, it now uses the standard domestic tax setup instead, reducing complexity and keeping tax configuration aligned.
Original PR description
After more verification, we found that the Northern Ireland B2B Fiscal Position was unnecessary and could be replaced by the domestic one. So this commit removes this fiscal position and replaces it if needed by the domestic one.
When support users open a visitor’s contact from live chat, the contact now opens in a way that keeps the navigation trail intact. This makes it easier to go back to the original chat session and continue working without losing context.
Original PR description
Previously, when we click on the "View Contact" button, the corresponding partner's form is opened but via a href link which does not preserve the breadcrumb. Purpose of this commit is to use the action service instead, to open the form view of the partner, which will preserve the breadcrumb so that navigating back to that session is handy. Part of Task-5190261
When the quantity of a stock move is increased, the system now updates the existing reservation correctly instead of behaving like a new line was created. This keeps stock handling more accurate and prevents test and workflow mismatches in barcode-related processes.
Original PR description
Increasing the quantity of a stock move will create a move line with the same data as the stock move (location and product), no lot, nor package. This commit correct some tests values because increasing the quantity on a stock move will increase the existing move line quantity instead of creating a new one.
This change includes the database identifier with SMS requests sent to Odoo’s cloud service. It helps support teams more quickly identify and troubleshoot issues for customers when a problem occurs.
Original PR description
Send the db_uuid to IAP such that we can more easily debug and support our users in case of a problem. task-none Forward-Port-Of: odoo/odoo#235540 Forward-Port-Of: odoo/odoo#233912
This update corrects how certain accounting template records are labeled behind the scenes. It helps ensure those records are associated with the right module, reducing the risk of setup or update issues for related accounting features.
Original PR description
Trying to fix the account_asset data records having `account` as a module while targeting the `account_asset` model that belongs to the `account_asset` model.
11 changes
Resolved issues and error corrections
This change removes a unit test that depended on the wrong module setup and on Enterprise-only fields. It helps keep automated builds stable and avoids test failures caused by missing dependencies.
Original PR description
The unit test `test_can_reset_deferred_invoice()` has several issues. 1. It should be in the `account_audit_trail` module, as the test requires this module. [Unit test documentation: modules](https://www.odoo.com/documentation/19.0/developer/tutorials/unit_tests.html#modules). 2. The test references fields from the Enterprise module `account_accountant`, `account.move.line.deferred_start_date` and `account.move.line.deferred_end_date`. This causes build tests to fail. As such, the test should be removed now and replaced later if necessary. Fixes [PR 235223](https://github.com/odoo/odoo/pull/235223) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#235813
This change moves a small portal-related customization out of the general rating area and into the dedicated portal rating module. It keeps the product structure cleaner and ensures the customization lives where its portal dependency belongs, reducing maintenance risk.
Original PR description
Since #234356, `_get_allowed_message_post_params` method of the `PortalChatter` has been overridden in the `rating` module. As the `rating` has no dependency on the portal, the current change moves this override to the `portal_rating` module.
The calendar day view no longer cuts off event titles on mobile devices. This makes it easier for users to quickly understand their schedule without opening each event.
Original PR description
Before this commit, when the user goes to a calendar view in day to check what he have to do. He cannot see the event title properly in his mobile phone since the title is truncated. This commit makes sure the event title is not truncated to clearly see the whole event title. Before the fix: <img width="1172" height="802" alt="image" src="https://github.com/user-attachments/assets/f85a4a03-89a3-48c8-bda7-38e72854ce1f" /> After the fix: <img width="1179" height="808" alt="image" src="https://github.com/user-attachments/assets/7b0b31ba-10f5-412b-837b-8399c78c5bac" />
This change fixes a visual issue where card images could show white edges when a hover animation was applied. It keeps the image filling its card properly, improving the look of website content and avoiding unwanted gaps.
Original PR description
Step to reproduce: 1. Open website 2. Click edit button and drop s_three_columns snippet 3. Click image and change animation option into hover 4. Some extra white space shown. Before this commit: Applying a hover animation on card images caused the `object-fit` property to unintentionally switch from `cover` to `contain`, resulting in visible white borders around the image.This happened because of the `geo_square` shape, which is automatically injected when a hover effect is applied and no user shape is chosen. This behavior was intentionally introduced in PR [1]. After this commit: Now cropped images use object-fit: contain to preserve the visible properly. and after stretch option apply it can take cover of this container. so his ensures the image fully covers its container without leaving any white gaps. [1]:https://github.com/odoo/odoo/pull/119197 task:4875770
This update adjusts an automated test so it follows the same path a user would take in the interface. That ensures the system correctly detects and reports an invalid event product setup, preventing false test failures and improving confidence in the validation rule.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a minimal database with `event_product` installed; 2. run `:TestEventProduct.test_ensure_event_service_tracking`. Issue ----- > FAIL:…
Versions -------- - 18.0+ Steps ----- 1. Have a minimal database with `event_product` installed; 2. run `:TestEventProduct.test_ensure_event_service_tracking`. Issue ----- > FAIL: TestEventProduct.test_ensure_event_service_tracking > AssertionError: ValidationError not raised Cause ----- The test works as expected with `sale_project` installed due to a `write` override of `product.product`, setting the `service_tracking` to 'no' if `type` is no longer 'service': https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/sale_project/models/product_product.py#L25-L30 This change still occurs without `sale_project` installed, but via the `_compute_service_tracking` method defined in `product`: https://github.com/odoo/odoo/blob/dc57ea4d306f8745d37f2c5d2c3d3fa4bcaf7253/addons/product/models/product_template.py#L181-L183 As this value is set via a compute method instead of `write`, the `_check_event_ticket_service_tracking` method isn't triggered, and no error is raised. Solution -------- Simulate a front-end flow by changing the `type` to 'consu' on a product form. This way, the constraint method does get triggered as expected. runbot-234024
This fix prevents Studio from crashing when a user adds a new Selection field option without entering any text. The “Add Selection” action now safely ignores empty input, improving reliability while configuring fields.
Original PR description
**Before this commit:** When a user added a new Selection field and clicked the “Add Selection” :white_check_mark: button without entering any value, a `Client Error: (Cannot read properties of undefined (reading 'trim'))` was raised, resulting in a crash of the Studio interface. **After this commit:** Clicking the “Add Selection” :white_check_mark: button with an empty input no longer triggers an error. task-5159376 Forward-Port-Of: odoo/enterprise#98767
This update fixes an issue where the message composer could fail when no message was attached yet. As a result, suggestions now load reliably and the composer no longer runs into this error in that case.
Original PR description
This commit solves a runbot issue created by the debounced nature of the suggestion fetch. A composer could not have a message associated with it and was therefore failing to find the related thread. Now, the thread is set to undefined in that case since we do not need the result anyway. fixes-runbot-230311 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Website discussion bubbles are now shifted out of the way while editing, so they no longer cover the page builder. This makes it easier for users to select and edit snippets, especially when multiple conversations are open at once.
Original PR description
Before this commit, discuss bubbles would appear on top of the editor when editing a website. I was therefore be difficult to select some snippets, especially when the user had a lot of conversations at the same time and he wanted to keep the discuss bubbles visible. This commit shift the discuss bubbles on edit to solve the issue. task-4266898
This update makes Odoo compatible with the latest code quality checker versions, preventing false errors during development and testing. It also cleans up a few test and hardware-related scripts so automated checks run more reliably across supported environments.
Original PR description
- astroid 4 deprecates toplevel exports of nodes, thankfully that was never actually necessary so we can just import that unconditionally - remove support for pre-jammy pylint / astroid, specifically `astroid.nodes` was added in astroid 2.7.0 and `astroid.node_classes` deprecated then and removed in 3.0, this can affect Bullseye users as it shipped with astroid 2.5 - Astroid 4 changes `spec.Finder.find_module` in order to cache it (pylint-dev/astroid#2509), we can just make our method static for all versions as we don't need `self` anyway. - The mail test triggers `function-redefined` (E0102), fix it. - Skip the escpos script thing which triggers a bunch of `undefined-variable` (E0602) false positives. Forward-Port-Of: odoo/odoo#236258
This change cleans up duplicated methods in a few areas of the system. It does not add new business functionality, but it helps keep the codebase easier to maintain and reduces the risk of inconsistent behavior later.
Original PR description
found by pylint 4 Forward-Port-Of: odoo/enterprise#99809
This change corrects an automated test for subscription order lines so it matches the actual product name and description format. It helps prevent false test failures and keeps future changes from being blocked by an incorrect expectation.
Original PR description
In the test "test_subscription_order_line_description", assertEqual compares name field with just the description of the product. The name field includes the name of the product, new line "\n", and the description of the product. So, we fix it by including the name of the product followed by the new line followed by the description of the product in the second value of the self.assertEqual(). This fix was done because the test was failing for the PR "https://github.com/odoo/odoo/pull/233884" opw-5266849
5 changes
Resolved issues and error corrections
This update keeps Odoo working with newer code-quality checks by adjusting a few internal patterns and test files. It also reduces false alarms during validation, helping teams run maintenance checks more smoothly and reliably.
Original PR description
- astroid 4 deprecates toplevel exports of nodes, thankfully that was never actually necessary so we can just import that unconditionally - remove support for pre-jammy pylint / astroid, specifically `astroid.nodes` was added in astroid 2.7.0 and `astroid.node_classes` deprecated then and removed in 3.0, this can affect Bullseye users as it shipped with astroid 2.5 - Astroid 4 changes `spec.Finder.find_module` in order to cache it (pylint-dev/astroid#2509), we can just make our method static for all versions as we don't need `self` anyway. - The mail test triggers `function-redefined` (E0102), fix it. - Skip the escpos script thing which triggers a bunch of `undefined-variable` (E0602) false positives.
This change removes repeated method definitions in a few enterprise modules. It does not add new user-facing features, but it helps keep the codebase cleaner and reduces the risk of maintenance issues later.
Original PR description
found by pylint 4
Odoo now uses the updated official code for Odisha in India, replacing the older code. This keeps contact and sales information aligned with current government standards and helps avoid mismatches when creating customer records and sales orders.
Original PR description
**Steps to reproduce:** 1. Install the `Contacts` module. 2. Go to Contacts > Create a new contact. 3. Select country India, and state Odisha. 4. Create a sales order using the newly created contact. **Issue:** As per [Government of India](https://www.iso.org/obp/ui/#iso:code:3166:IN), the state code was officially changed from "OR" to "OD" in 2023. However, Odoo still uses the outdated code. <img width="407" height="163" alt="image" src="https://github.com/user-attachments/assets/1631a831-f455-4a51-886f-7e4ed691add0" /> **Solution:** Update the name of the state from "OR" to "OD" in state records. **opw-4935633**
Blog post paragraphs will now inherit the font size set in the website theme. This makes blog content match the site’s design settings and keeps formatting consistent across the page.
Original PR description
Previously, changing the paragraph font size in the theme (Website > Edit > Theme > Paragraph > Font Size) did not affected the paragraphs within blog posts. This was because blog post paragraphs used a static font size, overriding the theme's setting. This PR removes the overriding style, allowing blog post paragraphs to inherit the font size defined in the theme. task-4167716
When users search on website pages, the system now checks whether the current page exists for that search. If the user is beyond the last available page, they are automatically redirected to the final valid page so results and pagination display correctly.
Original PR description
Scenario: - enable website_studio - go to contact -> open studio -> website - add a listing and open it on website - go to page 2 and search a specific terms with less than 20 results Result: we see "5 results" in the search bar, but no result are shown and the pager is hidden. Cause: the pager is hidden since there is only one page, and we are currently displaying the records of page 2 that do not exist. Fix: if we detect that we are on a page over the last page, redirect to the last page. Eg. if there is 2 pages and we are in page 500, redirect to page 2. opw-5008556