Wednesday, March 4, 2026
50 changes · saas-19.2
Enhancements to existing features
This update enhances how Odoo identifies partners in Saudi Arabia. Previously, partner type was solely determined by VAT. Now, it also considers the Identification Scheme and Identification Number, leading to more accurate distinctions between companies and individuals, especially when VAT information is unavailable.
Original PR description
Before this commit: - Partner identification relied only on the VAT field. After this commit: - Partner identification in Saudi Arabia also considers Identification Scheme and Identification Number. - This improves detection of companies vs individuals when VAT is missing. task-5866942 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#246728
This update allows accountants to group invoice lines by tax, simplifying their workflow and reducing clutter in journal entries. The system intelligently manages PDF generation, preventing duplicate files when grouping and ungrouping tax lines. This improves efficiency and data clarity for financial reporting.
Original PR description
[IMP] account_edi_ubl_cii: (un)group lines by tax
Once an invoice is imported, a server action allows the user to group
lines by tax, and then if the same action is triggered again it will
ungroup all lines from the origin file
This feature is useful because accountants don't always need the
detail of the vendor bills, and also all the lines clutter up the
journal items
task-5047859
Forward-Port-Of: odoo/odoo#251520
Forward-Port-Of: odoo/odoo#245234This update simplifies the process for Italian businesses filing withholding tax returns. The default periodicity has been changed to monthly, addressing a previous difficulty in configuring this setting. This ensures compliance with Italian regulations and improves the user experience.
Original PR description
In Italy, withholding tax return periodicity is monthly. but it's hard to discover/configure. Default periodicity should be monthly. task-5985704 Forward-Port-Of: odoo/enterprise#109420 Forward-Port-Of: odoo/enterprise#109185
Resolved issues and error corrections
This update corrects a technical issue where incoming VoIP calls weren't properly recording their creation date in the database. The fix ensures accurate tracking of all calls, improving reporting and operational efficiency. This change was implemented as a bug fix.
Original PR description
For incoming calls in VoIP, they didn't have create date written in the database becasue we were using `self.env.cr._now`. The orm `create` method uses `self.env.cr.now()`, a method, and it's working fine for outgoing calls. This commit fixes it for incoming calls and changes `_now` to `now()`. Task-5979968
Code cleanup and technical improvements
This update reorganizes how Odoo handles website requests, moving the core serving logic to the `router.py` module. This change improves the system's architecture and efficiency, streamlining the process of delivering website content. It’s part of an ongoing effort to optimize Odoo's performance.
Original PR description
Now that the http module has been split, it makes sense to move the serving logic to the `router.py` module. These functions do not need to be exposed from a `Request` instance. Task-5926433
This update resolves an issue where refreshing pivot tables caused unexpected behavior in related dynamic tables. The fix ensures that all dependent tables are properly invalidated during a pivot refresh, improving overall performance and stability. This change addresses a technical detail that enhances the user experience.
Original PR description
Refreshing the pivot will invalidate the datasource,which means that t dynamic table related to a pivot also needs to be invalidated. This usually occurs when we insert a new table but since [1], we create dynamic tables out of thin air. Pretty much every command that will invalidate the pivots will now need to invalidate the tables as well. [1]: https://www.odoo.com/odoo/2328/tasks/4552232 Counter-part of https://github.com/odoo/odoo/pull/250909 Task-5976773
This update resolves an issue where sample data continued to appear after creating new records in list views. The fix ensures that sample data is properly disabled when views are reloaded, providing a cleaner and more accurate display of data in the control panel. This improves the user experience by removing visual clutter.
Original PR description
Have a view (e.g. list) with no real records but sample data. In the control panel, have a button that, when clicked, creates new records which match the current filter, i.e. which are displayed…
Have a view (e.g. list) with no real records but sample data. In the control panel, have a button that, when clicked, creates new records which match the current filter, i.e. which are displayed directly in the UI. Before this commit, the new records were correctly displayed, but the sample data overlay (opacity) was still there. The problem came from the fact that the sample data are automatically disabled when the view is reloaded **from above** (typically from the WithSearch component, when the user interacts with the search view). However, in the faulty scenario, the `load` function of the model is called directly by the view itself, so we don't go through WithSearch, and the code of model.js that ensures that we leave the sample mode. We already faced that issue in pivot and graph, and we solved it locally. This commit fixes it globally, by creating a small override of model.load which leaves the sample mode. task~5980226 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 streamlines the HTML editor's paste functionality by removing redundant code. Previously, the process of moving table headers (thead) into table bodies (tbody) was duplicated. This change, implemented through a refactoring, ensures a more efficient and reliable paste experience.
Original PR description
Description of the issue/feature this PR addresses: This PR removes duplicated logic in `cleanForPaste` that moves `thead` content into `tbody`. That behavior is already handled in insert (via `before_insert_processors`), so keeping it in `cleanForPaste` was redundant. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves an issue where the Odoo search bar on iOS devices (specifically with Korean keyboards) would incorrectly clear the input field during IME composition. The fix introduces a brief delay to account for iOS's temporary Backspace events triggered by the IME, ensuring the autocomplete remains open while Korean characters are typed.
Original PR description
Safari does not reliably set `KeyboardEvent.isComposing` during IME composition (e.g. Korean). As a result, the search value was processed too early and got cleared while composition was still in…
Safari does not reliably set `KeyboardEvent.isComposing` during IME composition (e.g. Korean). As a result, the search value was processed too early and got cleared while composition was still in progress. Interestingly, the issue could not be reproduced with the Japanese keyboard, which appeared to behave correctly. See [1]. This commit introduces a short delay before closing the autocomplete. On iOS, the IME temporarily triggers a Backspace event to remove the previously composed character before inserting the updated one. This Backspace incorrectly causes the autocomplete to close. With this change, we wait briefly (10ms) before closing it. If a new input event is received during that delay (corresponding to the newly composed character generated by the IME), the close action is cancelled. This ensures that the autocomplete remains open while the IME composition process completes. Steps to reproduce: - Configure a Korean keyboard on an iPhone - Open a Sale Order - Focus the search bar - Type a character, then type a second one to combine them - The search input value gets reset [1] #222151 opw-5448385 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#251141
This update resolves an issue where the admin user wasn't automatically creating an employee profile since version 19.1. The change streamlines the process when using workorder functions, directly creating an employee profile without a prior search, ensuring consistent functionality.
Original PR description
Since 19.1, the admin user doesn't have an employee profile automatically created. So we added a way to create one rapidly when using workorder functions. For that, we want to make direct use of the employee created by action_create_employee without needing to do a search. see https://github.com/odoo/enterprise/pull/107439 task 5932500 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update streamlines the process of adding employees to work orders. Previously, the automatic creation of employee profiles was removed, causing issues for administrators. Now, a popup allows quick employee creation with the current user's ID pre-filled, and automatically creates an employee if none exist when editing shopfloor operators.
Original PR description
In 19.1, the automatic creation of an employee profile for the admin user has been removed. This causes issues when the admin wants to start a workorder or mark it as done, so we added a popup to create a new employee profile with the user_id already filled with the id of the current user. Also, if no employee exist when editing operators in the shopfloor, the popup proposes to directly create a new employee linked to the current user if they have HR access. This new employee will be directly logged in the shopfloor operators. see https://github.com/odoo/odoo/pull/250607 to make `action_create_employee` return an employee record. task 5932500
This update addresses a potential issue in the Swiss payroll reporting process. Specifically, it now displays a warning instead of an error when the 'AVS' (Authorized Value System) is negative, providing clearer guidance to users. This ensures accurate reporting and avoids potential disruptions to payroll calculations.
Original PR description
Forward-Port-Of: odoo/enterprise#109046
This update resolves a test failure caused by demo data interfering with the lot search functionality. We've implemented changes to ensure the test environment is clean, creating new data and avoiding conflicts with existing demo data. This ensures the test consistently passes and the lot search feature continues to function correctly.
Original PR description
The `test_lot_search_partner_ids` expects a specific number of lots/SNs to exist in the database in order to ensure its custom `partner_ids` search works correctly. Because of this, the test fails if any lot demo data is installed. Therefore we create all new locations, products, lots and add extra search domain fields to avoid loading any of these demo data. Also add in extra long partner name to avoid conflicts with overlapping demo/test partner names. runbot error: 162921 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#250783 Forward-Port-Of: odoo/odoo#220777
This update corrects a technical issue where salary inputs weren't properly duplicated when creating copies of selections. Previously, this prevented accurate payslip generation. The change ensures that salary input selections are correctly copied, resolving a potential data discrepancy and improving payroll accuracy.
Original PR description
When having a salary input avaiblable for employee and payslip, and using it in an employee made it unavailable in payslips. This is unwanted behaviour and is due to the domain restricting existing_ids in employees. This was extracted from the action and is set in each separate model according to the needs. task-5909636 Forward-Port-Of: odoo/enterprise#106488
This update corrects a technical issue that could cause inconsistencies in payroll payslip data. The change ensures that all related data is synchronized correctly, preventing potential errors in payroll calculations and reporting. This improves the reliability of our payroll system.
Original PR description
Forward-Port-Of: odoo/enterprise#109112 Forward-Port-Of: odoo/enterprise#108729
This update fixes a minor inconsistency in the Documents app by ensuring that action names (like 'Vendor Bills') are dynamically set based on the type of account move being created. Previously, the action title was fixed to 'Invoices,' which wasn't always accurate. This change improves clarity and usability within the Documents app.
Original PR description
Previously, creating account moves from the Documents app opened the account.move list view with a static `Invoices` title, which was not explicit for all move types. Steps to reproduce: 1. Select suitable PDFs in Document App. 2. Click on `Vendor Bill`. 3. See the name of action (below Breadcrumbs) should be `Vendor Bills` instead of `Invoices` This fix adds and uses a mapping based on move_type to set the correct action name (e.g., Vendor Bills) after record creation. task-5983372 Forward-Port-Of: odoo/enterprise#109307 Forward-Port-Of: odoo/enterprise#109180
This update allows managers to automatically launch appraisal campaigns for all their team members, even if they don't select individuals from a list. This simplifies the process for managers and ensures all employees are included in the appraisal cycle. The change includes new tests to verify the functionality.
Original PR description
. Allow the Leader to launch an appraisal campaign for all their employees by default when no specific employees are selected in the list. task-5347755 Forward-Port-Of: odoo/enterprise#100214
This update simplifies the salary simulator by hiding temporary offers from the user interface. These offers are automatically removed after a month by a scheduled task, so this change only improves clarity and prevents user confusion. It ensures a smoother experience when using the salary configuration tool.
Original PR description
The salary simulator creates temporary offers to compute salary configurations. These offers must still exist for backend computations, as the configurator relies on them when updating results. Simulation offers are already cleaned up by a cron job after one month, so this change simply hides them from the list view to avoid user confusion. task: 5498873 Forward-Port-Of: odoo/enterprise#109241 Forward-Port-Of: odoo/enterprise#107340
This update fixes an issue where custom messages in website shop pages were being lost after saving. The change removes a cleanup process that incorrectly removed these messages during the website page save. Now, custom dropzone messages are correctly preserved after saving website pages.
Original PR description
Steps to reproduce: - Open the website shop page in edit mode. - Drag and drop a block in the shop header dropzone. - Save the page and re-enter edit mode. - Check the shop header dropzone message.…
Steps to reproduce: - Open the website shop page in edit mode. - Drag and drop a block in the shop header dropzone. - Save the page and re-enter edit mode. - Check the shop header dropzone message. => The custom message is replaced by the default one. Before this commit, `SetupEditorPlugin.cleanForSave()` removed `data-editor-message` and `data-editor-message-default` on the saved HTML clone, including custom messages defined in website templates. This cleanup was originally introduced in `web_editor` in [1]. Since the builder refactor in [2], website page saves now use the shared `html_builder` save cleanup flow and wrongly inherited that behavior, which introduced this regression in website. This commit removes that cleanup from `html_builder`, as it does not provide useful value in this save flow and drops custom dropzone messages. After this commit, custom dropzone messages are preserved after saving website pages. [1]: bab673488e185ddd7792aedecc3870663290fed3 [2]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-5921283 Forward-Port-Of: odoo/odoo#251579 Forward-Port-Of: odoo/odoo#250874
This update fixes a data issue in the Danish (DK) demo company data within Odoo. Specifically, the street number was missing, which was preventing proper functionality with Nemhandel (the Danish e-commerce payment system). This ensures accurate data for testing and demonstration purposes.
Original PR description
This commit adds the street number to the DK demo company, because we need it for nemhandel. no-task Forward-Port-Of: odoo/odoo#250970
This update fixes an issue where tip and discount amounts in the Point of Sale system were not correctly formatted when using a different decimal separator. This ensures users see accurate tip and discount calculations, reducing potential confusion and improving the user experience. The change was made to align with standard decimal formatting practices.
Original PR description
Before this commit, when the decimal separator was not a dot, the amount in the tip and the discount number popup was not correctly formatted, which could lead to confusion for the user. opw-5921256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#248232
This update fixes inaccuracies in the Bulgarian tax settings within the Odoo accounting system. Specifically, it corrects incorrect tax names and changes the default purchase tax rate to 20% FTC, aligning with current Bulgarian regulations. This ensures accurate tax calculations and reporting for Bulgarian businesses using the Odoo system.
Original PR description
Fixing incorrect tax names and changing the default purchase tax to 20% FTC instead of 20% PTC. task-5935754 Forward-Port-Of: odoo/odoo#251593 Forward-Port-Of: odoo/odoo#249269
This update resolves an issue where related fields within many2one chains were incorrectly displaying the wrong related model. Specifically, when two fields with the same name were used in a chain, the popover would show incorrect field options. This change ensures accurate field selection during related field creation.
Original PR description
You cannot create a related field with a related field chain that has two or more fields with the same name in a row. When you click the relation icon for a field the wrong model will be displayed if…
You cannot create a related field with a related field chain that has two or more fields with the same name in a row. When you click the relation icon for a field the wrong model will be displayed if the related model you are trying to show has a many2one with the same name as the field that was selected. Steps to reproduce 1. Create two many2one fields with studio that have the same name, one of the fields must link to the model the other field is on. i.e. `model_a.x_studio_test(relation=model_b), model_b.x_studio_test(relation=other_model)`. 2. Create a related field on model_a and click the related icon for the test field. 3. The popover will now be displaying the fields for other_model instead of model_b. Cause: This behavior was introduced by adding support for properties in this [pr](https://github.com/odoo/odoo/pull/189841). Solution: Check if `fieldDef` is a property or not in order to decide what to pass to `loadPath`. opw-ticket 5459944 Forward-Port-Of: odoo/odoo#249185
This update corrects a visual inconsistency in Odoo forms. Previously, the favorite star icon didn't match the heading font size, appearing at a smaller size. This change ensures all icons, including the favorite star, consistently align with the heading styles for a more polished and professional user experience.
Original PR description
Steps to reproduce:
Open a form with a favorite star in .oe_title (e.g. Product form). The star icon appears at body size (1rem) instead of matching the heading font size.
The <a> -> <button class="btn btn-link btn-link-inline"> refactor broke the size: .btn-link-inline sets --bs-btn-font-size to body size, so the existing .o_favorite i.fa { font-size: inherit } rule inherited 1rem from the button instead of the heading size.
Solution:
Add .o_favorite .btn to the font-size: inherit rule so the heading size cascades through the button to the icon.
opw-5998155This update corrects a bug that prevented users with RTL languages (like Arabic) from dragging and dropping content outside of designated dropzones. The fix adjusts the detection logic to account for the left-aligned sidebar in RTL layouts, ensuring proper functionality. This improves usability for a wider range of users.
Original PR description
When dropping outside a dropzone but still on the page, the code checks if the drop happened well outside of the sidebar (so on its left). However, in RTL languages, the sidebar is positioned on the left, so we need to check if the drop is on the right side of it instead. The fix checks if the sidebar is at the left edge (the body of the document should have the `o_rtl` class) and verifies the drop position is on the right of the sidebar. Steps to reproduce: - Set your profile to Arabic - Drag and drop a snippet outside of a dropzone => It's not dropped, but it should, as it would with an LTR language. task-5484936 Forward-Port-Of: odoo/odoo#251041 Forward-Port-Of: odoo/odoo#247759
This update resolves a technical issue that was causing errors in the mail composer and report generation when exporting invoices in certain UBL transactions. The fix ensures that the system doesn't attempt to access invoice date information when an invoice isn't present, preventing crashes and maintaining normal functionality.
Original PR description
### Description of the issue/feature this PR addresses: A regression in account_edi_xml_ubl_bis (_ubl_get_delivery_node_from_delivery_address) references invoice.invoice_date in the intracom delivery…
### Description of the issue/feature this PR addresses:
A regression in account_edi_xml_ubl_bis (_ubl_get_delivery_node_from_delivery_address) references invoice.invoice_date in the intracom delivery branch even when invoice is not set.
This method is also used in sale-order UBL export flows (for example during quotation PDF generation from mail.compose.message), where vals.get('invoice') can be None.
Blame points to regression introduction in commit 0bf8df7d0a096cf8fe984c42d331404d473eeb71 (FP from f6c5aed52e00e807c4879e4139b116f1bea8282e).
### Current behavior before PR:
When the flow reaches sale-order BIS3 export without an invoice in vals, Odoo crashes with:
AttributeError: 'NoneType' object has no attribute 'invoice_date'
This raises an RPC_ERROR and breaks the mail composer / send flow
### Desired behavior after PR is merged:
The intracom delivery-date override is only applied when invoice exists and has invoice_date.
If invoice is missing (sale-order export context), no crash occurs, the delivery node is still generated safely, and mail composer/report generation completes normally.
Invoice export behavior remains unchanged for valid invoice contexts.
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#250167This update resolves a problem where tests were failing due to incorrectly triggered event handlers. The fix ensures that test environments are properly cleaned up, preventing potential issues with resource usage and improving the stability of our core system. This change focuses on internal testing improvements.
Original PR description
Adapt tests failing due to keydown events being applied to the current active element. Community: https://github.com/odoo/odoo/pull/247137 Forward-Port-Of: odoo/enterprise#109316 Forward-Port-Of: odoo/enterprise#107286
This update resolves a technical issue within the Odoo Enterprise HR payroll module that prevented users from editing date inputs in a tour. The fix ensures the popover is displayed before the input field is cleared, restoring full functionality. This improves the user experience for payroll configuration.
Original PR description
With this additionnal step in tour, we ensure the popover is opened before clear the input. If we not wait for this, the input can be no longer editable. runbot-error-id~234440 Forward-Port-Of: odoo/enterprise#109346
This update resolves an issue where certain WebSocket routes were unintentionally causing user sessions to expire. By preventing session rotation for these specific routes, we ensure a smoother and more reliable experience for users. This improves stability and reduces potential disruptions.
Original PR description
Before this commit, calling `/websocket/peek_notifications` or `/websocket/update_bus_presence` could rotate the session. Since those routes are not called by the client, the cookie is unchanged on the client side, leading to expire sessions error later on. This commit ensure we won't rotate the sessions for those routes. opw-5445323 Forward-Port-Of: odoo/odoo#251496 Forward-Port-Of: odoo/odoo#250826
This update resolves an issue where the cash drawer wasn't opening when the cash details popup was accessed in the Italian Point of Sale (POS) system. The fix ensures that the cash drawer opens consistently, regardless of the printer type, improving the user experience for Italian POS operations. This was a simple missing function call.
Original PR description
When opening the cash details popup the cash drawer should be opened. It was not the case for the Italian fiscal printer. Steps to reproduce: ------------------- * Setup a Italian fiscal printer with cash drawer support * Open PoS * Open the cash details popup > Observation: The cash drawer does not open * Try to close the PoS session * Open the cash details popup > Observation: The cash drawer opens Why the fix: ------------ The cash drawer opening function was simply not called opw-5391094 Forward-Port-Of: odoo/enterprise#109155 Forward-Port-Of: odoo/enterprise#107987
This update fixes an issue where time formatting in reports and lists was inaccurate, consistently flooring the time value. The changes ensure time is rounded correctly based on its precision and allows for more flexible formatting options, including controlling the display of seconds.
Original PR description
The rounding of time was not correct. I was always flooring, but before the new duration the rounding was depending of the precision of the duration. The rounding has been restored as before and put…
The rounding of time was not correct. I was always flooring, but before the new duration the rounding was depending of the precision of the duration. The rounding has been restored as before and put in formatDuration. formatFloatTime has been modified to use formatDuration and now take the same options (specify the unit of time of the value). The graph view and list view didn't extract the otpions from the fields with widget. Now, they get the options and give them to the formatter. The widget was showing the seconds by default, but it doesn't match with the behavior of the DateTime widget. It has been changed and now the seconds are shown only if the options 'showSeconds' is true and it's false by default. The impacted views has been restored as before the original commit. The options of float_time widget couldn't take falsy values, now it can. an improvment has also been done: the popover on the float_time widget doesn't show up if the input value and the formattedValue are the same. followup of TASK-5347051 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug that prevented users from creating new resources within appointment bookings. The issue stemmed from an incorrect default value being set for the resource timezone, triggering a validation error. The fix ensures a proper timezone is assigned, preventing this error and improving the appointment booking process.
Original PR description
Steps to reproduce =============== 1. Open appointment of resource type 2. Create a new resource from resource tags. 3. Give the resource a name and save. ----> ValidationError will be shown. Issue…
Steps to reproduce =============== 1. Open appointment of resource type 2. Create a new resource from resource tags. 3. Give the resource a name and save. ----> ValidationError will be shown. Issue ===== When creating the new resource from the appointment form view, the value for the `tz` of the `appointment.resource` is `False`. Also, `tz` field is inherited from `resource.mixin` and is a related field as `resource_id.tz`. Therefore, when creating the `appointment.resource` with `tz` as `False` writes the related `resource.resource`'s `tz` field. As `tz` field is required field for the `resource.resource` table, the `ValidationError` is raised. Solution ======= After this commit, we give the default value to the timezone with fallback to current user's timezone or UTC which matches to the default value of `resource.resource`'s timezone field but with a side-effect of overwriting resource's timezone if somehow `default_resource_id` is provided. We also fix in parallel by making the timezone field `readonly` when invisible to avoid "saving" the `False` value for the tz. Task-5712786
This update resolves a technical issue preventing users from correctly selecting a cashier when opening the Point of Sale (POS) system. The problem stemmed from a renaming of a variable without corresponding updates, causing an error. This fix restores the original variable name, ensuring proper POS functionality.
Original PR description
Since this commit: https://github.com/odoo/enterprise/commit/52e2f216528bcb0e67844ac2164f647fee4a2a95 The clockState variable was renamed without modifying the other references. This causes a traceback when trying to select a cashier while opening the POS. This has now been fixed by restoring the previous variable name. Forward-Port-Of: odoo/enterprise#108665
This update fixes an issue where the 'Request Signature' option wasn't consistently appearing on form views, specifically within Timesheets and Projects. The change ensures the menu item only shows when a chatter is present, improving the user experience and ensuring all users can access this important feature.
Original PR description
****Behavior:**** **Current:** When selecting the cog menu on certain forms, the request signature item doesn't always show even though it should. The expected behavior of this menu item is to appear only on form views with a chatter, but the way the chatter's presence was verified is inconsistent. **Solution:** On form views with a chatter, we can check its presence directly from the viewArch using the selector from the compiler registry. **Steps to reproduce:** From Timesheets: - Go to Timesheets - Open a task - The cog menu will not contain "Request Signature" From Project: - Go to Project - Select a project and open a task - The cog menu will contain "Request Signature" opw-4817423 Forward-Port-Of: odoo/enterprise#109274 Forward-Port-Of: odoo/enterprise#97401
This update ensures that disabled user records are no longer incorrectly flagged as blacklisted when checking email communication. This prevents potential issues with email delivery for users who have been deactivated in the system. The change was made to address a previous bug and includes new tests for verification.
Original PR description
Same as https://github.com/odoo/odoo/pull/249466, but for v17 and with tests. > When computing wether the user is blacklisted, disabled records must be ignored. > > https://www.loom.com/share/41ea437477f8416f8b50f9ef979d82bf > > > --- > I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr > > @moduon MT-13153 OPW-5952301 Forward-Port-Of: odoo/odoo#250361
This update corrects a bug where internal users receiving ‘Signed Document’ emails were incorrectly directed to the public portal. Now, internal users automatically see the document preview, while the existing portal redirection for public users remains unchanged. This ensures a consistent and correct experience for all users.
Original PR description
Internal users opening the “Signed Document” email link were redirected to the portal instead of the document preview. Now they are redirected to the internal preview, while public users remain unchanged. task-5486043 Forward-Port-Of: odoo/enterprise#107079
This change corrects a display issue where upsell sale orders created from subscriptions incorrectly showed as "Quotation" in the preview. The fix ensures that upsell orders now display as standard sales orders, aligning with the presentation of the initial subscription. This improves clarity and consistency for users.
Original PR description
## Issue When creating and confirming an Upsell SO from a Subscription, the preview still shows the Sale Order as a "Quotation", which is inaccurate. <img width="1330" height="296" alt="5489970"…
## Issue
When creating and confirming an Upsell SO from a Subscription, the preview still shows the Sale Order as a "Quotation", which is inaccurate.
<img width="1330" height="296" alt="5489970" src="https://github.com/user-attachments/assets/cfff4c7a-fff7-4859-861b-c190dab9097d" />
## Steps to reproduce
1. Install *Subscription* (`sale_subscription`)
2. Create a Subscription S00001
- Any Customer
- Any Recurring Plan
- Any Product
3. Create and confirm the invoice for the subscription S00001
4. On the subscription S, click Upsell and confirm the resulting Sale Order S00002
5. On the Sale Order S00002, click Preview
6. **The title of the Sale Order is "Quotation - S000002". In the sale.order list view, the Sale Order is shown as a Sales order, just like the initial Subscription.**
## Cause
The title shown in the preview is defined here:
https://github.com/odoo/enterprise/blob/a4e2c7c7d3aa50c8b57668c9ca73f523a31a5c41/sale_subscription/views/sale_subscription_portal_templates.xml#L187-L195
The initial subscription falls into the `if` condition, which only shows the name of the SO. The upsell sale order is not considered as a subscription, as explained and showed here:
https://github.com/odoo/enterprise/blob/6bfd057b3d17ce8b266aa6dbd88ffef70ca634aa/sale_subscription/models/sale_order.py#L193-L201
The word *"Quotation"* shown in the preview is the `sale_order.type_name`", computed here:
https://github.com/odoo/enterprise/blob/6bfd057b3d17ce8b266aa6dbd88ffef70ca634aa/sale_subscription/models/sale_order.py#L227-L237
The term "Quotation" was chosen in https://github.com/odoo/enterprise/commit/14e5cff65affa888f33d4008d10a32e6992d3a39.
## Fix
Before this commit, an upsell would always be named *"Quotation"*. With this commit, upsells are now added to the `other_orders` variable in `_compute_type_name` and follow the same logic as other SO:
https://github.com/odoo/odoo/blob/a3bf9264ca25ec11b0c9742e142d2404cac6d261/addons/sale/models/sale_order.py#L797-L803
<img width="1316" height="308" alt="5479900_2" src="https://github.com/user-attachments/assets/7cfeb578-2870-43a6-a48b-ba0898718641" />
## Alternative
An alternative to this fix would be to update the condition used to display the name of the subscription in the preview (cf. first code snippet). This would probably result in removing the `sale_order.is_subscription` from the condition, as it is the part of the condition that upsell SOs do not meet.
opw-5489970
Forward-Port-Of: odoo/enterprise#109268
Forward-Port-Of: odoo/enterprise#106767This update resolves an issue where stock users with 'Own Documents Only' sales access were unable to open delivery orders. The fix avoids unnecessary access restrictions by computing the delivery description directly, rather than relying on complex rule configurations. This ensures stock users can perform their tasks without encountering access errors.
Original PR description
### Steps to reproduce: - Create a Stock User with access rights: - Sales: User: Own Documents Only - Inventory: User - With your admin: Create and confirm a sale order for 1 x a consumable. - With…
### Steps to reproduce:
- Create a Stock User with access rights:
- Sales: User: Own Documents Only
- Inventory: User
- With your admin: Create and confirm a sale order for 1 x a consumable.
- With the Stock User open try to open the delivery
#### > Access Error: Uh-oh! Looks like you have stumbled upon some top-secret records.
### Cause of the issue:
Sale users `Own Documents Only` are granted read access to the `sale.order` model which is restricted to the `sale.order`'s to which they are the designated sale person or no-one is due to this `ir.rule`: https://github.com/odoo/odoo/blob/d038b2c23b9f7c74d381e25276d00155bf89331e/addons/sale/security/ir_rules.xml#L44-L49 However, the read access of the sale order related to a stock move is required in order to compute its desciption:
https://github.com/odoo/odoo/blob/d038b2c23b9f7c74d381e25276d00155bf89331e/addons/sale_stock/models/stock.py#L26-L31 While this access is suppose to be provided:
https://github.com/odoo/odoo/blob/d038b2c23b9f7c74d381e25276d00155bf89331e/addons/sale_stock/security/ir.model.access.csv#L5 It is overriden by the `ir.rule`.
### Fix:
Since the `_compute_description` overrides rely on numerous independant models such as the `sale.order`, `purchase.order.line`, `product.supplierinfo`, `mrp.bom`, since the `picking_description` does not really carries sensitive informations and since parts of the computes already required to be put in `sudo` for similar reasons see 80c80505fabc4544e41f270169737218e47cad5a, it is preferable to compute the field in sudo rather than adding an `ir.rule` with true leaf on the `sale.order` model for the `stock.group_stock_user`.
opw-5929485
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#251471This update fixes an issue where users would need to refresh the application after installing a new language. The change clears all application caches when a language is installed, ensuring the new language is immediately available in the user preference settings. This provides a smoother and more intuitive experience for users.
Original PR description
Before this commit, after installing a new language, that language wasn't directly available in the selection field of the user preference form view. An extra reload was necessary to see the new language, which could confuse the user. This was due to the cache. As installing a language isn't a frequent operation, we simply clear all caches when this happens. task~5895416 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#251729
This update fixes an issue where long email addresses in the Point of Sale partner list were difficult to read due to awkward wrapping and inconsistent alignment. The changes include truncating long emails and adding a hover-over feature to display the full email address, ensuring a cleaner and more user-friendly experience.
Original PR description
Before this commit, long email addresses in the POS partner list would wrap awkwardly or expand the row height excessively, making the list difficult to read. Additionally, the vertical alignment between the text and the action buttons was inconsistent. This commit improves the Partner List UI by: - Truncating long email addresses - Adding a `title` attribute so the full email is visible on hover - Vertically centering all cell content to match the buttons. opw-5919153 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#247964
This update resolves an issue preventing users from modifying rounded corner settings in the website editor when using themes with unitless '0' values for border-radius. The fix ensures the editor correctly handles these values, allowing for seamless customization of rounded corners across different themes. This improves the user experience and flexibility of theme customization.
Original PR description
**Problem:** When using themes that define border-radius as unitless `0` (e.g., Anelusia theme) and attempting to modify the "Rounded Corners" value of any element through the website editor, the…
**Problem:**
When using themes that define border-radius as unitless `0` (e.g., Anelusia theme) and attempting to modify the "Rounded Corners" value of any element through the website editor, the following error occurs: "Cannot convert 'px' units into '' units !"
**Steps to reproduce:**
1. Install and activate the Anelusia theme (or any theme with unitless border-radius: 0)
2. Open the website editor
3. Select any element (e.g., a table in the footer)
4. Try to change the "Rounded Corners" field to any non-zero value
5. Observe the error: "Uncaught Promise > Cannot convert 'px' units into '' units !"
**Current behavior:**
The website editor throws a JavaScript error and prevents changing rounded corners.
**Expected behavior:**
Users should be able to modify rounded corners values without errors, regardless of whether the theme uses unitless or unit-based zero values.
**Cause of the issue:**
Some themes define border-radius variables as unitless `0` (e.g., `$border-radius: 0`). When the website editor's areCssValuesEqual() function in utils_css.js compares the new value (e.g., "10px") with the existing computed value ("0" - unitless), it attempts to convert between units. The getNumericAndUnit() function extracts the unit from "0" as an empty string "", then convertValueToUnit() tries to convert "10px" to "" unit. Since there's no conversion defined for "px" to "" (empty unit), convertNumericToUnit() throws the error.
**Fix:**
Add a special case in areCssValuesEqual() to handle unitless zero values before attempting unit conversion. When the first value is unitless "0", we compare the numeric values directly using Number.EPSILON, avoiding the unit conversion entirely. This allows proper comparison between unitless "0" and values like "10px" or "0px" without errors, while maintaining correct equality checks (0 equals 0px, but 0 does not equal 10px).
opw-5412414
Forward-Port-Of: odoo/odoo#246335This update resolves an issue where the Sendcloud shipping API required a minimum product weight of 0.00099. This commit ensures that product weights are always at least 0.001, preventing errors and ensuring accurate shipping calculations through the Sendcloud integration. It's a necessary adjustment to maintain reliable delivery processing.
Original PR description
The Sendcloud API do not allow parcel details to have a weight value less than 0.00099 . This commit makes sure the products weights are at least 0.001. ref: <img width="1850" height="689" alt="image" src="https://github.com/user-attachments/assets/10242315-3c4d-4670-b77d-8cb429e00891" /> Forward-Port-Of: odoo/enterprise#107676
This update resolves a test failure within the Belgian payroll module (l10n_be_hr_payroll_fix) by adding a temporary freeze to time calculations. This ensures the holiday attest test runs successfully, preventing potential disruptions to payroll processing for Belgian users. The change is a technical fix to maintain the stability of the system.
Original PR description
Addind freeze_time to Fix holiday attest test that failed on the runbot Forward-Port-Of: odoo/enterprise#107490
This update fixes an issue where clicking the 'More options' button in the HTML editor would cause the editor to lose focus. The fix ensures the editor remains focused after the button is clicked, improving the user experience. It also addresses a filtering problem within the powerbox, ensuring commands are correctly displayed.
Original PR description
**Issue 1:** Steps to Reproduce - Click on the More options button in the power buttons. - The powerbox opens, but the editor loses focus and the button receives focus. Description of the issue: -…
**Issue 1:** Steps to Reproduce - Click on the More options button in the power buttons. - The powerbox opens, but the editor loses focus and the button receives focus. Description of the issue: - After clicking the power button, the button becomes focused and the editor loses focus. Solution - When clicking the power button, after the command is executed in the click event, explicitly restore focus to the editable area so the editor remains focused. **Issue 2:** Steps to reproduce - Click More options in the Power Buttons to open the powerbox. - Start typing `heading`. Description of the issue: - The powerbox does not filter commands and continues to show all commands. Cause: - In `search_powerbox_plugin`, commands are filtered only when `shouldUpdate` is true. - `shouldUpdate` is set only when the powerbox is opened through `search_powerbox_plugin`. - Power Buttons open the powerbox via `powerbox_plugin`, so `shouldUpdate` remains false and filtering is not triggered. Solution: - Introduced `openSearchPowerbox` in `searchPowerboxPlugin`. - Updated the implementation to use this method instead of `openPowerbox` in `search_powerbox_plugin`. - Instead of opening the powerbox via `powerbox_plugin`, it is now opened via `search_powerbox_plugin`, ensuring `shouldUpdate` is set correctly and commands are filtered on keypress. task-5485088 Forward-Port-Of: odoo/odoo#249844 Forward-Port-Of: odoo/odoo#244454
This update addresses a recurring test failure related to the automatic focus of speakers during one-to-one calls. The team added safeguards to the test process, including sound assertions and additional checks, to reliably avoid race conditions. This resolves a previous runbot error and ensures consistent test execution.
Original PR description
Follow-up of https://github.com/odoo/odoo/pull/250174 PR above attempts to solve race condition of the following test: ``` @mail/discuss/call/call/auto-focus participant video in one-to-one call in…
Follow-up of https://github.com/odoo/odoo/pull/250174 PR above attempts to solve race condition of the following test: ``` @mail/discuss/call/call/auto-focus participant video in one-to-one call in chat window ``` Where the meeting view may not have been considered as open and thus mistakenly trigger the speaker auto-focus feature. However the test is still failing non-deterministically at the same step. While the previous fix sounds good in theory, this is insufficient. We couldn't reproduce the problem, but there are a few theories on what may cause the problem: "Join Call" has side-effect to auto-focus speaker, which might mistakenly be triggered later in test if executing very fast. To make sure this doesn't happen, test now asserts playing of call-join sound, which happens close to the initial auto-focus of the speaker. This commit also adds more intermediate assertions that should help awaiting proper time (thus avoiding race conditions) or help with further hints at what's wrong with this test: - properly check video stream is off visually when other participant stops the camera feed - click on active card should return to showing of 2 cards, before the other participant re-enables the camera feed in the meeting view - make use of `card:has(video)` in earlier assertions, instead of `card video`, to more easily distinct which step is problematic. The last one is very likely the issue, therefore we keep the original `card video` as this is more likely to hit with the same runbot error entry, in case the problem is still ongoing. Fixes runbot error 240554
This update fixes a problem where restarting the live chat bot after a page reload would cause duplicate actions. The fix removes a redundant command from the restart process, ensuring the bot functions correctly and consistently. This improves the user experience for live chat support.
Original PR description
Since [1], restarting the chat bot after reload could lead to multiple steps being executed at the same time. Steps to reproduce: - Go to the `/im_livechat/support/2` page. - Chat with the support bot until the end of the conversation. - Reload the page. - Click on the restart button. - Two question selections are displayed at the same time. This occurs because the bot starts from the `_toggleChatbot` field's `onUpdate` method. The `restart` method also calls `start` on the chat bot. To fix this issue, the call to `start` is removed from the `restart` method. [1]: https://github.com/odoo/odoo/pull/194399 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#251390 Forward-Port-Of: odoo/odoo#250623
This update fixes an issue where the cursor wasn't correctly navigating within long text blocks inside Odoo tables. Previously, users couldn't move up and down within multi-line text cells, jumping directly to the next cell instead. This change ensures accurate line-by-line navigation within table text, improving usability.
Original PR description
When navigating inside a table cell, if a single text node is rendered over several lines, the cursor up and down key go directly to the next cell instead of navigating to the (visually) previous or next line of text. This commit determines if the cursor position is within such positions inside a multi-line text node and prevents the table navigation if needed. Steps to reproduce: - Add a table with `/table` - Put a very long text (without paragraph splits) in the center cell, so that the text spans over several lines - Navigate with the up and down arrows => The cursor could not reach distinct lines within the text task-5417834 Forward-Port-Of: odoo/odoo#240764
This update addresses minor issues within the HTML editor and email functionality, primarily focused on improving usability and stability. Specifically, it removes unnecessary features like video support, streamlines the email composer, and ensures proper quoting of replies for a better user experience.
Original PR description
This PR only applies changes requested during the backport as this is the version of the original PR -------- Backport of fixes added in odoo/odoo#238694 - banners don't work in emails because of…
This PR only applies changes requested during the backport as this is the version of the original PR -------- Backport of fixes added in odoo/odoo#238694 - banners don't work in emails because of inline conversion, and we don't need them - video elements and iframes are also not supported, hence we can remove the plugin entirely - the highlight inside the composer is redundant with the footer separator - "edit" should not be a quick option for admins on other users' messages, instead reply is more appropriate - signatures should be shown when composing replies and forwards as well - images already embedded into the body of a message don't need to be shown as attachments as well - images shown in the composer don't need to be big and legible by default, users can click on them as needed - when the author has no email and there is no email from (log not on a fresh db for example), replying should be possible - recipients should not be recomputed in the composer unless the user selected a template using specific recipients. This avoids picking a bunch of specific recipients only to lose them when picking a template. - when sending a reply immediately without touching the body, the reply content should still be quoted task-5013894 Forward-Port-Of: odoo/odoo#251062 Forward-Port-Of: odoo/odoo#239679
This update corrects a technical issue where the ‘commercial_partner_id’ field in the Contacts app would trigger errors when using the IAP autocomplete. The change ensures this field is always populated, preventing validation problems and improving the user experience. This resolves a bug related to web_studio customizations.
Original PR description
Before this commit, when commercial_partner_id is on the view (possible with web_studio), the value by default is False. When the autocomplete widget is used, many fields could be autofilled and raise _onchange_verify_peppol_status, that requires this field. To avoid this issue we review that the value has been filled. Steps to Reproduce: 1. Open the Contacts app 2. Open Studio on the contact form view 3. Add the field commercial_partner_id to the form view (make it visible) 4. Create a new contact 5. Type a name 6. Select a suggestion from the IAP autocomplete 7. An error is raised immediately OPW-[5896847](https://www.odoo.com/odoo/action-4043/5896847) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#251590 Forward-Port-Of: odoo/odoo#248895
This update refactors how Odoo serves requests, moving key logic to the `router.py` module. This change improves the system's architecture and efficiency, streamlining the process of delivering Odoo's SaaS functionality. It doesn't directly impact users but supports ongoing improvements.
Original PR description
Now that the http module has been split, it makes sense to move the serving logic to the `router.py` module. These functions do not need to be exposed from a `Request` instance. Task-5926433