Daily updates from Odoo
Thursday, September 11, 2025
44 changes · saas-18.4
Enhancements to existing features
This update makes Odoo’s internal web testing tools faster, cleaner, and easier to diagnose when tests fail. It is limited to the unit test ecosystem, reducing risk for regular product behavior while improving developer confidence and test stability.
Original PR description
## Pull Request HOOT (PRHOOT) 36 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Enterprise: https://github.com/odoo/enterprise/pull/93167 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225744 Forward-Port-Of: odoo/odoo#221367
The Peppol demo bill data was cleaned up to use clearer, safer sample information. This reduces confusion in demonstrations by avoiding real-looking bank details, using reserved example domains, and making vendor details more distinct.
Original PR description
Minor improvements to the demo bill such as usage of VAT number different from belgian company in demo data, removal of IBAN account number, usage of a different address for vendor company and usage of example.com instead of beexample.com, which is not IANA reserved domain name. XML used: [INV_2025_00017_ubl_bis3.xml](https://github.com/user-attachments/files/22254686/INV_2025_00017_ubl_bis3.xml) no-task Forward-Port-Of: odoo/odoo#226305
The Incoterm field on accounting documents now shows a helpful placeholder based on the company’s default setting. If no default is configured, users still see general guidance, making the form easier to complete correctly.
Original PR description
This commit adds a dynamic placeholder to incoterm field form view in `account.move`. The placeholder is dynamically set as the default incoterm value in setting. If no default is chosen, a default text is shown. task-4788236 Current behavior before PR: No placeholder is set to incoterm field in account move form view. Desired behavior after PR is merged: Dynamic placeholder set to incoterm field in account move form view with default incoterm value chosen in setting. If no default incoterm is chosen, a default text placeholder is shown. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225905
The financial budgets menu is available again, but only when debug mode is enabled. This gives administrators and support teams an easier way to review or import budget records without adding extra clutter for regular users.
Original PR description
This menuitem was removed with the idea to clean the view, but we now have second thoughts. Having a means to access a tree view of those objects is interesting for debugging purposes and in order to import them. We now put in debug mode only, though. Forward-Port-Of: odoo/enterprise#94155
Resolved issues and error corrections
Website editor popovers such as color pickers and link styling controls now stay correctly positioned when users scroll inside the page editor. This prevents editing controls from drifting away from the selected content, making page design tasks smoother and less confusing.
Original PR description
__Current behavior before commit:__ Some popovers that are toggled from the toolbar are not repositioned when the user scrolls in the website iframe. __Description of the fix:__ `this.__owl__.childEnv` is passed as `env` to `usePopover` such that the `POSITION_BUS` entry is included. Child env is used to avoid polluting the env of the parent component. __Steps to reproduce the issue on runbot:__ 1. Open the Website builder 2. Select some text 3. Click on the *Background Color* item (or *Highlight* or *Link* > *Custom* > *Text Color*) 4. Scroll the page The color picker popover doesn't follow the page scrolling.
The blog sidebar once again includes a dedicated RSS button, making it easier for visitors to subscribe to blog updates. The button is now separate from general social media links, which keeps blog subscriptions clearer and avoids mixing them with website-wide social channels.
Original PR description
Commit [1] changed the "follow us" social media snippet in the blog sidebar to not be dynamic anymore (meaning, it uses the website related social media by default but they are not added/removed automatically based on if they are set or not)... but doing so it removed the custom "RSS" button by mistake. This commit restores it, placing it at the top right of the sidebar, instead of being a part of the "follow us" social media. This keeps everything as static as possible + it actually makes sense to have this dedicated button outside of the more general "follow us" which is more website related than blog related. [1]: https://github.com/odoo/odoo/commit/8b7e44c8c6a7b5c267da39f438e0dfc20699befd
This fix prevents protected links in the HTML editor, such as locked website builder links, from being removed through image deletion, toolbar unlink actions, or mixed editable/non-editable content. It helps preserve important page structure and avoids broken toolbar rendering after editing.
Original PR description
### [FIX] html_editor: prevent removal of unremovable links with images The override that remove a link on `deleteImage` command did not check if the link was unremovable before removing it. ###…
### [FIX] html_editor: prevent removal of unremovable links with images The override that remove a link on `deleteImage` command did not check if the link was unremovable before removing it. ### [FIX] html_editor: prevent removal of links in contenteditable=false If a link was `contenteditable=true`, but inside a `contenteditable=false`, it could be removed ### [FIX] html_editor: prevent removal of unremovable links in batch removal If the selection covers several links, the "unlink" of the toolbar removes all the links selected. This included the links which were supposed to be unremovable. The procedure for removing the links is changed to avoid removing the unremovable nodes. The availability of the tool in the toolbar is also changed to better reflect whether there is links to remove. In case of unremovable links, the tool is shown as disabled Steps to reproduce: - Open website builder - In the toolbar, insert links just before and after the "Contact Us" - Select from the link inserted before, to the one after - In the toolbar, click "Remove Link" - Bug: the link on "Contact Us" is gone, but it was "unremovable" (Saving after these steps currently breaks the toolbar's rendering)
The online shop wishlist now works even when the website header is disabled, preventing shoppers from encountering a crash. Wishlist indicators are also updated consistently across desktop and mobile views, improving the shopping experience.
Original PR description
__Current behavior before commit:__ It is possible to hide the header on the website. If it is hidden, the `_updateWishlistView` method will not find `.my_wish_quantity` in the page; leading to a crash. Furthermore, the current implementation only updates the first wishlist button. However there is a second one in the DOM for the mobile view. __Description of the fix:__ Looping through all the wishlist buttons on the page just like it is done in [master]. __Steps to reproduce the issue on runbot:__ 1. Open the mobile preview on the website 2. Go to `/shop` and add an item to the wishlist => The wishlist button is not updated 1. Open the website builder 2. In the Theme tab, disable *Advanced > Show Header* 3. Go to `/shop` => Crash [master]: https://github.com/odoo/odoo/blob/d65163ea740d8d65/addons/website_sale_wishlist/static/src/js/website_sale_wishlist_utils.js#L57-L60 Bug introduced in: https://github.com/odoo/odoo/pull/212584 opw-4959473
Users with invoicing permissions can now update perception and withholding settings on partner records in the Argentine withholding module. This helps invoice creators apply the correct tax treatment without needing full Accounting administrator access.
Original PR description
Description of the issue/feature this PR addresses: This pull request adds `l10n_ar.partner.tax_billing` on the `l10n_ar_partner_tax` model, granting read, write, and create permissions (but not…
Description of the issue/feature this PR addresses: This pull request adds `l10n_ar.partner.tax_billing` on the `l10n_ar_partner_tax` model, granting read, write, and create permissions (but not unlink) to users in the `account.group_account_invoice` group. Current behavior before PR: Only users with administrator access rights on the Accounting module could modify the "Perceptions / Withholdings" Section on the "Accounting" tab of the partners. <img width="1236" height="673" alt="image" src="https://github.com/user-attachments/assets/92b42973-2b01-4019-8e23-5e3cbf5111a4" /> Desired behavior after PR is merged: Users with invoicing rights can modify the Accounting module could modify the "Perceptions / Withholdings" Section on the "Accounting" tab of the partners. This is needed to properly create the invoices with the perceptions / withholding that apply, for example in cases where by default all partners are set with perceptions, but some depending on their activity are not taxed. In that case, the user that created the partner needs to be able to modify the field by putting a 0% aliquot or deleting the perception line on the contact. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225180
Product images in the catalog now display without being stretched when they are not square. This keeps quotations and product browsing visually accurate and more professional for sales users.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have products with non-square images available for sale; 2. open a quotation; 3. open the product catalog. Issue ----- The product images appear stretched. Cause ----- Commit e8836b42200e3 replaced the `div.kanban_image` element with a `field` element using the `image` widget. It maintained the same size limit of 55x55 via the widget's options, but without additional input, this causes the widget to stretch the images to fill the area. Solution -------- Add the `object-fit-contain` as `img_class` to the options. This class contains the image to the area instead of stretching it. opw-5007629 Forward-Port-Of: odoo/odoo#225112
Odoo now blocks pricelist rules that depend on each other in a circular way. This prevents online shop errors when customers select affected pricelists and helps keep pricing setup reliable.
Original PR description
Steps ----- 1. Create a selectable pricelist A; 2. create a selectable pricelist B; 3. add a rule to pricelist B which uses pricelist A; 4. add a rule to pricelist A which uses pricelist B; 5. go to /shop & select one of the pricelists. Issue ----- > 500: Internal Server Error > Error while render the template > RecursionError: maximum recursion depth exceeded in comparison Cause ----- The `_check_pricelist_recursion` constraint only checks if a pricelist item's `base_pricelist_id` is the same as the item's `pricelist_id`. It can therefore not detect if two or more pricelists have a mutually recursive dependence relationship. Solution -------- Use a depth-first search to ensure any dependent pricelist doesn't depend on a parent pricelist. opw-5070604
Website editors can now add a Floating Cards item and resize its title area without triggering an error. This prevents an editing interruption and makes the snippet behave reliably after adding new cards.
Original PR description
*: html_builder In the "Floating Cards" snippet, after adding a new card, when trying to resize its title column vertically, a traceback appears. It happens because this grid item does not have the `g-col-*` class, which is needed for the resize in grid mode to work. This commit adds this class. Steps to reproduce: - Drop a "Floating Cards" snippet. - Add a card. - Click on the new card title and resize the column vertically. => Traceback The issue was previously addressed in [1], but a refactor of the Floating Cards snippet in master introduced a duplicate template, and the fix was applied to the incorrect one. [1]: https://github.com/odoo/odoo/commit/78f6e70e0777f5b063524ead73ddaae93ba55f22
Customers can now add Stripe payment methods without encountering an internal server error during validation. The fix handles Stripe validation responses that do not include amount or currency details, improving reliability of saved payment method setup.
Original PR description
Versions -------- - saas-18.4+ Steps ----- 1. Configure Stripe; 2. go to `/my/payment_method`; 3. create a payment token. Issue ----- > Internal Server Error Cause ----- Commit 5db75d32d718a added a…
Versions
--------
- saas-18.4+
Steps
-----
1. Configure Stripe;
2. go to `/my/payment_method`;
3. create a payment token.
Issue
-----
> Internal Server Error
Cause
-----
Commit 5db75d32d718a added a method that compares notification data values to the transaction values. For most operations, the structure of Stripe notification data is similar, but for `SetupIntent` responses, these don't include an amount or currency value (unless the currency is supported by Indian eMandates, in which case it's part of a `mandate_options` dict)[^1].
The error is the result of `payment_data.get('currency').upper()`. Because there is no currency value, `upper` gets called on `None`.
Additionally, when the transaction amount is zero (as is expected for validation operations), the base `_compare_notification_data` method assumes the amount is missing, throwing a validation error.
[^1]: https://docs.stripe.com/api/setup_intents/confirm
Solution
--------
- Skip comparing notification data for validation transactions.
- If the `currency` value is in fact missing unexpectedly, fall back on the empty string, so that we get to the intended validation error.
opw-5008858The website builder now scrolls more smoothly in Chrome when using a laptop trackpad. This reduces distracting visual stutter in the editing panels, making page editing feel more polished and comfortable.
Original PR description
__Current behavior before commit:__ On Chrome, some elements of the builder, like the options headers, move at different times when scrolling with the trackpad creating unpleasant jank visual effect. __Description of the fix:__ Use `will-change: scroll-position;` to tell the browser to optimize the scroll rendering. __Steps to reproduce the issue on runbot:__ 1. Open the website builder in Chrome 2. Scroll with the laptop trackpad in the *Edit* or *Theme* tab
This fixes how separator lines appear in website price list and product catalog sections when users adjust border settings in the web editor. It helps keep published pages visually consistent when businesses customize these snippets.
Original PR description
Prior to this commit, the separators in the `s_product_catalog` and `s_pricelist_*` snippets didn't render correctly when changing the border values in the web editor. Steps to reproduce: - Open the…
Prior to this commit, the separators in the `s_product_catalog` and `s_pricelist_*` snippets didn't render correctly when changing the border values in the web editor. Steps to reproduce: - Open the Web Editor. - Drag and drop a price list snippet (`s_product_catalog`, `s_pricelist_cafe`, or `s_pricelist_boxed`). - Click on the snippet. - Set the border value to `0`. task-5081626 | Before | After | |--------|--------| | <img width="1914" height="646" alt="Capture d’écran 2025-09-11 à 09 30 11" src="https://github.com/user-attachments/assets/f7dc319f-e151-4fc4-9349-df70719aec9f" /> | <img width="1912" height="643" alt="Capture d’écran 2025-09-11 à 09 31 02" src="https://github.com/user-attachments/assets/dbbaacff-9f20-4ec4-9fec-f4cc3770952a" /> | | <img width="1915" height="646" alt="Capture d’écran 2025-09-11 à 09 30 52" src="https://github.com/user-attachments/assets/f138bd04-60cd-4238-9338-2fa5921d7715" /> | <img width="1911" height="647" alt="Capture d’écran 2025-09-11 à 09 31 37" src="https://github.com/user-attachments/assets/c38e486a-2b23-4685-83f1-de363c15c881" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes automated checks for the Discuss command palette more reliable by waiting for the interface to settle before interactions are tested. It also corrects supporting test data so related messaging features can be validated consistently, reducing false failures in quality checks.
Original PR description
Before this commit, clicking on some elements of the command palette would not trigger the associated event, this was probably caused by clicking on outdated owl fragments which cannot trigger events while being destroyed. This commit fixes this issue by making sure that the interface is in a stable configuration before clicking. The commit also fixes the mock of `discuss/search` ( for https://github.com/odoo/enterprise/pull/94075 ) and a test that was incomplete and relied on the incorrect implementation https://runbot.odoo.com/odoo/runbot.build.error/112148 Forward-Port-Of: odoo/odoo#225951 Forward-Port-Of: odoo/odoo#225844
This update refreshes the spreadsheet component and fixes several issues affecting everyday spreadsheet use. Users should see cleaner Excel imports, fewer unnecessary warnings, better handling of array formulas, and improved menu text display.
Original PR description
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/15a11a468 [REL] 18.4.10 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0)…
### Contains the following commits: https://github.com/odoo/o-spreadsheet/commit/15a11a468 [REL] 18.4.10 [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) https://github.com/odoo/o-spreadsheet/commit/8e9603c88 [FIX] package: saas-18.4 is no longer the latest version [](https://www.odoo.com/odoo/2328/tasks/) https://github.com/odoo/o-spreadsheet/commit/d021c7ff6 [FIX] Menu: Fix item text truncation [Task: 5072649](https://www.odoo.com/odoo/2328/tasks/5072649) https://github.com/odoo/o-spreadsheet/commit/424fb57e8 [FIX] xlsx: remove useless warnings on import [Task: 5075112](https://www.odoo.com/odoo/2328/tasks/5075112) https://github.com/odoo/o-spreadsheet/commit/c3bad9029 [FIX] clipboard: insert cells bugged with array formulas [Task: 4938311](https://www.odoo.com/odoo/2328/tasks/4938311) https://github.com/odoo/o-spreadsheet/commit/f4282501a [FIX] xlsx: `=undefined` when importing array formula [Task: 4812508](https://www.odoo.com/odoo/2328/tasks/4812508) https://github.com/odoo/o-spreadsheet/commit/eb13639d0 [REV] xlsx: make import verbose [Task: 0](https://www.odoo.com/odoo/2328/tasks/0) 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: Dhrutik Patel (dhrp) <dhrp@odoo.com> Co-authored-by: Adrien Minne (adrm) <adrm@odoo.com> Co-authored-by: Ronak Mukeshbhai Bharadiya <rmbh@odoo.com> Co-authored-by: Florian Damhaut (flda) <flda@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>
Event registration screens now show the correct action button depending on seat availability and whether tickets are free. This prevents visitors from seeing a misleading sign-in option that could lead to an error or confusion during registration.
Original PR description
This commit fixes two bugs related to the "Sign in" in button of the registration form. First bug: ------------ If there is more ordered seats than available seats, an error modal is displayed with a…
This commit fixes two bugs related to the "Sign in" in button of the registration form. First bug: ------------ If there is more ordered seats than available seats, an error modal is displayed with a "Sign In" button. This button shouldn't be present. On click, a 500 error is triggered. Now, the button does not appeared on this modal. Reproduce: Check "Mandatory" for "Sign in/up at checkout" in the settings. In the event form, add a limit of 1 available seat and add two tickets with each one 1 seat. With a public user, on the website page of the event, click on "Register" to open the registration modal. In the tickets form, select the maximum number of registrations for each tickets. The error modal with the "Sign In" button should appear. Clicking on this button trigger the 500 error. Second bug: ---------------- The "Sign in" button is displayed even if the tickets have no price. So the label of the button is wrong because public users are not redirected to the checkout. Now, the "Confirm Registration" button is displayed in this case. Reproduce: With the same settings as for the first bug, create an event without tickets. Order a registration with an public user. Click on the "Sign In" button of the attendee details form. The confirmation page appears instead of the sign in page. task-4797022 Forward-Port-Of: odoo/odoo#215585
Website editors now get more predictable link behavior when editing pages. Image links no longer show an unintended live preview while typing, and empty link URLs are preserved with a safe placeholder instead of silently discarding the change.
Original PR description
### Description of the issue/feature this PR addresses: - onChange was triggered both while typing in the URL input and when selecting an autocomplete item, causing live preview even for image links. - When editing a link, removing URL and clicking outside discarded changes. ### Desired behavior after PR is merged: - Live preview is now applied only for normal text links, not for image links. - If the URL field is empty and the user clicks outside, the link now default its href to '#'. task-5028570 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Vendor price lists created from blanket orders now use the unit of measure from the blanket order line instead of defaulting to the product's base unit. This helps purchasing teams keep vendor pricing aligned with negotiated order terms and avoids unit-related pricing mistakes.
Original PR description
This commit fixes setting the UoM of the vendor pricelist generated by a blanket order. Previously, the created pricelist had the base unit of the product. Now, it has the unit of the blanket order line. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226033
This fixes a crash that occurred when adding a kit product as a part on a repair order. Users can now save repair orders with kit components normally, reducing interruptions in repair workflows.
Original PR description
When user tries to set the kit as product parts in repair order, A traceback will appear. Steps to reproduce the error: - Install ``mrp_repair`` module with demo data - Create a new repair order > In Parts, Add a line > Product: ``Table Kit`` > Save Traceback: ``AttributeError: 'stock.move' object has no attribute 'name'`` https://github.com/odoo/odoo/blob/83a8508b958ed88bbdbf80612039ec33817bc02c/addons/mrp_repair/models/repair.py#L84 The ``name`` field of ``stock.move`` was removed in the [commit](https://github.com/odoo/odoo/pull/211488/commits/f3fc7a5cfd6e77cbbcfff891383abeac930d41ac), but it is still being referenced here. So, It will lead to the above traceback. sentry-6870866512 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an issue where reloading a page after folding a group in a grouped Kanban view could show an error. The view now refreshes its saved group state from the latest server response, improving reliability for users returning to grouped records.
Original PR description
- Open a grouped kanban; - Fold a group; - Reload the page; Before this commit, an error occurred because the configuration says that the group is unfolded, but the returning RPC didn't have any records. This commit clears the current configuration, which will then be reloaded based on the returning RPC.
The wishlist purchase journey test now allows more time to complete, reducing false failures when the process runs slowly. This helps keep automated validation stable without changing the customer-facing shopping experience.
Original PR description
Increase timeout for wishlist tour. As it was taking too long to complete. runbot-229616 Forward-Port-Of: odoo/odoo#225357 Forward-Port-Of: odoo/odoo#219653
Live chat routing now correctly ignores conversations that have already ended or have been inactive for at least 30 minutes when measuring agent workload. This helps assign new chats to the truly least busy available agent, improving response distribution and customer handling.
Original PR description
Live chat agents are assigned based on their expertise, language, country, and other criteria. When several agents match these criteria, the system chooses the least active one. There was an issue with the SQL query that retrieves agent occupation: an agent was still considered buisy if a message was received within the last 30 minutes, even if the live chat was ended. This commit fixes the issue: the query now excludes ended live chats as well as live chats without any activity for at least 30 minutes. task-5065567 Forward-Port-Of: odoo/odoo#226271 Forward-Port-Of: odoo/odoo#225514
Users editing technical views now receive a clear, user-friendly message if they include an XML encoding declaration that cannot be saved. This prevents a confusing system error and helps administrators correct the view architecture more easily.
Original PR description
Currently, an error occurs when a user includes an XML encoding declaration in the view architecture. **Steps to reproduce:** - Enable **developer mode**. - Under `Settings > Technical > User…
Currently, an error occurs when a user includes an XML encoding declaration in the view architecture. **Steps to reproduce:** - Enable **developer mode**. - Under `Settings > Technical > User Interface > Views` Create or edit any view. - Enter the `view name` and select `view type`. - In the Architecture field, declare encoding as: `<?xml version='1.0' encoding='utf-8'?>`. - Attempt to save the view. **Error:** `ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.` **Root Cause:** The [1] call raises a ValueError when the XML declaration includes an encoding attribute. This low-level error is not handled and results in an ungraceful failure. [1]- https://github.com/odoo/odoo/blob/bf4ccb21f6c9c8bcda9c6f94d844c89296523954/odoo/tools/translate.py#L281 This commit ensures raising an UserError, improving the error message clarity. sentry-6505918596 Forward-Port-Of: odoo/odoo#226396 Forward-Port-Of: odoo/odoo#205324
Fixes an issue in the website builder translation mode where using left or right arrow keys inside carousel text could switch slides and then cause a crash. This keeps text editing predictable for multilingual website content and prevents disruption while translating carousel snippets.
Original PR description
Since the initial [website builder refactor], when in translate mode in website builder, pressing an arrow key when the cursor is inside the text of a carousel moved to the next slide once, pressing…
Since the initial [website builder refactor], when in translate mode in website builder, pressing an arrow key when the cursor is inside the text of a carousel moved to the next slide once, pressing again caused a crash. Before the refactor, there was also the slide behavior but not the crash. The arrows triggers the slide because the contenteditable is inside the slide in translate mode. It does not trigger it in normal edit mode because the contenteditable is on an ancestor. This commit fixes it by changing the config pass to the bootstrap carousel in edit mode, so that the carousel does not slide on keyboard. Changing this config makes the event handlers to stop the keydown event on the other parts of the carousel redundant, so they are removed Steps to reproduce: - Open website bulider - Drop the snippet "Quotes Minimal" - Add a second language to the website - Edit the translation for the second language - Click on the text in the quote in the carousel - Press a left or right arrow key - Bug: the slide changed (instead of moving the cursor in side the text) - Click on the text of the slide that is now shown - Press again the arrow key - Bug: Crash [website builder refactor]: https://github.com/odoo-dev/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
This fixes an error that could prevent portal users from buying a paid eLearning course after accessing it through a shared preview link and completing a quiz. The cart action now uses the current shopping cart mechanism, so learners can continue to checkout normally.
Original PR description
Steps to reproduce: 1) Install `website_sale_slides`. 2) Create a course with enroll policy 'On payment' and publish it. 3) Add a content allow preview it and add a quiz 4) Go to website, click Share…
Steps to reproduce:
1) Install `website_sale_slides`.
2) Create a course with enroll policy 'On payment' and publish it.
3) Add a content allow preview it and add a quiz
4) Go to website, click Share button and open the generated link in incognito.
5) Login as a portal user, pass the quiz and click "Buy this course".
Issue:
- A traceback occurred:
`Cannot read properties of undefined (reading 'addToCart')`.
Cause:
- The method call `self.call('websiteSale', 'addToCart', ...)` relied on the deprecated `call` service, which was removed in commit https://github.com/odoo/odoo/commit/b8d0ab4275b24510161de9db793020f3489b0446.
- The service and method `call('websiteSale', 'addToCart'` is not valid and was not updated here :
https://github.com/odoo/odoo/blob/35161ecf0dd3fde47db9b2166718339c2e30ac92/addons/website_sale_slides/static/src/js/slides_course_join.js#L29
- As a result, `addToCart` was no longer accessible and triggered a JS error.
Solution:
- Update the code to use the new service and method: `call('cart', 'add',`
opw-5045424
Forward-Port-Of: odoo/odoo#224760Creating an invoice no longer crashes when VAT verification is enabled and the company has no country set. The change adds a safeguard so customers can continue invoicing even if company country data is incomplete.
Original PR description
The system crashes with an error when a user tries to create an invoice. **Steps to produce:-** - Install `Accounting` module and switch to `BE Company`. - Go to `Settings > Users & Companies >…
The system crashes with an error when a user tries to create an invoice.
**Steps to produce:-**
- Install `Accounting` module and switch to `BE Company`.
- Go to `Settings > Users & Companies > Companies` and remove the country from the BE company.
- Create a new customer with:-
- Country as `Belgium`.
- Tax ID as `DE123456788`.
- `Accounting > configuration > settings > enable Verify VAT Numbers`.
- Now try to make `invoice` with customer as previously created customer.
**Error:-**
`TypeError : argument of type 'bool' is not iterable`
**Root cause:-**
- At [1], the code attempts to access `company.country_id`, but since the country was manually removed from the company, it evaluates to null record, leading to the error.
**Solution:-**
- Add a safeguard to ensure `company.country_id` also exist before accessing `country_group_codes`.
[1] -https://github.com/odoo/odoo/blob/4c2330f3cc0d1a0046e28d351f894763aeea57d2/addons/base_vat/models/res_partner.py#L764
**sentry-6851141424**
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#225158Point of Sale now avoids an error when taxes are turned back on after a product has already been added to an active sales session. This keeps cashiers from seeing a crash and helps ensure updated tax settings are handled smoothly.
Original PR description
Steps to reproduce: ---- - From accounting disable taxes - Create new product - Open PoS UI and add product in orderline - Go to backend and enable taxes - Add tax in previously created product - Open UI again Issue: ---- - We will have traceback Cause: ---- - undefined error as pos_receipt_label is undefined as we don't have chance to reload data as product is already in orderline Fix: ---- - added optional chaining so we don't have undefined error also we have to reload data after enabling taxes from the configurations in the backend ---- task - 4762770 Forward-Port-Of: odoo/odoo#208511
The Uruguay localization app now links directly to the Uruguay fiscal localization documentation instead of a general documentation page. This helps users find the relevant country-specific guidance faster from the app information.
Original PR description
Description of the issue/feature this PR addresses: The website link in the `l10n_uy` manifest was pointing to a generic documentation page. Current behavior before PR: Link in manifest points to `https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations.html` Desired behavior after PR is merged: Link in manifest points to `https://www.odoo.com/documentation/17.0/applications/finance/fiscal_localizations/uruguay.html` Forward-Port-Of: odoo/odoo#226169 Forward-Port-Of: odoo/odoo#225460
The Send & Print wizard now skips a Uruguay electronic invoice file type that caused download errors. Users can download invoice attachments without interruption, while the skipped CFE document remains available from its own form view.
Original PR description
When downloading attachment via the send & print wizard, we get an error from the server. This is because we raise an assertion error if any attachment is not from 'account.move' model. But the CFE file is from 'l10n_uy_edi.document' model. With this commit, we extend the `_action_download` method to filter the CFE file from the attachments. It is not blocking for client as he can still download it from the form view of the CFE document. Steps: - Create an invoice - Set a 0% tax on the invoice line - In 'Other infos' tab, fill the 'Incoterm', 'Sales Modality' and 'Transportation Rules' fields - Confirm - Open S&P wizard, select 'Create CFE' and confirm - Reopen S&P wizard, select 'Download' and confirm (can be done along the previous step too) -> Error opw-5043902 Forward-Port-Of: odoo/enterprise#93830
Internal users can now use AI agents that rely on tools without being blocked by an access error. The change adds read-only access for these AI tools and includes tests to help prevent the issue from returning.
Original PR description
Purpose: --------- The access rule for internal users on the `ai.tool` model is missing, and internal users can therefore not chat with an agent that has tools (an `AccessError` is raised) This commit adds the rule with read permission only, and adds a few basic tests to check model permissions. Task-5064332
Scanning package type barcodes with GS1 barcode settings no longer causes server errors. This keeps warehouse barcode workflows running smoothly when identifying package types.
Original PR description
Steps to Reproduce: - Set the barcode nomenclature to GS1 - Scan a package type barcode - Server logs an AttributeError(in Odoo 18) or KeyError(in Odoo 16 and 17) Issue: - The model class "stock.package.type" is missing an attribute "_barcode_field" Solution: - Add the attribute "_barcode_field" to the model class "stock.package.type" Task: [4888064](https://www.odoo.com/odoo/49/tasks/4888064) Forward-Port-Of: odoo/enterprise#94347 Forward-Port-Of: odoo/enterprise#93116
This update adjusts internal test code to use the standard shared helper entry point instead of deeper framework paths. It makes test maintenance easier and reduces the chance of inconsistencies, with no expected impact on day-to-day users.
Original PR description
This commit reduces imports to the 'tests/_framework/' subfolder, which is meant to be accessed through the 'web_test_helpers' module as to reduce the amount of imports, as well as centralizing all web helpers to have a quick overview of the available helpers. Community: https://github.com/odoo/odoo/pull/225865 Forward-Port-Of: odoo/enterprise#94074
The Swiss financial reports now show previous-year unallocated profit and loss correctly. The balance sheet also separates current-year earnings into retained and allocated amounts, giving businesses a clearer view of profit allocation.
Original PR description
Before this commit, `Previous Year unallocated profit and loss` was showing wrong amount. With this commit, we adapt this line (change period of one of its expression) and we add two new lines to reflect the actual year earnings, retained and allocated. Steps, with fresh db: - 1 invoice confirmed in the past year for 1000 - Create the carryforward move (1000 debit for 999 account, and 1000 credit for 2979 account) - Go to balance sheet, set date as 'End of last fiscal year' -> See 'Previous Years Unallocated Earnings` showing -1000 opw-4054341 Forward-Port-Of: odoo/enterprise#94243 Forward-Port-Of: odoo/enterprise#91281
This fix makes automated WhatsApp command palette tests wait for the interface to settle before clicking items. It reduces false test failures, helping keep development and release validation more stable without changing customer-facing behavior.
Original PR description
Before this commit, clicking on some elements of the command palette would not trigger the associated event, this was probably caused by clicking on outdated owl fragments which cannot trigger events while being destroyed. This commit fixes this issue by making sure that the interface is in a stable configuration before clicking. https://runbot.odoo.com/odoo/runbot.build.error/112148 Forward-Port-Of: odoo/enterprise#94075
Opening the rental availability view from a rental order now works reliably. The fix prevents an error that blocked users from checking product availability in the rental schedule.
Original PR description
**Steps to reproduce:** 1. Go to Rental > Create a rental product and enable Sales. 2. Create a rental order with a customer and created product. 3. Click the availability icon and open the view rental. **Issue:** A traceback occurs: `Caused by: InvalidDomainError: Invalid domain representation: product_id,=` **Cause:** The rental availability check crashed due to improper domain construction: <img width="453" height="89" alt="image" src="https://github.com/user-attachments/assets/fd3ff556-fdab-40ab-9c1b-a539e5b164e8" /> **Solution:** Now the `product_id` is correctly retrieved from the record’s `id` property before building the domain, preventing crashes when opening the rental gantt view. opw - 5066061
Appointment bookings now calculate manual confirmation thresholds using the combined capacity of all assigned users, rather than a single user's capacity. This prevents valid bookings from being unnecessarily marked as requests when enough total capacity is still available.
Original PR description
ISSUE ===== Introduced in bce7e94650c337a9046958a7689c81db5b2a4c73, We now handle capacity when booking users. They have each a max capacity of user_capacity for each slot. However, when it comes to…
ISSUE ===== Introduced in bce7e94650c337a9046958a7689c81db5b2a4c73, We now handle capacity when booking users. They have each a max capacity of user_capacity for each slot. However, when it comes to the manual confirmation treshold, we do not account for the total capacity of all users combined, but consider the maximum to be user_capacity! This can lead to a lot of 'request' meetings as we reach the manual confirmation percentage very quickly. STEPS TO REPRODUCE ================== 1. Create an appointment type based on users, with 'manage capacities' enabled, 'manual confirmation' enabled and 'when over' 50% total capacity. Set 2 users and 3 'seats max'. This way, the total capacity of your appointment is 2 * 3 = 6 per slot. 2. As a public user, take an appointment for 2 capacity in the front end 3. The meeting will end up as a 'request', even though the capacity booked is 2/6 < 50%, and should be 'booked' FIX === We now multiply the number of users on the appointment type by the user_capacity when computing the total capacity and comparing it to the asked capacity on booking an appointment. A test is included Task-4930778
This fix prevents an error when users add improvement suggestions to extra manufacturing work orders that were not part of the original bill of materials. It avoids creating unsupported quality control records in that situation, so duplicated manufacturing orders can continue through shop floor steps without crashing.
Original PR description
## Issue: Creating multiple suggestions sequences for differents Workorder in Manufacturing Orders that are added aside BoM defined WorkOrder cause an issue with a Traceback error ## Cause: In the…
## Issue: Creating multiple suggestions sequences for differents Workorder in Manufacturing Orders that are added aside BoM defined WorkOrder cause an issue with a Traceback error ## Cause: In the method `add_check_in_chain()`, the `point.sequence` cause issue because the check can have multiple points https://github.com/odoo/enterprise/blob/e85d11f9b3bf07a55e5365adac7370955a149566/mrp_workorder_plm/models/mrp_workorder.py#L58-L66 That the case because multiple quality checks sequences are created when the operation_id is False That's unexpected because PLM isn't made to suggest WorkOrder additions and Suggestions to New WO, but only Suggestions to existing operations So we avoid to create `quality.point` when there is no operation_id ## Information: To get the Traceback, you need to install Quality_control because this module will copy the QC to the MO including the one with operation_id set to False ## Steps to reproduce: Quality_control and plm need to be installed - Enable Work Orders in Settings - Create a Product with a BoM - Create a MO for the Product - Add an extra WO - In the Shop Floor, Mark as Done the BoM's WO - On the Extra WO, click Gear Icon > Update Instructions > Improvement Suggestion > Add a Step - Insert a Title and Propose Change - Duplicate the MO and redo the Shop Floor steps to get the Traceback opw-4874108 Forward-Port-Of: odoo/enterprise#92384
Paid appointment bookings could incorrectly fail by saying a slot was no longer available when resources had capacity greater than one. The fix ensures these bookings count only one simultaneous appointment when capacity management is disabled, allowing customers to complete payment for valid slots.
Original PR description
ISSUE ===== Introduced in odoo/enterprise@bce7e94650c337a9046958a7689c81db5b2a4c73 , we now allow configuring a number of max simulatenous appointments per resource / user per slot, when…
ISSUE ===== Introduced in odoo/enterprise@bce7e94650c337a9046958a7689c81db5b2a4c73 , we now allow configuring a number of max simulatenous appointments per resource / user per slot, when manage_capacity is False. However, this broke the booking flow when enabling a payment on the appointment type as well, for resources with capacity > 1. More specifically, as soon as the remaining capacity is lower than the resource's own capacity. STEPS TO REPRODUCE ================== 0. Install payment_demo, in order to be able to test the payment issue. Install website_appointment_sale to ease the testing too. 1. Create an appointment type for 'Resources', enable 'Up-front payment'. 2. Set a new resource with capacity = 2 on the appointment type. 3. Make sure manage_capacity is False, and number of simultaneous appointments (max_bookings) is set to 1. 4. Go to the front end and pick any slot. 5. Fill the form and 'proceed to payment' 6. Try to 'pay now' 7. You get a validation error message telling you that the slot is not available anymore. But it is not the case since it is a new type and new resource. FIX === For resources, created booking lines were setting capacity_used to the resource's capacity, unless shared. (meaning: the resource is completely used, even if the reserved quantity is smaller). It made sense before but not for this new feature. It should only use 1 capacity, as we count the number of different simulatenous appointments, and it is unrelated to the resource's own capacity. When creating the meeting at the end of the regular flow, the computed field on capacity_used on appointment.booking.line will set it to 1 when manage_capacity is False. Hence, no issue will happen there in practice as the meeting is always created in that case and capacity_used updated. However, when enabling a payment, we create a calendar.booking instead, with calendar.booking.lines. And based on those, we evaluate availability when checking the cart before going to payment. Those are simply created from values in the controller, and the model is much simpler. Therefore, we fix the issue by manually setting the capacity_used to 1 when creating the booking lines in the front-end booking flow, in the case of an appointment without capacity management. Task-4963012
This update fixes an issue in the Belgian CodaBox integration that could cause errors when processing company records. It helps ensure CodaBox-related company operations run reliably without interruption.
Original PR description
We incorrectly used the recordset `self` instead of the record `company` This commit fixes this opw-5036698 Forward-Port-Of: odoo/enterprise#94289
The Chilean electronic factoring process now handles failed or invalid responses from the tax authority more safely instead of crashing. It also refreshes invalid access tokens and adds test coverage, improving reliability when the external service has intermittent issues.
Original PR description
There were some typos in this method. We add test coverage and we reset the token in situations where we receive invalid responses. It's apparently common for the SII to have some random errors that could result in invalid tokens being generated. Based on the work in https://github.com/odoo/enterprise/pull/92035. Forward-Port-Of: odoo/enterprise#94342 Forward-Port-Of: odoo/enterprise#94134
The Quality Points button on product pages now excludes archived quality points from both the count and list. This prevents users from seeing outdated quality controls and keeps product quality information accurate.
Original PR description
**Steps to reproduce:** 1. Install the module `quality_control`. 2. Go to **Products → select any product → Quality Points (smart button)**. * Create a new Quality Point that applies to *all…
**Steps to reproduce:** 1. Install the module `quality_control`. 2. Go to **Products → select any product → Quality Points (smart button)**. * Create a new Quality Point that applies to *all products*. 3. Open any product form. * Verify that the *Quality Points* smart button shows the created point and the correct count. 4. Archive the Quality Point. 5. Reopen the same product form and check the *Quality Points* smart button again. **Observed behavior:** - The archived Quality Point is still counted and shown in the smart button. **Root cause:** - During the refactor from raw SQL (`get_sql` + `cr.execute`) to the ORM query builder (`query.add_where(SQL(...))`), one outer bracket was dropped. [ref](https://github.com/odoo/enterprise/pull/66290/commits/a6362bc07eac7640f68d145a0f6a14a81f499913#diff-2ffdc2ffc25417076b580b772447514c7e9d8b3e2d2fff2d3100721eb5ccbaf4L542-R561) - This changed the operator precedence, causing the `active = true` condition to no longer properly apply when combined with the OR block. - As a result, archived Quality Points bypass the filter and are still counted. **Solution:** - Fix the missing bracket in the `query.add_where` SQL expression so that the `active` condition is always enforced before evaluating the OR block. opw-5046289 Forward-Port-Of: odoo/enterprise#94173
Code cleanup and technical improvements
This update reorganizes internal test code so shared web testing tools are accessed from one central place. It helps keep Odoo's automated tests easier to maintain and reduces the chance of future conflicts, with no expected change for end users.
Original PR description
This commit reduces imports to the 'tests/_framework/' subfolder, which is meant to be accessed through the 'web_test_helpers' module as to reduce the amount of imports, as well as centralizing all web helpers to have a quick overview of the available helpers. Enterprise: https://github.com/odoo/enterprise/pull/94074 Originally contained within the following pull request: https://github.com/odoo/odoo/pull/225744 But has been separated for convenience sake since the original PR was involving security overrides, and would be consistently interrupted by conflicts ensuing from this specific commit. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225865