Friday, November 21, 2025
33 changes · master
Resolved issues and error corrections
The UK localization no longer uses a separate Northern Ireland B2B fiscal position because the standard domestic setup covers those cases. This reduces duplication and helps keep tax configuration simpler and more consistent for UK businesses.
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. Forward-Port-Of: odoo/odoo#236467
Calendar event titles now remain fully visible in the day view on mobile devices instead of being cut off. This helps users quickly understand their schedule without opening each event for details.
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" /> Forward-Port-Of: odoo/odoo#235823
This fixes an issue where parts of the Mail app could fail to update when a record was deleted or no longer available. Users should see more reliable real-time behavior and fewer stale items in mail-related screens.
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
Alternative product titles on the eCommerce product page now show the customer-facing product name instead of including internal reference codes. This keeps related product displays consistent with the main product page and avoids exposing back-office identifiers to shoppers.
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**
Forward-Port-Of: odoo/odoo#229028This update refines the desktop Discuss app layout by reducing header spacing, preventing cropped sidebar badges, and positioning the message composer more naturally. It also moves typing indicators and livechat navigation hints into clearer locations, making conversations easier to read and use.
Original PR description
Minor style improvements to discuss app in desktop: - less vertical padding of the header - no cropped badge on mailbox below "New meeting" in sidebar compact - composer is lower The composer was…
Minor style improvements to discuss app in desktop: - less vertical padding of the header - no cropped badge on mailbox below "New meeting" in sidebar compact - composer is lower The composer was higher to give room for "is typing" and "Tab to next livechat" features that were at bottom of composer in discuss app. They were changed to match chat window style: - "is typing" is above composer - "Tab to next livechat" is suggested in placeholder of composer Before (left) / After (right) <img width="1521" height="792" alt="Screenshot 2025-11-18 at 19 05 55" src="https://github.com/user-attachments/assets/216dd9de-601b-44fe-9169-66f50a243992" /> Before <img width="959" height="997" alt="Screenshot 2025-11-18 at 18 23 27" src="https://github.com/user-attachments/assets/9d9dfef0-8412-4a38-b0c7-7f9c66b084e5" /> After <img width="958" height="993" alt="Screenshot 2025-11-18 at 19 05 12" src="https://github.com/user-attachments/assets/cd6a9d14-e058-4159-920c-69778c6b3ec9" /> Forward-Port-Of: odoo/odoo#236329
Odoo now handles more types of business data when saving flexible JSON fields. This prevents errors when existing business logic stores structured values such as domains or frozen dictionaries, improving reliability without changing user workflows.
Original PR description
The field did not change for quite some time. It mainly serves as a way of storing and retrieving some unstructured data. Use default serialization function when assiging values to Json fields. Some business code may assign domains or frozendicts to json fields. That should not fail. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#236209
Website card images now display correctly when a hover animation is applied, avoiding unwanted white gaps around the image. This helps pages built with card snippets keep a polished appearance without extra manual adjustments.
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 Forward-Port-Of: odoo/odoo#215766
Purchase quotation emails now send customers to the website connected to the relevant company, instead of the default site. This avoids confusion for multi-company setups and ensures portal users land on the correct branded website.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Host a server with demo data on localhost; 2. create & switch to a second company; 3. have a website linked to the second company; 4. set the website's domain to http://2.localhost:8069; 5. create a purchase order; 6. send order via email; 8. open mail via Settings / Technical / Email / Emails. Issue ----- The "View Quotation" button links to the default URL instead of the second company's website. Cause ----- The button added via `_notify_get_recipients_groups` only adds a relative URL, which then defaults to the database's base url when sent. Solution -------- Use an absolute URL, using the order's `get_base_url` method. opw-5035391 Forward-Port-Of: odoo/odoo#236598 Forward-Port-Of: odoo/odoo#233255
Website contact forms now display the reCAPTCHA privacy line without an unwanted blank space. This makes forms look cleaner and more polished for visitors when reCAPTCHA is enabled.
Original PR description
Steps to Reproduce: 1. Go to _Settings_ and search for reCAPTCHA. 2. Add the required keys. 3. Go to _Website_ and enter edit mode. 4. Drop any _Contact Form_ snippet. 5. Make the labels to top. 6.…
Steps to Reproduce: 1. Go to _Settings_ and search for reCAPTCHA. 2. Add the required keys. 3. Go to _Website_ and enter edit mode. 4. Drop any _Contact Form_ snippet. 5. Make the labels to top. 6. Enable the _Show reCAPTCHA_ option. 7. Notice an unnecessary blank space before the privacy policy line. Issue: The reCAPTCHA line created unnecessary blank space when aligned to the left. Reason: The line was placed inside the form block, which reserves space for a label. Since reCAPTCHA has no label, an empty placeholder space appeared. Fix: Removed the `.s_website_form_recaptcha` class responsible for reserving space for labels in the reCAPTCHA line, preventing the creation of an unnecessary blank space. Additionally, the reCAPTCHA line is now right-aligned by default. Before: <img width="1464" height="406" alt="image" src="https://github.com/user-attachments/assets/b5fc0fc2-104d-4a3e-a6c9-fab34992ee0d" /> After: <img width="725" height="741" alt="image" src="https://github.com/user-attachments/assets/957e133d-817f-4af9-9435-c6b139564438" /> task-4756289
Employee contract templates now correctly filter activity lists to show only templates with assigned activities. This prevents users from seeing every contract template when they open activity-related views, making follow-up work clearer and more accurate.
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 Forward-Port-Of: odoo/odoo#236596 Forward-Port-Of: odoo/odoo#234274
This update removes unwanted blank space around horizontal lines in mass mailing emails when using the pricelist snippet. It ensures placeholder content used by the editor stays hidden visually, keeping email layouts cleaner and closer to the intended design.
Original PR description
This [commit] introduced an issue in `mass_mailing` where `[data-selection-placeholder]` paragraph take up vertical space when they were not designed to. How to reproduce: - create a new mass_mailing - add the snippet "pricelist" Issue: - Horizontal lines have extra blank space around them (empty `[data-selection-placeholder]` paragraphs Resolution: - Use the related style asset for these nodes from html_editor, and add `!important` on the margin-bottom style property value, to ensure that the Design Tab does not override it. - Since `mass_mailing` does not use `web.assets_frontend` anymore, files from new features in the `html_editor` may not automatically be included in `mass_mailing` bundles. A future task will refactor assets bundles so that this problem does not occur again. [commit]: https://github.com/odoo/odoo/commit/edf7f7bb0c62978640c181eccb4934855d5d872d task-5265692 Forward-Port-Of: odoo/odoo#235772
Fixes an issue in mass mailing where undo and redo could bring back a conditional display rule after the recipient model changed. This prevents invalid audience conditions from reappearing in email content, helping users avoid inconsistent or incorrect mailings.
Original PR description
There is an issue with conditionally visible snippets in `mass_mailing` where a user is able to undo in the editor the reset of a filter caused by a recipient model change. How to reproduce: - Create a mass_mailing and add a conditional display rule on a snippet - Change the recipient model - undo, then redo Issue: - The rule appears again on the element, even though the model still has the new value. The domain is invalid, since it applied only on the previous model Resolution: - Make the `data-filter-domain` a `system_attribute` so it is not registered in the editor history. To inform the view that there was a change, `onChange` is called directly when the attribute value changes. task-5263043 Forward-Port-Of: odoo/odoo#235552
The Peppol invoicing area now uses the current Peppol branding consistently and removes outdated status options and unused screen elements. This reduces confusion for users and keeps the accounting interface aligned with current Peppol terminology.
Original PR description
Align PEPPOL to Peppol as done by OpenPeppol in all their communication and visuals. Cleanup the unused views and selection. - 'Skipped' is not used for a few versions already, let's clean the selection. - We no longer display the "PEPPOL status" in list view, let's cleanup the view extensions. task-none
This fixes an issue in the website editor where previewing image shapes or filters could leave the wrong shape applied after moving the mouse away. Business users editing website pages can now try image styling options without accidentally changing or breaking the image preview.
Original PR description
After hover effect has been added back in this [commit], we could see an issue when we had a hover effect and tried to preview a shape. Steps to see the issue: - Open website and start editing - Drop…
After hover effect has been added back in this [commit], we could see an issue when we had a hover effect and tried to preview a shape. Steps to see the issue: - Open website and start editing - Drop a text-image snippet onto the page. - Then add a hover effect to the snippet image. - Open the image shape selector and hover over the shapes. => Bug: the preview is broken; when the mouse leaves a shape, the original shape is not reset. Same issue with other options when there is a hover effect on an image (e.g. "image Filter"). Current flow is: We are previewing shape -> img src is changed -> `originalImgSrc` in `ImageShapeHoverEffect` interaction is changed -> we revert preview -> img src is reverted, but MutationObserver doesn't change `originalImgSrc` immediately, and when reverting a step, we stop the interaction -> destroy is called and image source is set to `originalImgSrc`, but it is the old one with a shape. We want to update the `src` only if it is currently the one that we set as hovering. [commit]: https://github.com/odoo/odoo/commit/80b5db99a3c26c3dd4fb5c55e04b8813dddb5b8d task-5207382 Forward-Port-Of: odoo/odoo#233381
Email messages with collapsible sections now correctly show the read more/read less ellipsis icon. This makes longer email conversations easier to navigate and avoids a confusing missing-button display issue for users.
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#236421 Forward-Port-Of: odoo/odoo#228741
The source package build setup now uses the currently supported Ubuntu base instead of the older Debian base. This keeps packaging aligned with Odoo's supported environment and removes unnecessary waiting steps that could mask build issues.
Original PR description
The Dockerfile used for source package is still using the Bookworm distribution as base image. In order to be consistent with the Odoo supported distribution, let's update to Ubuntu Noble. This commit also removes useless `sleeps` that were hiding a real bug. It should help declutter #228456 Forward-Port-Of: odoo/odoo#236831
Selecting a product template on a sales order line now correctly carries over the needed order information. This helps sales teams get the right product behavior and pricing context when preparing quotations or orders.
Original PR description
task-4384655
Polls in Odoo Mail are now treated as regular comments with poll content instead of a separate message category. This keeps message handling cleaner and helps ensure future notification behavior stays consistent without changing how business users create or view polls.
Original PR description
'mail_poll' is not a message_type. Message types are actually linked to the source, and have a meaning about expected recipients as well as follower management. We currently have -> generic types…
'mail_poll' is not a message_type. Message types are actually linked to the source, and have a meaning about expected recipients as well as follower management. We currently have -> generic types depending on global source * comment: generated by user (Send a Message, Log a Note); * notification: generated automatically during the business flow; * email: generated by mail gateway, incoming email; * email_outgoing: generated by mass mailing, outgoing email, and generally targets only specific recipients while skipping followers and notification process; -> specific types for recipients / access management * user_notification: generated in some business flows, restricted to specific recipients (others cannot access); * auto_comment: automated answer generated generally by tracking associated to templates, which denotates that we want to include specific recipients while skipping followers (e.g. acknowledgement emails); * out_of_office: generated due to an out-of-office mechanism, which means specific recipients, and specific management to avoid loops and spam; -> other notification mechanisms * sms: generated by SMS module, denotates a log of an outgoing SMS; * whatsapp: generated by Whatsap module, denotates a log of an outgoing Whatsapp message; Polls have no specific behavior linked to them. Those are actually comments with some specific content, which does not require a message type. This also allows to cleanup a bit message types, as a type linked to tracking (content and recipients specific management also) is about to be added. Task-5242100 Prepares Task-3645865
Odoo now uses the current official state code "OD" for Odisha, India instead of the outdated "OR" code. This helps ensure customer addresses and sales documents use the correct government-recognized code.
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** Forward-Port-Of: odoo/odoo#234697
Editing assignees on task cards no longer causes an error when users press backspace. This prevents an unexpected interruption in the task management workflow and keeps the interface stable while updating people assigned to work.
Original PR description
How to reproduce: - Go to project tasks - Edit the list of people assigned to a task - Press backspace Current behavior: Traceback Expected behavior: No traceback task-5189783 Forward-Port-Of: odoo/odoo#235997 Forward-Port-Of: odoo/odoo#235489
Opening the Documents app no longer fails when it contains an upload request linked to a CRM lead that has since been deleted. The document now safely shows no related record name instead of triggering an error, helping users continue working without interruption.
Original PR description
Steps to reproduce: - Install crm and documents - Go to CRM → Activity Types - Set a folder in the Upload Document activity - Create a CRM lead and schedule an upload document activity - Delete the created lead - Open the Documents module Issue: - A traceback occurs because web_read tries to access values_by_id[record.id], as the upload request document remains in the database after its related activity is deleted. Solution: - fix the recompute of res_name and set it to False, avoiding MissingError opw-5080182 Forward-Port-Of: odoo/enterprise#97461
This fixes an issue in the Belgian salary contract module where the system tried to use a missing calculation function. It now reads the correct work time rate field, helping salary contract information load reliably.
Original PR description
The function _get_work_time_rate doesn't exist, but the information we need is in the field work_time_rate. Forward-Port-Of: odoo/enterprise#99922
Closing or cancelling helpdesk tickets no longer causes an error when SLA working hours have been cleared or disabled. This keeps ticket workflows running smoothly even when teams do not use working hour policies.
Original PR description
> **The issue:** When you go to a helpdesk's team settings -> SLA Policies -> Working hours, set the working hours to empty and then disable SLA Policies and save. After that if you try to move a ticket in the same team to done or canceled you will receive an exception. **Cause:** The part of the code causing the issue is supposed to only run if a Working Hours policy is set. **Fix:** Changed the section of the code to only run when Working Hours is set. opw-5120962 > Forward-Port-Of: odoo/enterprise#98889 Forward-Port-Of: odoo/enterprise#96546
This fix updates the external tax sales test flow so it stays compatible with recent related changes in the core sales experience. It helps ensure optional product sales scenarios continue to work reliably when external tax calculation is enabled.
Original PR description
See Also: - https://github.com/odoo/odoo/pull/227241 Forward-Port-Of: odoo/enterprise#99188
The VoIP test setup was corrected to include complete contact data, preventing a validation error during automated test runs. This improves test reliability without changing the user-facing VoIP experience.
Original PR description
Before this commit, running VoIP tests in HOOT results in this error: > Global OwlError: Invalid props for component 'TabEntry': 'title' is not a string, 'phoneNumber' is not a string This is because one of the test is setup with incomplete data (no phone number). After this commit, test data is correctly set with a phone number, fixing the props validation error. Forward-Port-Of: odoo/enterprise#100057
This update corrects access to car information in the Belgian salary contract flow. Regular users and applicants can now access the car-related details they need, reducing blocked or incomplete contract salary processes.
Original PR description
Normal users and applicant don't have access to car. Forward-Port-Of: odoo/enterprise#99658
The Documents sharing wizard now properly applies changes when allowing link access. This ensures users' sharing permission updates are retained, reducing confusion and preventing incorrect access settings.
Original PR description
This commit fix the 'action_allow_link_access' method in 'documents.sharing' model by adding the 'WRITE_VALUE_PREFIX' to the updated fields. Otherwise the changes wasn't taken into account. Task-5220965 Forward-Port-Of: odoo/enterprise#98382
VoIP now checks both the main call and transfer call before marking a call as ended unexpectedly. This prevents transferred calls from being incorrectly flagged, improving call history accuracy for users.
Original PR description
Currently, the check for calls that were ended in a wrong way only assumes that there is one call where there might be two calls in case of transfers. This commit fixes this issue by checking for both session, the main session and the transfer session. Task-5208152
The VoIP test setup was adjusted so mobile device behavior is only simulated where it is needed. This prevents unrelated tests from being affected, improving confidence in automated test results without changing customer-facing functionality.
Original PR description
Since [1], mockUserAgent was called at the root of the module. In this case, it applies globally. This commit moves user agent mocking in `keypad.mobile.test.js` into `beforeEach` and switch to the platform-based "android" helper so it only applies to this suite. [1]: https://github.com/odoo/enterprise/commit/b118a5ceb7f0773783ca003c625c9ae3cccdebed
When a stock move quantity is increased, the system now adjusts the existing reserved line instead of creating an extra line without tracking details. This keeps barcode manufacturing stock flows more consistent and reduces confusion in inventory handling.
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. Forward-Port-Of: odoo/enterprise#96750
Updated VoIP test setup to use the browser platform mock in the intended way. This helps keep automated checks reliable and reduces the risk of false test results during future updates.
Original PR description
The `mockUserAgent()` is meant to be used with a "platform" ("mac", "windows", "android"...) as parameter and not a whole user agent string.
In specific cases, a custom string can be used instead, but only to be added to the user agent string.
This commit adapts its usage(s) accordingly.
Forward-Port-Of: odoo/enterprise#100154Planning analysis reports now only count shifts when they fall within an employee's working hours. This prevents hours from being incorrectly included in a later month when a shift ends after working hours, improving reporting accuracy for timesheets and planning.
Original PR description
### Steps to reproduce: - Create an employee with fixed working schedule from 8 to 5 - Create a Planning shift for this employee that starts in a month and ends in the first day of the next month outside of working hours (e.g. Sept30th 8AM -> Oct1st 2AM) - Navigate to Timesheets / Planning analysis reports - Notice October has been taken into consideration in the report's planned hours ### Cause: The query we are using for the timesheets/planning report doesn't take working hours into consideration it only cares about the date. So if the shift ends in October 1st we are taking it into account whether it is inside working hours or not. ### Fix: Add a condition to the where clause to check the working hours and if the record lays in this period or not. opw-5089052 Forward-Port-Of: odoo/enterprise#96846
This change avoids saving data into a field that is automatically calculated by the system. It helps prevent hidden data inconsistencies that could cause errors during product barcode lookup operations.
Original PR description
The field all_group_ids is computed from other groups, writing on it creates inconsistencies in the cache and may result in errors when invalidating/flushing.