Tuesday, May 26, 2026
45 changes · saas-19.3
Enhancements to existing features
This update adds a new test to ensure the structure of payment data sent to our payment processor, Odoofin, remains consistent. This helps prevent unexpected changes on Odoofin's side and ensures that any necessary updates are made in both our system and theirs. It's a preventative measure to maintain reliable payment processing.
Original PR description
Add a test asserting the payment payload structure sent to Odoofin. The goal is to safeguard against unintended payload changes that are not handled on Odoofin's side by making such changes explicit during testing, and reminding developers that corresponding updates may also be required there. No task ID Forward-Port-Of: odoo/enterprise#118182 Forward-Port-Of: odoo/enterprise#117260
Resolved issues and error corrections
This update restricts the AI button's functionality within the website builder to only 'website.page' records. Previously, it was available across all website pages, leading to potential misuse. This change improves the website builder's usability and ensures AI features are applied appropriately.
Original PR description
Previously, the AI button was enabled across all pages in the website builder, including contexts where its usage is not applicable. This PR introduces the following changes: 1. Disable the AI button for pages not linked to "website.page" records with a tooltip explaining the restriction. 2. Hides the AI button when the sidebar is open in translation mode. task-6148588
Features or functions removed from Odoo
This update removes a plugin that was no longer needed for translating the website's table of contents. The core functionality is now handled automatically, improving efficiency. This change ensures the website's content remains consistent and accurate without adding complexity.
Original PR description
The plugin `TranslateTableOfContentOptionPlugin` is not needed anymore, the replication between the headers in the content of the `s_table_of_content` and its navbar is now completely handled by the `FieldChangeReplicationPlugin` plugin since a5f1af347b55da8662d6d6802b57e14aab574d78. The test is removed because it is not representative of real edition situation (the nodes it changes are not inside `contenteditable=true` or `o_savable`), and the test added in a5f1af347b55da8662d6d6802b57e14aab574d78 covers this usecase. task-5892636 Forward-Port-Of: odoo/odoo#265951 Forward-Port-Of: odoo/odoo#264325
This update resolves an issue where downloading signed documents through the Sign app would occasionally fail due to a compatibility problem with the pypdf library. The fix moves the document compression step to the correct object, ensuring compatibility with newer versions of pypdf and preventing errors. This improves the reliability of document downloads.
Original PR description
This [related PR] introduced a compression pass after calls to mergePage(). However in newer versions of pypdf (>=3.5.2), compress_content_streams() can only be called on pages of PdfWriter. An error would be raised when called on pages of a PdfReader. Steps to reproduce ----- 1. Run Odoo with pypdf>=3.5.2 2. Sign and download a document in the Sign app 3. Traceback occurs Fix ---- This commit moves the compression to the writer object, after the merged page has been added. Related pr: https://github.com/odoo/odoo/pull/261879 runbot-937761 Forward-Port-Of: odoo/odoo#266223 Forward-Port-Of: odoo/odoo#265304
This update simplifies the process of inserting dynamic fields within Odoo's Powerbox editor. It adds a familiar keyword, 'dynamic placeholder,' allowing users accustomed to the older method to easily locate and utilize the Dynamic Field command. This enhances usability and reduces potential confusion.
Original PR description
This PR adds a search keyword so users who were used to dynamic placeholder to insert the Dynamic Field command can still find it in powerbox. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266021
This update ensures that WhatsApp channel avatars in the sidebar accurately reflect the members who are part of the channel. Previously, adding a member would display a default avatar instead. This fix corrects a bug where the system wasn't correctly identifying the WhatsApp member for channels, improving the user experience.
Original PR description
WhatsApp sidebar avatars should be resolved from the channel's whatsapp member, not from an arbitrary non-self member. Before this fix, adding a member to a WhatsApp channel caused the default Discuss avatar to be displayed instead of the actual WhatsApp member's avatar. This happened because the correspondent was not correctly computed for channels of type whatsapp. task-[5879840](https://www.odoo.com/odoo/project/1519/tasks/5879840) Forward-Port-Of: odoo/enterprise#118012 Forward-Port-Of: odoo/enterprise#115745
This update fixes an issue where empty cells within styled tables weren't properly recognized during selection using the HTML editor's move handle. Now, all table cells, even those with placeholder content, are correctly identified and selectable, ensuring consistent and reliable table manipulation.
Original PR description
#### Description of the issue this PR addresses: - Empty `.o_table` cells containing only placeholder ZWS content were not considered visible - Full table selection via move handle failed to apply `o_selected_td` on styled empty cells #### Desired behavior after PR is merged: - Consider `.o_table` table cells visible Steps to reproduce: - Insert a table - Select it via move handle - Apply any color - Click the move handle again to select the table All table cells should have class `o_selected_td` task-6208949 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#263836
This update resolves an issue where PDFs with multiple XML attachments (using the /Kids structure) weren't being correctly extracted. Now, all XML attachments within these PDFs will be processed, ensuring bills and reports are complete. This improvement addresses a data accuracy problem.
Original PR description
Steps to reproduce: - From the accounting dashboard, upload a PDF containing intermediate /Kids nodes representing separate xml attachments Issue: No xml will be extracted, as result the bill will be empty. However, in the chatter pdf preview, the js pdf toolkit correctly show the xml attachemnts. Analysis: The PDF spec defines two ways to organize embedded files under /EmbeddedFiles in the document's name dictionary: - /Names: a flat array of pairs located directly under /EmbeddedFiles - /Kids: an array of child nodes, each of which carries its own /Names array. The extractor currently only handled the /Names case, not detecting embedded attachments in case of PDF using a /Kids tree. This change add lookup for both structures. opw-5929274 Forward-Port-Of: odoo/odoo#255798 Forward-Port-Of: odoo/odoo#252523
This update fixes a technical error that prevented users from correctly applying the 'Ship Later' option in the Point of Sale system. The issue stemmed from how the system handled date formatting, and the fix removes unnecessary conversions and adds validation to ensure correct date handling. This ensures the 'Ship Later' feature functions reliably.
Original PR description
Steps: = - Enable Allow Ship Later in POS configuration. - Open POS and add any product. - Proceed to the Payment screen. - Click Ship Later, clear the date field, and confirm Issue: = - A traceback occurs: `TypeError: this.state.shippingDate.toISODate is not a function` Reason: = - Here, shippingDate is a Luxon DateTime object when provided. when cleared, it becomes null, so converting it to ISO format is casung the error. Fix: = - Removed unnecessary conversion using `.toISODate()`. - Removed unnecessary hoot test. - Added validation on shippingDate to prevent selecting a past date. task-5406969 Forward-Port-Of: odoo/odoo#265822 Forward-Port-Of: odoo/odoo#239827
This update fixes a visual issue in the website builder where color options were missing for images with shapes. The fix ensures that users can now customize the colors of images with shapes when using the 's_cta_mockups' or 's_closer_look' snippets, enhancing the design flexibility.
Original PR description
Steps to reproduce: 1. Go to the website and enter edit mode. 2. Drop `s_cta_mockups` or `s_closer_look` snippet. 3. Click on any image that has a shape. Issue: The color picker option is missing for images with shapes in these snippets. Reason: These snippet templates do not include the `shapeColors` dataset on the image elements. task-5880905 Forward-Port-Of: odoo/odoo#265465 Forward-Port-Of: odoo/odoo#246249
This update fixes an error that occurred when the automated payroll update process ran after a customer contact was deleted. Specifically, the system was unable to find a reference to the deleted contact in a key data file. This prevented the payroll update from completing successfully, and this fix ensures the process continues to function correctly.
Original PR description
Currently, a traceback occurs when the cron "Payroll: Update data" runs after a referenced partner record has been deleted. Steps to reproduce the error: - Install ``l10n_us_hr_payroll`` module with…
Currently, a traceback occurs when the cron "Payroll: Update data" runs after a referenced partner record has been deleted. Steps to reproduce the error: - Install ``l10n_us_hr_payroll`` module with demo data - Switch to ``My US Company`` - Go to Contacts > Delete ``Internal Revenue Service (IRS)`` contact - Run the cron ``Payroll: Update data`` Traceback: ```py ValueError: External ID not found in the system: l10n_us_hr_payroll.res_partner_irs ``` ```py ParseError: while parsing /home/odoo/src/enterprise/ saas-19.3/l10n_us_hr_payroll/data/hr_salary_rule_data.xml:322, somewhere inside ``` https://github.com/odoo/enterprise/blob/21477b333f7a33cb582cd806236e4f9f8346d022/l10n_us_hr_payroll/models/hr_payslip.py#L12-L21 The issue occurs because the cron ``Payroll: Update data`` calls ``_get_data_files_to_update`` method, which loads the ``data/hr_salary_rule_data.xml`` file containing a reference to the deleted partner record at [1]. Since the external ID no longer exists, loading the XML file raises the traceback. [1]: https://github.com/odoo/enterprise/blob/21477b333f7a33cb582cd806236e4f9f8346d022/l10n_us_hr_payroll/data/hr_salary_rule_data.xml#L484 sentry-7496380516
This update corrects a restriction in the Hong Kong payroll module that was preventing employers from using multiple MPF account numbers under the same registration number. The change allows for valid multi-account configurations by validating duplicates based on the combination of registration number and employer account number. This ensures accurate tracking of employer MPF contributions.
Original PR description
An employer can legitimately hold multiple employer account numbers under the same MPF registration number. The previous constraint rejected any two MPF schemes sharing the same registration number, blocking valid multi-account configurations. Fix the validation to only restrict the duplicate based on the combination of registration number and employer account number. task-6232561 Forward-Port-Of: odoo/enterprise#118109
This update ensures that when a Cashdro payment line is cancelled, it's also fully deleted from the system, as expected. Previously, cancelled payments remained in a 'retry' state without being removed. This change improves data accuracy and simplifies Cashdro payment management.
Original PR description
Before this commit, if you tried to cancel and delete a Cashdro payment line by clicking the x, the payment would be cancelled but the line would not be deleted, just left in the 'retry' state. After this commit, the payment line is deleted after being cancelled as expected. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265772
This update resolves an issue where the undo function wouldn't work correctly after inserting a table of contents in the HTML editor. The fix prevents unnecessary history steps from being added, ensuring that users can reliably undo actions like inserting a table of contents without impacting other editing functions.
Original PR description
Problem: Undo does not work correctly after inserting a table of content when no paragraph follows it. Cause: `SelectionPlaceholderPlugin.onSelectionChange` clears attributes from the next base…
Problem: Undo does not work correctly after inserting a table of content when no paragraph follows it. Cause: `SelectionPlaceholderPlugin.onSelectionChange` clears attributes from the next base container and adds a history step whenever the selection changes. In the table of content case, this creates a loop: - Attributes are cleared and a history step is added. - Undo restores only the cleared attributes. - The selection falls back into the empty paragraph after the table of content. - `SelectionPlaceholderPlugin.onSelectionChange` runs again and adds another history step. As a result, undo never reaches the previous user action. Solution: Avoid adding a history step in `SelectionPlaceholderPlugin.onSelectionChange` when the current step is not modified by any user interaction. Steps to reproduce: - Write some text. - Insert a table of content using `/toc`. - Press Ctrl + Z. - Observe that nothing happens and the previously typed text cannot be undone. task-6216910 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#264743
A previous test in our meeting functionality was intermittently failing due to a timing issue. This update ensures the initial 'mark as read' action completes before subsequent steps, making the test reliable and preventing potential disruptions to the meeting workflow. This improves the overall stability of our messaging system.
Original PR description
The `test_04_meeting_view_tour` test sometimes fails. A race condition occurs between the initial mark as unread action, which may or may not be triggered depending on whether the thread composer has time to gain focus before the meeting view is opened, and the later mark as unread action triggered during the test. This commit ensures the initial mark as read action is completed before proceeding to the mark as unread steps, thus resolving the issue. runbot-239936 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#264662
This update resolves an issue where the VIES validation process was incorrectly triggered during tax return creation, leading to errors. The fix ensures that VIES validation only occurs for tax returns associated with partners requiring VAT, improving the accuracy of financial reporting. This prevents unnecessary errors and ensures compliance.
Original PR description
Vies validation should only occurs with moves having fiscal position with vat required Steps: - With base_vat, and european l10n like BE installed - Make a bill for a partner with no vat or invalid vat - Create a tax return - Open the return -> the 'check_partner_vies' fails opw-6200246 Forward-Port-Of: odoo/enterprise#117913
This update resolves an issue where the 'Caption' button within the HTML editor was not properly translated, preventing international users from accessing captions. This fix ensures all text within the editor is localized, improving the user experience for global customers.
Original PR description
Currently the "Caption" button in the HTML editor is not translatable. This commit fixes that. Forward-Port-Of: odoo/odoo#266002
This update resolves an issue where stock transfer widgets incorrectly displayed 'No package' tags for certain transfer types. The fix ensures accurate package identification, particularly after recent database upgrades, by providing a fallback mechanism when package history is unavailable.
Original PR description
# The bug When accessing a done transfer with two lines where one line has a result package ID and the other does not, the computed field `has_lines_without_result_package` returns `True`. This field…
# The bug When accessing a done transfer with two lines where one line has a result package ID and the other does not, the computed field `has_lines_without_result_package` returns `True`. This field is used in the `stock_package_m2m` widget to append a `No package` tag when a move has this field set. https://github.com/odoo/odoo/blob/eaa6c4352aec2be8519360c282f3f6504a2f263c/addons/stock/models/stock_move.py#L266-L269 https://github.com/odoo/odoo/blob/eaa6c4352aec2be8519360c282f3f6504a2f263c/addons/stock/static/src/widgets/stock_package_m2m.js#L9-L24 This works fine when package history exists, as it accesses the `package_ids` field to generate the tags. However, for recently upgraded databases, no package history is available. When the `_compute_package_ids` method runs, it attempts to access data from an undefined history record, triggering a traceback. https://github.com/odoo/odoo/blob/eaa6c4352aec2be8519360c282f3f6504a2f263c/addons/stock/models/stock_move.py#L271-L278 # The fix The fix is straightfoward: in `_compute_package_ids`, if a move is in the `done` or `cancel` state and has no package history, we fallback and populate `package_ids` using the same logic applied to states other than `done` or `cancel`. This behavior specifically targets and fixes issue for databases recently upgraded to v19. task: 6070541 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265032
This update fixes an issue preventing users from importing emissions data within the ESG module. The change allows the 'import' action to appear in the COG menu, even with the 'create' attribute disabled in the list view. This ensures users can easily access and manage their emissions data.
Original PR description
Before this commit, the "import" action of emissions in the ESG module was not visible in the COG menu. It is because the "create" attribute of the list view is disabled, which prevents the menu item from being displayed. With this commit, we override the standard behavior in this particular action, by allowing the import action to show up in the COG menu, even if the "create" attribute is disabled. version-19.1 Forward-Port-Of: odoo/enterprise#118004
This update corrects a bug where portal users could inadvertently delete documents they didn't own. The fix ensures that portal users can only delete documents they own, preventing unintended data loss during the standard cron archiving process. The change simplifies the code and improves stability.
Original PR description
Reproduce: with rpc call as portal user, you can archive documents you have access to. This is not desired as this may lead to records being deleted when the cron collects the trash, but we only wanted to support portal users deleting only records they own. What we did when calling toggle_active should be done for all calls to `write` with `active`. It also removes the need for `_raise_if_unauthorized_archive` and `_unlink_except_unauthorized`. Task-6205627 Forward-Port-Of: odoo/enterprise#118055 Forward-Port-Of: odoo/enterprise#116886
This update resolves an issue where Odoo branches were incorrectly inheriting VAT settings from their parent companies, leading to manual VAT adjustments. The change now defaults branches to no VAT, ensuring the parent company remains the key provider and simplifies branch operations. Key settings are also restricted to the base group for improved security.
Original PR description
Branches copied the parent's VAT, which made them their own signing entity and forced users to clear the VAT so the branch would reuse the parent's keys. Default branches to no VAT so the parent remains the key provider. Setting a VAT on a branch still exposes the key settings for the rare case separate keys are needed. Also restrict the key settings to base.group_system task_id - 6087168 Forward-Port-Of: odoo/enterprise#117986
This update resolves an issue where constant fields within signing documents were failing to populate correctly, leading to signing errors. The fix ensures that empty values from auto-field calculations are preserved, preventing the 'Some required items are not filled' error and improving the signing process. This ensures documents are properly populated during the signing workflow.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Create sign template. - Add a sign item with read only true and linked model and auto_value field set. - Send document for signing. - Try to sign the document. Issue: - Signing fails with "Some required items are not filled". - Constant readonly fields become empty during signing flow. Cause: - In `_populate_constant_items()`, the default field value was always replaced by `_get_auto_field_value()`. - When no reference document was set, `_get_auto_field_value() `returned an empty string. - This caused an empty value to be stored in `sign.request.item.value`. Solution: - Keep the default field value when auto-field resolution returns an empty string. - Only replace the value when a valid auto-field value is found. task-6229776 Forward-Port-Of: odoo/enterprise#118298 Forward-Port-Of: odoo/enterprise#117880
This update resolves an issue where a system error was incorrectly triggering a fallback mechanism in the IoT service. The fix ensures that errors related to failed longpolling requests are only flagged when the request wasn't intentionally aborted, improving system stability and reliability. This prevents unnecessary service interruptions.
Original PR description
In odoo/odoo#260931, new logic was added to raise an 'unreachable' error in the case where a longpolling listen request failed. This error was then used by the IoT HTTP service to fallback to a websocket listener. However, due to an oversight this 'unreachable' error was also being triggered whenever the longpolling listen request was aborted, which happens whenever a new listener is added. This commit fixes the issue by checking the error type and only sending the 'unreachable' error if the request was not aborted. opw-6175686 Forward-Port-Of: odoo/enterprise#117947 Forward-Port-Of: odoo/enterprise#117905
This update resolves a problem where users couldn't link invoices to the chatter feature in Odoo. The fix prevents a security check from failing when copying attachments, ensuring users with appropriate permissions can successfully link documents. This improves the usability of the chatter feature for sales and accounting teams.
Original PR description
**Steps to reproduce:** 1. Create user with role: User. Sales: Administrator, Accounting: Administrator and Documents: System Administrator. 2. Create a SO, create invoice, confirm, and send. 3. Now…
**Steps to reproduce:** 1. Create user with role: User. Sales: Administrator, Accounting: Administrator and Documents: System Administrator. 2. Create a SO, create invoice, confirm, and send. 3. Now go back to the SO, and try to link the INV document to the chatter. **Cause:** When linking an existing document to the composer, the underlying attachment is copied. If the source attachment is bound to a specific field (e.g., `res_field = 'invoice_pdf_report_file'`), the `copy()` operation duplicates this field reference. Odoo's native security checks then attempt to verify access to that specific field on the target model (`mail.compose.message`). Because the composer does not have this field, the check fails and throws an AccessError, even if the user has full rights to the source document. **Solution:** Explicitly set `"res_field": False` during the copy operation. This strips the original field binding, cleanly converting the file into a standard, generic chatter attachment for the composer without bypassing the standard security framework. opw-5916364 Forward-Port-Of: odoo/enterprise#107723
This update resolves an issue where Odoo's Google Calendar sync process would silently fail when updates were made to recurring events, specifically when new attendees were added or start times were changed. The fix prevents errors from occurring and ensures more reliable synchronization between Odoo and Google Calendar, improving overall event management.
Original PR description
When a recurrence is updated in Google Calendar simultaneously with a new attendee and a changed start time, Odoo silently logs MissingError during the post-commit Google API callback Steps to reproduce: 1. Have a recurring event already synced between Odoo and Google Calendar 2. In Google Calendar, open the recurrence and edit "all events": - Add a new attendee - Change the start time 3. Trigger a Google Calendar sync 4. MissingError exceptions appear in server logs, one per event in the recurrence opw-6024835 Forward-Port-Of: odoo/odoo#265247
This update eliminates a persistent warning message related to background workers in the Odoo system. The warning was deemed confusing and redundant, as a new user interface design already addresses the underlying issue. This change improves the overall user experience and reduces potential confusion.
Original PR description
Those warning are considered as cumbersome and new tabs will work anyway. Forward-Port-Of: odoo/odoo#266060
This update corrects a bug where calls were not accurately reflecting open tickets associated with their parent partners. Previously, a call's ticket count didn't include tickets linked to child partners. Now, all open tickets related to a call, including those on child partners, are correctly counted, providing a more complete view of support activity.
Original PR description
Unlike most of *_count fields on res.partner, for example ticket_count, open_ticket_count didn't take into account of its child partners. To reproduce: 1. create parent parent P and child partner C 2. create a ticket for partner C and put it in a unfold stage 3. call partner P and open form view of this call the open ticket count on the smart button is 0 instead of 1 In this commit, we change it that when a child partner has open tickets, they will also be counted as parent partner's. Forward-Port-Of: odoo/enterprise#118102 Forward-Port-Of: odoo/enterprise#115303
This pull request addresses minor inconsistencies in the Polish e-invoice (l10n_pl_edi) export format, specifically related to a flag that must always be '1'. It also clarifies that the 'KursWaluty' (currency course) field is optional when it matches the standard PLN currency. These changes ensure compliance with Polish tax regulations.
Original PR description
Legal ref: https://ksef.podatki.gov.pl/media/4u1bmhx4/information-sheet-on-the-fa-3-logical-structure.pdf
- KursWaluty is optional and doesn't need to be included if it's the same as PLN.
- The following flags accept only "1" as a valid value.
See their type being etd:TWybor1:
http://crd.gov.pl/wzor/2025/06/25/13775/schemat.xsd
http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2020/07/06/eD/DefinicjeTypy/ElementarneTypyDanych_v7-0E.xsd
```xsd
<xsd:simpleType name="TWybor1">
<xsd:annotation>
<xsd:documentation>Pojedyncze pole wyboru</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:byte">
<xsd:enumeration value="1"/>
</xsd:restriction>
</xsd:simpleType>
```
Forward-Port-Of: odoo/odoo#262462This update corrects a previous issue where CSV imports incorrectly used locale-specific separators. Now, CSV files automatically use the correct separators based on the user's locale, while other file types revert to standard English formatting. This ensures consistent and accurate data import across all users.
Original PR description
Fixes an issue from https://github.com/odoo/odoo/pull/248233 where locale-based separators were incorrectly applied to all file imports. The model-wide defaults have been restored to English formatting. To handle edge cases where a user re-uploads a file without triggering a model reset, the system now explicitly resets and recalculates the separator options on every upload (applying locale settings for CSVs, and English defaults for others). opw-6233955
This update fixes an issue where long text in m2m avatar fields was being cut off, creating a poor user experience. The change adds a 'truncate' class to ensure text is neatly cut off with an ellipsis when it exceeds the display area, improving visual consistency.
Original PR description
Currently, the m2m tags avatar field does not have the truncate class for the spans. When the text is too long, it overflows and the rest is cut off. This commit adds the truncate class to the spans of the m2m tags so that the text is truncated with an ellipsis when it exceeds the available space. task-4809319 Before: <img width="322" height="189" alt="c5f23b6aee6f63982f530c2e6a641d21" src="https://github.com/user-attachments/assets/b50fc70d-4d21-4023-8838-460f060a98fb" /> After: <img width="310" height="167" alt="5ccf4bb07603a3d8c50d3763bd112f6d" src="https://github.com/user-attachments/assets/fa7e4167-98d8-47d7-a1e2-6639da8e5d05" /> --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265947 Forward-Port-Of: odoo/odoo#256817
This update fixes an issue where long text in m2m tags' avatar fields would overflow and be cut off. By adding a 'truncate' class, text now automatically displays with an ellipsis when it exceeds the available space, providing a cleaner and more user-friendly experience.
Original PR description
Currently, the m2m tags avatar field does not have the truncate class for the spans. When the text is too long, it overflows and the rest is cut off. This commit adds the truncate class to the spans of the m2m tags so that the text is truncated with an ellipsis when it exceeds the available space. task-4809319 https://github.com/odoo/odoo/pull/256817 Forward-Port-Of: odoo/enterprise#118113 Forward-Port-Of: odoo/enterprise#112590
This update optimizes how Odoo tracks subscription usage, leading to faster reporting and a smoother experience for users managing subscriptions. The change addresses a performance bottleneck related to query counts, ensuring the system remains responsive under normal usage. This improves the overall efficiency of the subscription module.
Original PR description
runbot-163667 Forward-Port-Of: odoo/enterprise#117266
This update resolves a visual bug in email templates where the horizontal padding on a banner block was lost after saving and reloading the template. The issue stemmed from how the system processed CSS styles, specifically with variable references. By using explicit longhand padding properties, the padding is now consistently applied, ensuring the banner looks correct.
Original PR description
Problem: In email templates, adding a banner/info block and saving then reloading causes the horizontal padding to be lost and the icon to become misaligned. Cause: During save, `convert_inline`…
Problem: In email templates, adding a banner/info block and saving then reloading causes the horizontal padding to be lost and the icon to become misaligned. Cause: During save, `convert_inline` processes the content via `_normalizeStyle`, which iterates over `CSSStyleDeclaration` using index-based iteration. This only yields longhand properties (e.g. `padding-left`, `padding-top`), never shorthands like `padding`. When the shorthand contains `var()` references (e.g. `padding: var(--y) var(--x)`), the browser cannot resolve the longhands and leaves them empty, so they are silently dropped during style extraction. Adding shorthand support to the iterator was not viable, as the rest of the pipeline expects longhand-only styles, and safely converting `padding: var(--y) var(--x)` to longhands is not possible without first resolving the variables. Solution: Replace the `padding` shorthand in the banner template with explicit longhand properties (`padding-top`, `padding-bottom`, `padding-left`, `padding-right`). Steps to reproduce: 1. Open an email template 2. Add a banner/info block 3. Save the template 4. Reload the page 5. Observe horizontal padding is lost and icon is misaligned task-6230530 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265756
This update resolves an issue preventing users from editing tracker codes within the website. The previous code used an outdated styling method that hid the buttons, rather than the intended 'd-none' class. This change ensures the buttons are correctly displayed and functional.
Original PR description
When interactions were introduced, the buttons for link tracker edition were no longer hidden by inline style, but with the class "d-none". Since there was still "display: none" as an inline style in the .xml, the buttons were never shown and the user could not edit the link code. This commit replaces the inline style by the class d-none, since it is a better practice. task-4531974 Forward-Port-Of: odoo/odoo#242481
This update fixes inconsistencies in how Odoo handles HTML parsing, particularly related to older versions of libxml2. The changes ensure consistent HTML output across different versions, improving the reliability of email templates and reports. It also addresses stricter type checking introduced in newer versions of lxml and libxml2.
Original PR description
## [FIX] core: lxml compatibility v2.14.0+ (HTML parsing) In version 2.14.0, libxml2 fixed a long standing quirk in its HTML handling where it always implies `<p>` start tags [1]. As a result, there…
## [FIX] core: lxml compatibility v2.14.0+ (HTML parsing) In version 2.14.0, libxml2 fixed a long standing quirk in its HTML handling where it always implies `<p>` start tags [1]. As a result, there is a difference in behavior between pre and post 2.14.0 produced HTML when no start tag is provided: - pre: always has a `<p>` tag - post: depending on the case, could have either a `<span>` or `<p>` tag. This commit introduces a monkeypatch of the lxml's HTML parser when built with libxml2 2.14.0+ to maintain a similar behavior with older versions. [1]: https://gitlab.gnome.org/GNOME/libxml2/-/commit/8cf6129bbd836e666e7eda8c9e61c00387ae388b ## [FIX] base,l10n_it_edi: catch TypeError/ValueError for lxml 6+ compat Updates exception handling to account for stricter type checking introduced in lxml 5/6 and libxml2 2.12+. Note: Ubuntu 26.04 (Resolute) provides lxml 6.9.2/libxml2 2.15 while Debian Trixie has lxml 5.4.0/libxml2 2.9.14. Don't be fooled by the version `2.12.7+dfsg+really2.9.14-2.1+deb13u1` which actually means that Debian has reverted/held back the core engine to 2.9.14 while adding commits from 2.12.7. Forward-Port-Of: odoo/odoo#259348
This update fixes a visual issue in the termination fees report for the Belgian payroll module. The report layout was misaligned when the notice duration was shorter than expected. The fix dynamically adjusts the layout to ensure a clean and professional appearance, improving the user experience.
Original PR description
**Steps to Reproduce:** 1. Generate a termination slip for an employee 2. The generated payslip pdf layout looks clumsy and misaligned. **Bug Cause:** 1. The notice duration has rowspan="3" expecting 3 lines. When there are less than 3 lines, the following rows are affected and misaligned. 2. The border is missing. **Solution:** Added dynamic sizing for notice duration instead of static rowspan="3". Used index instead of line_count for both notice duration and banks to stay consistent and simple. Added table-bordered class as borders are not automatically applied like in previous versions. **Task:** 6193558 Forward-Port-Of: odoo/enterprise#118180 Forward-Port-Of: odoo/enterprise#116627
This update allows users to input HS codes for consumable products within the stock delivery process. Previously, this information was unavailable, which could cause issues when shipping products internationally where HS codes are often required. This change ensures compliance and streamlines the delivery process for exported goods.
Original PR description
Commit 20c3aa9b618b3 moved the fields `hs_code` and `country_of_origin` to a view block only visible if Lots/Serial setting is activated and if the product is tracked (is_storable=True). This is an issue as we may want to delivery a consumable abroad. An HS code may be required but there is no possibility to fill it. 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#266371
This update fixes an issue where the quantity to produce was incorrectly reset to zero after generating a lot from a work order. The fix ensures the quantity remains accurate, preventing confusion and errors in production tracking. This improves the reliability of the manufacturing process.
Original PR description
Step to reproduce: - Create a MO with a lot tracked product (enable it in settings) and a work center - Put the quantity to produce to more than 1 - Confirm the MO - Use the smart button to go to the Shop floor - Click on the three dots and click on "Register production / serial" - Put the quantity to produce to 1 and click on "Generate lot" - The quantity to produce is updated to 0, which is not correct, it should stay to 1 Cause: The quantity to produce was not saved before generating the lot, so after the reload triggered by the generation of the lot, the quantity to produce was reset to the last saved value, which is 0. Task-6158833 Forward-Port-Of: odoo/enterprise#117067
This update fixes an issue where address autocomplete wasn't working correctly for countries using an extended address format. The fix ensures the system correctly identifies and utilizes city information, improving address completion accuracy. This enhances the user experience when entering addresses.
Original PR description
Some countries uses the extended version of address, which in particular uses a model to store city information instead of a simple char. In that case, the autocomplete does not work properly as it will try to set that char "city" instead of the Many2one "city_id". task-4588240 Forward-Port-Of: odoo/odoo#265060
This update resolves a test failure related to importing partner and bank account data for Italian reporting. The team restored a previous test data state, ensuring the tests now pass correctly and maintaining the stability of the Italian reporting functionality. This ensures accurate reporting for Italian businesses.
Original PR description
The related PR brings a data change in a test file that is used here. We bring back the state of that data in the test class, so that the tests don't fail anymore. Community PR: odoo/odoo#254505 Task [link](https://www.odoo.com/odoo/project.task/6046189) task-6046189 Forward-Port-Of: odoo/enterprise#117514 Forward-Port-Of: odoo/enterprise#112794
This update resolves a validation error that occurred when freezing or converting spreadsheets with group-based access. The issue stemmed from incorrect propagation of group IDs, preventing successful document operations. Now, group access is correctly handled during these processes, ensuring reliable functionality.
Original PR description
Current behavior before PR: - Freezing a spreadsheet or converting it to XLSX with group-based access in the sharing list triggered a validation error. - The group_id was not properly propagated when creating the new document, resulting in invalid access records and failed operations. Desired behavior after PR is merged: - Group-based access is correctly handled and propagated to the newly created document during freeze and conversion. - This prevents the validation error and ensures the operation completes successfully. Note: - Group access can still be modified independently after sharing. Since both flows are independent, this commit does not enforce full consistency but removes the unnecessary validation error. Task: [6146248](https://www.odoo.com/odoo/project/2328/tasks/6146248)
This update improves the speed of creating taxes in Odoo, particularly for systems with a large number of transactions. Previously, a check to ensure a tax wasn't already in use slowed down the process. This change simplifies the creation process by skipping this check, resulting in faster tax creation times.
Original PR description
On large databases (with millions on move lines), creating a tax can become very slow because of the consistency check that validate that the tax is not used on move line of another company. As there could not be any usage of a tax before its creation, we simply skip that check on creation. opw-5914312 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260592
This update resolves an issue where report totals were incorrectly duplicated in headers when comparison mode was enabled and totals were shown below sections. Now, values appear only in the line itself, ensuring cleaner and more accurate report displays in comparison mode.
Original PR description
Right now when you expland a section in comparison mode like in the Balance Sheet and P&L, if "Add total below sections" is enabled in the report then it shows in both the header and totals sections. This commit clears up that by only showing the value in the line when it's unexpanded, but once it is expanded it is hidden. task-6190986 Forward-Port-Of: odoo/enterprise#116479
A recent test failed because the system wasn't correctly assigning the necessary user group for tracking production lots. This change ensures that the 'lot_id' field is displayed during testing, regardless of whether demo data is present. This resolves a technical issue that could have impacted future development.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Run `test_reservation_method_for_outgoing` without demo data. Issue ----- > AssertionError: 'lot_id' was not found in the view Cause ----- The `lot_id` field is only rendered if the current user has the `stock.group_production_lot` group. This is only default when demo data is installed. Solution -------- Add the group to the current user in `setUpClass`. runbot-243588 Forward-Port-Of: odoo/odoo#266320 Forward-Port-Of: odoo/odoo#266052
This update corrects a formatting error in invoices generated by Odoo. Specifically, invoices with large numbers were displaying extra decimal places in the PDF output. The fix reduces the precision calculations to prevent these 'parasite digits' and ensure accurate invoice presentation.
Original PR description
Issue: - Create an invoice with a line having a price of `528,000,000.00` - Print the invoice -> pdf displays `528,000,000.000001` Cause: In `value_to_html` from `ir.qweb.field.float`, we compute the maximum precision that we can get from the value, to avoid parasite digits. The maximum is 15, so if a number has 11 digits, we won't ask for a precision higher than 4. But in `float_round`, they multiple the value with its precision, then add `epsilon` (a small value). So we're now working with a 16 digits float, which is what we want to avoid. Solution: Reduce the maximum precision from one digit before calling `float_round`. opw-6012129 Forward-Port-Of: odoo/odoo#266209 Forward-Port-Of: odoo/odoo#260955