Daily updates from Odoo
Monday, March 16, 2026
17 changes · saas-19.1
Resolved issues and error corrections
This update resolves a failing test within the Odoo Enterprise platform's order processing system. The issue stemmed from a new requirement for a kitchen printer, which wasn't available in the test environment, causing disruptions in the order flow. This fix ensures the test now runs correctly.
Original PR description
This commit fixes the failing `test_platform_order_flow` test, specifically within the `test_platform_order_reject_flow` tour at the `.ticket-screen` step. Explanation: The root cause of this issue is that the system is now expecting a kitchen printer to be present to process the order flow. However, the unit test environment does not have a kitchen printer configured, which causes the flow to halt or behave unexpectedly when the system tries to interact with it. Reference: Breaking PR: odoo/odoo#226447 build_error-241246 Forward-Port-Of: odoo/enterprise#110249
A test was failing due to an issue with how the system calculates dates and time zones. This fix corrects a calculation error that resulted in an incorrect date being generated, ensuring the planning module's tests run successfully. This resolves a potential disruption to the planning functionality.
Original PR description
__ ## Error description The test fails when it is launched at 23h. We obtain an assertion error: `AssertionError: datetime.datetime(2026, 2, 26, 11, 0) != datetime.datetime(2026, 2, 25, 11, 0)` ##…
__ ## Error description The test fails when it is launched at 23h. We obtain an assertion error: `AssertionError: datetime.datetime(2026, 2, 26, 11, 0) != datetime.datetime(2026, 2, 25, 11, 0)` ## Origin of the issue In the `_default_start_datetime()` method of planning, we return `return datetime.combine(fields.Date.context_today(self), time.min)`. So, we call context_today. which is implemented this way: https://github.com/odoo/odoo/blob/f3ec2aa4514c03874aae96ae975e2617e8260c72/odoo/orm/fields_temporal.py#L154-L158 Let's say the hour of the test is 23h50 in GMT+0. The slot will be created at 23h50 in GMT+0. But if the time zone of the environment is set at GMT+1, at the moment of the `_compute_datetime`, we will call this piece of code, where we will translate 23h50 to GMT+1, we will obtain 00h50, then only return the day, which offsets the result of one day in the future. X-original-commit: d91c53869842f65a60088ffa101f67404af6e58e note: backport of https://github.com/odoo/enterprise/pull/108891 Forward-Port-Of: odoo/enterprise#110126
This update resolves an issue where users couldn't type spaces into 'Add to cart' buttons within the website editor. The fix involves a technical adjustment to the button's structure, ensuring spaces are correctly inserted as intended. This improves the user experience when customizing website product pages.
Original PR description
Problem: After https://github.com/odoo/odoo/commit/e809b492c1b138c1af7bb1d4aa61b39d87686df9 typing spaces inside an "Add to cart" button label in the website editor triggers the button click instead…
Problem: After https://github.com/odoo/odoo/commit/e809b492c1b138c1af7bb1d4aa61b39d87686df9 typing spaces inside an "Add to cart" button label in the website editor triggers the button click instead of inserting a space character. Cause: Browsers natively intercept the space key on `button[contenteditable="true"]` elements and fire a click event instead of inserting the character, making it impossible to type spaces in the button label. Solution: Introduce an `EditableButtonPlugin` that moves the `contenteditable` attribute from the button up to a wrapping `<span>`. This preserves full text editing capability (including spaces) without triggering the button's click handler. Steps to reproduce: * Go to a product page on the website. * Open the editor. * Try to add a space in the "Add to cart" button label. * Observe that the button is triggered instead of inserting a space. opw-5994828 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update resolves a bug that caused product imports to create redundant records when importing multiple products with the same attribute values. By using a 'set' instead of a 'list', the system now ensures unique values are created, preventing inconsistencies and maintaining product variant usability. This improves import reliability and data accuracy.
Original PR description
Product imports were creating redundant `product.attribute.value` records because batch values were stored in a list without uniqueness checks. This fix ensures that: - Unique values are identified before creation. - Product variants remain usable and consistent. Issue: 5918366 Fixes the issue where importing 200 products with the same attribute value created 200 identical records.
This update fixes a performance issue in our testing process. Previously, asset bundles were repeatedly regenerated during tests, slowing down runtimes. Now, bundles are pregenerated once and reused, significantly improving test execution speed and stability.
Original PR description
The commit [^1] introducing binary asset bundle support overlooked the pregeneration of said bundles for the tests runs. This leads to hot-regeneration of those bundles during tests runs on the runbot (multiple hundreds of times) instead of only once and reusing them. This commit adds support for those binary bundles during pregeneration. [^1]: odoo/odoo@a5c02da5c24bfc85b3bbb7d1410d489d3c7185b8
This update fixes a performance issue in the Web Studio module by ensuring binary asset bundles are pregenerated during testing. Previously, tests repeatedly regenerated these bundles, slowing down the testing process. Now, bundles are created once and reused, significantly improving test run times.
Original PR description
The commit odoo/odoo@a5c02da5c24bfc85b3bbb7d1410d489d3c7185b8 introducing binary asset bundle support overlooked the pregeneration of said bundles for the tests runs. This leads to hot-regeneration of those bundles during tests runs on the runbot (multiple hundreds of times) instead of only once and reusing them. This commit adds support for those binary bundles during pregeneration.
This update fixes a bug where employee skills weren't automatically added to appraisals created by the system's automated scheduling process. The fix ensures that all appraisals, regardless of their creation method, correctly display the employee's skills in the Skills tab. This improves data accuracy and usability.
Original PR description
Steps to reproduce: ------------------------------------- 1. Install `hr_appraisal_skills` module 2. Create a new employee and assign at least one skill to the employee 3. Set the Next Appraisal Date…
Steps to reproduce: ------------------------------------- 1. Install `hr_appraisal_skills` module 2. Create a new employee and assign at least one skill to the employee 3. Set the Next Appraisal Date to today 4. Go to Scheduled Actions > Appraisal: Run employee appraisal > Run Manually 5. Open the newly created appraisal for the employee Observation: ------------------------------------- In the Skills tab, the employee's skills are not populated even though the appraisal is already in the confirmed stage Issue: ------------------------------------- When the cron `_run_employee_appraisal_plans` creates an appraisal, it is created directly in `pending` state via `create()`. The skill-copying logic only lived in the `write()` override, which triggers on state transitions from 'new' to 'pending'. Since `create()` bypasses `write()`, Employee skills were never copied to cron-created appraisals https://github.com/odoo/enterprise/blob/451dce92a087086fc3d5d5f610626312f32bcd13/hr_appraisal_skills/models/hr_skills.py#L12-L15 Solution: ------------------------------------- Add a `create()` override to call `_copy_skills_when_confirmed` when an appraisal is created directly in the `pending` state, ensuring employee skills are properly copied. opw-5491433 Forward-Port-Of: odoo/enterprise#110414 Forward-Port-Of: odoo/enterprise#107760
This update fixes a bug where journal entries could be posted even when using inactive analytic accounts. The change adds a validation step during posting to ensure all referenced accounts are active, preventing incorrect financial postings. This improves data accuracy and reliability.
Original PR description
**Steps to produce:** - Install the `Accounting` module. - Enable analytic accounting in settings. - Create an analytic account (e.g., "test"). - Create a journal entry and assign the analytic…
**Steps to produce:** - Install the `Accounting` module. - Enable analytic accounting in settings. - Create an analytic account (e.g., "test"). - Create a journal entry and assign the analytic account in the analytic distribution. - Post the entry and export it(Make sure `journal items/account` and `journal items/analytic distribution` are also included). - `Archive` the analytic account. - Import the exported entry `OR` Duplicate the previous created entry. - Try to post the imported entry. **Issue:** - The entry is posted even if the analytic account used in the analytic distribution is inactive. **Root cause:** - The `analytic_distribution` field is stored as JSON. - At [1], the `_str_to_json` method only attempts `json.loads(value)`, and if parsing fails, it raises an error. **Solution:** - Add a validation when posting journal entries to ensure that all analytic accounts referenced in the analytic distribution are active. [1]: https://github.com/odoo/odoo/blob/13e8b462e74f144e085492857bfaa7b0d1f88f93/odoo/addons/base/models/ir_fields.py#L196-L202 opw-5350980 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#244231 Forward-Port-Of: odoo/odoo#239988
This update resolves an issue where rental income was incorrectly included in the Total Income batch calculation for Hong Kong payroll. The fix removes these rental amounts, ensuring more accurate reporting of income for tax purposes. This improves the reliability of financial data within the Odoo Enterprise system.
Original PR description
. Removing any rental amounts in calculating Total Income batch task-6006636 Forward-Port-Of: odoo/enterprise#109919
This update resolves an issue where parallax preview animations appeared differently in Firefox and Chrome due to inconsistent iframe height measurements. The fix now uses a standard root height measurement, ensuring a consistent and reliable preview experience across all browsers. This improves the overall user experience for website editors.
Original PR description
Steps to reproduce: - Open the website editor. - Open the snippet dialog. - Scroll through a parallax snippet preview in Firefox and Chrome. => The preview animation does not move the same way. Before this commit, the parallax preview used `body.clientHeight` inside the scaled snippet preview iframe. Firefox and Chrome can return different values there, so the preview animation was inconsistent. After this commit, the preview reads `document.documentElement.clientHeight` instead, which gives a stable iframe viewport height across browsers. Forward-Port-Of: odoo/odoo#253541
This update fixes a display issue where the mega menu in mobile view was taking up too much space when the menu size was set to 'Narrow'. The change ensures the mega menu's maximum width is correctly defined, preventing it from overflowing the mobile navigation bar. This improves the user experience on smaller screens.
Original PR description
The property "max-width" of the mega menu in mobile view was set with the class o_mega_menu_is_offcanvas of its ancestor. However, when the user set the mega menu template size to "Narrow", new CSS rules were added to change the mega menu size based on the screen size. The first rule was overridden, resulting in the mega menu being larger than the mobile navbar width. This commit sets the property "max-width" as "important" to prevent this issue from occurring. task-5972284 Forward-Port-Of: odoo/odoo#250690
This update resolves an issue where users with HR access rights would receive an error when trying to view other users' profiles. The change restricted access to the 'pin' field, which was previously incorrectly exposed. This ensures HR staff can properly access user information.
Original PR description
The field `res_users.pin` is restricted to members of `hr.group_hr_user` but is added to the form view, so if a user with HR access rights tries to view another user, it will trigger an access error:…
The field `res_users.pin` is restricted to members of `hr.group_hr_user` but is added to the form view, so if a user with HR access rights tries to view another user, it will trigger an access error: ``` odoo.exceptions.AccessError: You do not have enough rights to access the field "pin" on Employee (hr.employee). Please contact your system administrator. ``` To reproduce: - With `hr` installed, remove its access rights from the admin and try to view another user. This error is related to recent changes[^1] in the access of employee fields, it might be possible to have a different approach to this error. It will break while trying to access the employee field for which the user doesn't have access: https://github.com/odoo/odoo/blob/012f510e70d7d0afd226e4198b2e1759db3ca18d/addons/hr/models/res_users.py#L29-L36 In earlier versions, the field was not accessed directly. It was just automatically hidden from the view if the user didn't have the right group. [^1]:https://github.com/odoo/odoo/commit/012f510e70d7d0afd226e4198b2e1759db3ca18d
This update resolves a problem where the website's promotional tour occasionally failed to run correctly. The fix was identified through automated testing and ensures the tour consistently functions as intended for users. This improves the user experience and prevents potential frustration.
Original PR description
See https://runbot.odoo.com/odoo/runbot.build.error/234533
This update ensures that quality checks are only performed on tracked products when a lot or serial number is assigned. Previously, users could initiate quality checks without this information, leading to errors. Now, a clear error message prompts users to assign lot/serial numbers, improving data accuracy and preventing incorrect quality assessments.
Original PR description
This commit fixes the behavior when the user tries to do quality checks for tracked products without setting their lot/sn on the picking. Before this commit: Nothing happens if the user tries to do quality checks if lots are not set on the tracked products. After this commit: A User Error is raised telling the user to assign lots/sn to the tracked products. Additional improvement: Before this commit, when having quality checks and user click on `Quality Checks` button, all quality checks appear regardless of whether all moves are picked or only some of them are picked. After this commit, clicking on `Quality Checks` button will only show quality checks related to picked move lines if at least one move line is picked, otherwise it will show all quality checks. Task-5730239 Forward-Port-Of: odoo/enterprise#104945
This update fixes a bug where users could successfully cancel subscriptions that already had invoices generated. The change adds a check to ensure subscriptions with active invoices cannot be cancelled after they've been closed, preventing potential revenue discrepancies. This ensures accurate subscription management and billing.
Original PR description
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to…
Steps to reproduce: -------------------------------- 1. Install Subscription module 2. Create a new subscription quotation and confirm it 3. Generate an invoice for the subscription 4. Attempt to cancel the subscription * A ValidationError is correctly raised 5. Close the subscription by selecting any close (churn) reason 6. Attempt to cancel the same closed subscription again Observation: -------------------------------- The subscription is successfully cancelled even though it already has invoices Issue: -------------------------------- In the following code: https://github.com/odoo/enterprise/blob/9e39b4b85fcb9f6ed5b21b942796b76b8a6eefdb/sale_subscription/models/sale_order.py#L741-L742 The cancellation logic does not check whether a subscription is already churned and still has active invoices Solution: -------------------------------- Added an additional condition to prevent cancelling churned subscriptions that still have active invoices opw-5479719 Forward-Port-Of: odoo/enterprise#109755 Forward-Port-Of: odoo/enterprise#106596
This update clarifies error messages for declined payments related to international vendors. Previously, users saw a generic "Country not allowed" message when payments were refused due to vendor location discrepancies. Now, the system incorporates payment data to provide more specific and helpful error messages, improving the user experience.
Original PR description
A company in belgium creates a card, it's "allowed countries" is set to Belgium by default. If said card is used to pay online on a website ending with .be, it is understandable that the user believes the vendor to be located in Belgium If it is not the case (the vendor is actually in Luxembourg), the payment is refused but the message on the refused expense is unclear "Country not allowed" The change adds the data received to make the decision in the error message task: 5478443 Forward-Port-Of: odoo/enterprise#103974
A crash in the DIN 5008 report layout preview was resolved. The issue stemmed from an attempt to access company data within the QWeb template that wasn't always present. The fix adds a check to ensure the company record exists before attempting to retrieve its name, preventing the error.
Original PR description
**Steps to reproduce** - Settings -> Configure Document Layout - Set layout to DIN 5008, save - Click Preview Document **Error** `MissingError: Record does not exist or has been deleted.(Record: res.company(X,), User: 2)` Raised in l10n_din5008.external_layout_din5008 because of this line: `<span t-elif="'name' in o" t-field="o.name"/>` **Cause** The "Preview Document" button renders web.preview_externalreport, which passes a res.company record as the QWeb variable o. When the template then tried to render t-field="o.name" (the title line), where o is a missing res.company(2) (not in the database), QWeb raised the MissingError. **Fix** Guard the title block with `if o and o.exists()` to check if the record exists, so it's safe to access `o.name`. opw-5951003 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr