Wednesday, May 27, 2026
15 changes · saas-18.3
Resolved issues and error corrections
This pull request updates the core spreadsheet component within Odoo. It includes fixes related to data export formulas, handling of spreadsheet ranges, and improvements to pivot table functionality. Additionally, it incorporates new skills related to Claude AI testing and review.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/fc3445633c [REL] 18.3.49 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/fc3445633c [REL] 18.3.49 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/e174b48022 [FIX] formulas: add IFERROR second argument when exporting data [Task: 5993405](https://www.odoo.com/odoo/2328/tasks/5993405) https://github.com/odoo/o-spreadsheet/commit/ae0a2d6196 [FIX] range: correctly handle unbounded ranges on row/col changes [Task: 6167358](https://www.odoo.com/odoo/2328/tasks/6167358) https://github.com/odoo/o-spreadsheet/commit/141b73bf40 [FIX] pivot: unused pivot detection with composed formula [Task: 6105894](https://www.odoo.com/odoo/2328/tasks/6105894) https://github.com/odoo/o-spreadsheet/commit/7efcbdf6ed [FIX] pivot: unused pivot detection with calculated measure [Task: 6105894](https://www.odoo.com/odoo/2328/tasks/6105894) https://github.com/odoo/o-spreadsheet/commit/b98b4452aa [IMP] claude: add review skill [Task: 6223095](https://www.odoo.com/odoo/2328/tasks/6223095) https://github.com/odoo/o-spreadsheet/commit/3a2d803b5d [IMP] claude: add testing skill [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/b019a59681 [IMP] claude: add CLAUDE.md file [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update resolves a problem where double-clicking images in the Media Dialog triggered multiple actions, causing performance issues. A simple flag has been added to ensure that the media flow is only processed once during a single click, improving the user experience and stability.
Original PR description
Before this commit: When double-clicking an image in the Media Dialog, the onClickAttachment method was executed twice, causing the media flow to be processed multiple times. After this commit: The issue is fixed using a boolean flag: isProcessingClick. Initially, the flag is set to false. When the first click starts, it is updated to true. If another click occurs during the same flow (e.g during a double click), isProcessingClick is already true, so the function immediately returns and prevents the action from being executed multiple times. task-6033320 Forward-Port-Of: odoo/odoo#254790
This update fixes an issue where quality alerts weren't being created when incoming emails were processed without a company assigned. The fix ensures that a default company ID is used, preventing errors and guaranteeing that all email-based quality alerts are correctly recorded. This improves the reliability of our quality tracking system.
Original PR description
Steps to reproduce 1. Install quality 2. Create an incoming email server 3. Go to Quality > Configuration > Quality Teams > Team > add alias email 4. Do not fill the company field 5. Send email to this alias 6. Fetch emails from incoming email server Issue: - Record is not created in the quality alert Root cause: - For the Quality alert model, the field `company_id` is required, but while we fetch emails We haven't set the `company_id` on the quality alert team, resulting in trying to insert a null value on the quality alert model. Solution: - Give a default value to company_id. - Raise a validation error on not having a company_id - Update alias default values on changing company_id opw-5917791 Forward-Port-Of: odoo/enterprise#109947
This update resolves an issue where the website editor would become unresponsive after a failed save attempt, leading to keystrokes being ignored. The fix ensures the editor remains in a consistent state, preventing frustrating user experiences and data inconsistencies. This improves the overall reliability of the website editor for our users.
Original PR description
When a save fails (for example due to a required field), the editor stays open, but some transient editor classes may already have been removed from the DOM.
This leaves the editor in an inconsistent state and can trigger a weird flow while making changes.
For example, as a result, users may see every second keystroke ignored after a failed save.
Steps to reproduce:
- Open a product page in website editor
- Remove the product name
- Click save
- The expected popover is shown ("Operation cannot be completed")
- Type again in the product name field => Every second keystroke is ignored (rollbacked actually).
task-5190459
Forward-Port-Of: odoo/odoo#263568This update resolves an issue where CFDI (Mexican electronic invoice) documents were being generated with incorrect length limits for key attributes like 'Folio' and 'Serie'. The values were swapped, which caused invalid documents. This fix ensures that all generated CFDI documents are compliant and accurate.
Original PR description
Issue: length limits for attributes `Folio` and `Serie` of the `<cfdi:Comprobante>` elements were swapped, which could result in generation of invalid documents. Solution: swapping the values. This should not affect anything for existing valid documents. task-6046738 Forward-Port-Of: odoo/enterprise#118105 Forward-Port-Of: odoo/enterprise#116955
This pull request updates the core spreadsheet component within Odoo. It includes several bug fixes and improvements related to formula handling, range calculations, and pivot tables, ensuring accurate data representation and calculations. The update also incorporates new skills and documentation for the Claude AI assistant.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/fc3445633c [REL] 18.3.49 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/fc3445633c [REL] 18.3.49 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/e174b48022 [FIX] formulas: add IFERROR second argument when exporting data [Task: 5993405](https://www.odoo.com/odoo/2328/tasks/5993405) https://github.com/odoo/o-spreadsheet/commit/ae0a2d6196 [FIX] range: correctly handle unbounded ranges on row/col changes [Task: 6167358](https://www.odoo.com/odoo/2328/tasks/6167358) https://github.com/odoo/o-spreadsheet/commit/141b73bf40 [FIX] pivot: unused pivot detection with composed formula [Task: 6105894](https://www.odoo.com/odoo/2328/tasks/6105894) https://github.com/odoo/o-spreadsheet/commit/7efcbdf6ed [FIX] pivot: unused pivot detection with calculated measure [Task: 6105894](https://www.odoo.com/odoo/2328/tasks/6105894) https://github.com/odoo/o-spreadsheet/commit/b98b4452aa [IMP] claude: add review skill [Task: 6223095](https://www.odoo.com/odoo/2328/tasks/6223095) https://github.com/odoo/o-spreadsheet/commit/3a2d803b5d [IMP] claude: add testing skill [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/b019a59681 [IMP] claude: add CLAUDE.md file [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) Co-authored-by: Florian Damhaut (flda) <flda@odoo.com> Co-authored-by: Anthony Hendrickx (anhe) <anhe@odoo.com> Co-authored-by: Alexis Lacroix (laa) <laa@odoo.com> Co-authored-by: Lucas Lefèvre (lul) <lul@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya (rmbh) <rmbh@odoo.com> Co-authored-by: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Rémi Rahir (rar) <rar@odoo.com> Co-authored-by: Pierre Rousseau (pro) <pro@odoo.com> Co-authored-by: Vincent Schippefilt (vsc) <vsc@odoo.com> Co-authored-by: Marceline Thomas (matho) <matho@odoo.com>
This update resolves an issue where deleting an action linked to an inactive filter caused an error. The change ensures that inactive filters are also removed during action deletion, maintaining data consistency and preventing unexpected errors. This improves the overall stability and reliability of the system.
Original PR description
How to reproduce: - Delete an action linked to an inactive user-defined filter. - Go to the User-Defined menu, - Show inactive filters (with "Archived filter") - Got a MissingError. Explanation: odoo/odoo#156622 fixes an inconsistency when deleting an action, but the reviewer was "amorti" so he (I) forgot to account for inactive "ir.filters". Add active_test=False to ensure inactive "ir.filters" are also removed. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262195
This update ensures all date displays in the Point of Sale module consistently use Odoo's standard format, regardless of the user's device. Previously, dates were displayed based on local device settings, leading to potential inconsistencies in reports and receipts. This change improves clarity and accuracy for users.
Original PR description
Why this commit: --- There are two instances in version 17.0 where dates use toLocaleString(), which relies on the device's local format instead of the Odoo-configured format. Since Odoo already…
Why this commit: --- There are two instances in version 17.0 where dates use toLocaleString(), which relies on the device's local format instead of the Odoo-configured format. Since Odoo already defines a standard date format, all toLocaleString() usages in pos should be replaced to ensure consistency. Starting from version 17.0, cash in/out receipts and the sales report use the local device time format. This commit updates those references and aligns them with the Odoo-configured date format. During forwardporting the fix in version 19.0 needs to be added to [base.js](https://github.com/odoo/odoo/blob/0352c5e8543b75083cf555c3d5b4f164f949b465/addons/point_of_sale/static/src/app/models/related_models/base.js#L64-L69). As formatDateOrTime function is used in the [reciept header](https://github.com/odoo/odoo/blob/0352c5e8543b75083cf555c3d5b4f164f949b465/addons/point_of_sale/static/src/app/screens/receipt_screen/receipt/receipt_header/receipt_header.xml#L13) printing date on all reciepts. After this commit: --- <img width="947" height="982" alt="image" src="https://github.com/user-attachments/assets/2d9e4199-75dd-40ea-aeb1-27401c9022f3" /> All date references consistently use the Odoo-configured date format. OPW: 6087341 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#265846 Forward-Port-Of: odoo/odoo#259112
This update resolves an issue where certain product categories were incorrectly displayed on Website 1, leading to a 'Not Found' error. The fix ensures that categories are only shown to users on the current website, improving the user experience and preventing broken links. This change was made to maintain consistent and accurate product listings.
Original PR description
Steps to produce: --- - Install `website_sale` with demo data. - Go to `website > ecommerce > products > ecommerce categories`. - Open `Desks/Components` category > Set website to `My website 2`. -…
Steps to produce: --- - Install `website_sale` with demo data. - Go to `website > ecommerce > products > ecommerce categories`. - Open `Desks/Components` category > Set website to `My website 2`. - Open the shop page on website > Click on Desks category. Issue: --- - The Components subcategory is still displayed on Website 1. - Clicking on it leads to a Not Found page since the category is not assigned to that website. Root cause: --- - At [1], In the category filmstrip template, subcategories are fetched without filtering based on website access. - As a result, categories restricted to another website are still shown. Solution: --- - Filter categories using the `can_access_from_current_website` method to ensure only categories accessible from the current website are displayed. [1]https://github.com/odoo/odoo/blob/900fc043064216c5943ea07392d8120be7b50b63/addons/website_sale/views/templates.xml#L758-L769 opw-6159549 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#262410
This update corrects an issue where invoices generated as 'proforma' were missing the expected header in PDF documents. The fix ensures that invoices are correctly labeled as 'proforma' during preview and in the final PDF, regardless of whether the invoice has been sent to the customer. This ensures accurate invoice presentation and customer communication.
Original PR description
***Steps to reproduce*:** - Create and confirm an invoice. - Open the invoice preview and use the Print option to generate the PDF. - Send the invoice to the customer. ***Observed behavior*:** - In…
***Steps to reproduce*:** - Create and confirm an invoice. - Open the invoice preview and use the Print option to generate the PDF. - Send the invoice to the customer. ***Observed behavior*:** - In the preview, the header is displayed as *Proforma*. - Before sending the invoice, the downloaded PDF from the Print option does not contain the *Proforma* header. - After sending the invoice, the preview correctly no longer shows the *Proforma* header, but the Print PDF output also continues without the expected behavior. ***Cause*:** - The *Proforma* header should be displayed when a confirmed invoice has not yet been sent to the customer. - Once the invoice is sent, the document should display the normal invoice header instead. - The PDF generation flow from `action_print_pdf` did not correctly pass the proforma context based on whether the invoice had already been sent. ***Fix*:** - Update the functional logic in `action_print_pdf` to use: `with_context(proforma_invoice=not self.invoice_pdf_report_id)` - This ensures that invoices not yet sent to the customer are generated as *Proforma* invoices. - Once the invoice has been sent, the PDF is generated with the normal invoice header instead. opw-6169132 Forward-Port-Of: odoo/odoo#265825
This update prevents Nemhandel from generating OIOUBL XML files for users who do not have a VAT number. Previously, this could lead to unnecessary XML generation and potential compliance issues. This change ensures that Nemhandel functionality is only available to users who meet the required VAT criteria.
Original PR description
Users with no VAT number shouldn't be able to use Nemhandel and shouldn't have a OIOUBL xml generated. task-6196225 Forward-Port-Of: odoo/odoo#266253 Forward-Port-Of: odoo/odoo#263244
This update resolves a test failure caused by incorrect user group permissions. By changing the test to directly use `group_account_user`, the test now works reliably even when only the core 'account' module is installed, ensuring consistent test results.
Original PR description
**Problem:** In PR #263425, the test uses the user group `group_account_manager` to grant write access to `bank.statement.line`. However, this write access is available through `group_account_user` which is only inherited in `account_accountant`. **Solution:** Instead, use the user group `group_account_user` directly so the test works with only `account` installed. Forward-Port-Of: odoo/odoo#265049 Forward-Port-Of: odoo/odoo#265002
This update fixes a potential issue where customer URLs were inconsistently formatted across Odoo, leading to possible problems with integration and mobile access. By standardizing the URL generation process, this change ensures all modules, like the mobile POS app, can reliably access the correct customer display URL with necessary parameters.
Original PR description
Previously, the logic to build the customer display URL was scoped entirely within the `openCustomerDisplay` method. This prevented other modules from easily reusing the exact same URL formatting logic, leading to duplicated or inconsistent URL construction. By extracting this logic into a dedicated `customerDisplayURL` getter, we allow extending modules (such as `pos_mobile`) to reliably access the correctly formatted URL. This ensures that essential parameters, like the device UUID and access token, are consistently applied whenever the customer display URL is needed across the codebase. opw-6212067 See also: https://github.com/odoo/enterprise/pull/118458
This update fixes an issue where the mobile point-of-sale app wasn't correctly displaying customer information. By aligning the URL logic with the standard point-of-sale, the mobile app now reliably shows customer details, ensuring a consistent user experience. This resolves a tracking discrepancy.
Original PR description
The `_showDisplayAndGoToUrl` method in the mobile navbar was manually constructing its own URL for the customer display. This hardcoded string incorrectly omitted the device UUID, which is required for proper display identification and tracking. By leveraging the new `customerDisplayURL` getter introduced in the parent `Navbar` component, the mobile implementation now utilizes the exact same URL logic as the standard point of sale. This resolves the inconsistency and ensures the customer display functions reliably on mobile devices. opw-6212067
This change addresses a technical issue where Odoo was unable to import a necessary library. The problem stemmed from an outdated dependency within Odoo's internal setup, specifically related to the lxml library. This fix ensures Odoo can correctly load the required components and function as expected.
Original PR description
still ``lxml.html.clean`` import is needed because ``lxml.html`` init file don't have clean file. So, it will be not loaded For reference :-…
still ``lxml.html.clean`` import is needed because ``lxml.html`` init file don't have clean file. So, it
will be not loaded
For reference :- https://github.com/lxml/lxml/blob/lxml-4.9/src/lxml/html/__init__.py
```
Traceback (most recent call last):
File "/tmp/tmpj23nirpw/odoo/19.0/./odoo-bin", line 3, in <module>
import odoo.cli
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/cli/__init__.py", line 2, in <module>
from .command import Command, main # noqa: F401
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/cli/command.py", line 8, in <module>
import odoo.init # import first for core setup
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/init.py", line 28, in <module>
from .tools.gc import gc_set_timing
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/tools/__init__.py", line 11, in <module>
from .i18n import format_list, py_to_js_locale
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/tools/i18n.py", line 8, in <module>
from odoo.tools.misc import babel_locale_parse, get_lang
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/tools/misc.py", line 40, in <module>
from lxml import etree, objectify
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/_monkeypatches/__init__.py", line 45, in exec_module
patch_module(module.__name__)
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/_monkeypatches/__init__.py", line 67, in patch_module
module.patch_module()
File "/tmp/tmpj23nirpw/odoo/19.0/odoo/_monkeypatches/lxml.py", line 14, in patch_module
lxml.html.clean._find_image_dataurls = re.compile(r'data:image/(.+?);base64,').findall
AttributeError: module 'lxml.html' has no attribute 'clean'
```
https://upgradeci.odoo.com/upgradeci/run/301804
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#266591