Daily updates from Odoo
Thursday, January 15, 2026
227 changes
10 changes
Enhancements to existing features
This update expands the list of models automatically included in Odoo's preset export options. This ensures that the exporter generates more complete and useful exports, streamlining the process for users creating backups or migrating data. It addresses a previous limitation where certain models weren't automatically included.
Original PR description
In this PR we add several models to the **PRESET_MODELS_DEFAULTS** list such that the exporter includes necessary models by default. Forward-Port-Of: odoo/enterprise#86287
Resolved issues and error corrections
This update resolves an issue where saving accounting reports with incorrect formulas would generate an error. The fix ensures the system handles invalid 'Prefix of Account Codes' settings gracefully, preventing report failures and improving data reliability. This change impacts the accounting report generation process.
Original PR description
Saving an accounting report with an invalid ``Prefix of Account Codes`` formula will raise a traceback. Steps to reproduce the error: - Install ``accountant`` module - Go to Accounting >…
Saving an accounting report with an invalid ``Prefix of Account Codes`` formula will raise a traceback. Steps to reproduce the error: - Install ``accountant`` module - Go to Accounting > Configuration > Accounting Reports > Open any report > Add a line > Add name > Add a line > Add a Expression > Computation Engine: Prefix of Account Codes > Formula: test( > Save the report Traceback: ```py TypeError: 'NoneType' object is not subscriptable ``` https://github.com/odoo/odoo/blob/1ac7834a9b9d07760700f6d7c73dfe270a247752/addons/account/models/account_report.py#L661-L662 Here, if the token does not match the regex, ``token_match`` will be ``None``, The code then accesses ``token_match['prefix']`` which leads to the above traceback. https://github.com/odoo/odoo/blob/312964fdf68609dbd0fc1bb3be609b50e171b0c3/odoo/tools/translate.py#L556 Here, no translation language is detected by ``_get_lang``. To resolve this, ``self.env._()`` is added instead of ``_()`` at below line. https://github.com/odoo/odoo/blob/312964fdf68609dbd0fc1bb3be609b50e171b0c3/addons/account/models/account_report.py#L646-L648 sentry-7175078855 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#243283
This update resolves an issue where failed IoT driver actions were incorrectly recorded, preventing them from being re-executed. Now, actions are only registered upon successful completion, enhancing the reliability and efficiency of IoT driver operations. This change improves the overall stability of the system.
Original PR description
We currently reject an action if it has the same id of a previous one. If the action failed, we still registered it, making it impossible to be executed again. We now only register if the action succeeds. Forward-Port-Of: odoo/odoo#243913 Forward-Port-Of: odoo/odoo#243247
This update resolves an issue where clicking 'Back' in the self-order POS system sometimes caused incorrect product additions to the cart. The fix clarifies the trigger for product clicks, preventing confusion and ensuring accurate cart updates. This improves the overall reliability of the self-order experience.
Original PR description
Before this commit, trigger to click on a product in the product list was the same trigger to click on a product in a cart list ... With the following scenario, step CartPage.clickBack() can take few…
Before this commit, trigger to click on a product in the product list was the same trigger to click on a product in a cart list ...
With the following scenario, step CartPage.clickBack() can take few times to show the back screen, but as the trigger is the same for clickProduct on a product list screen than a cart screen, the last step clik on "o_self_product_box" ... but in the cart (and not in the product list)
ProductPage.clickProduct("Coca-Cola"), => OK
ProductPage.clickProduct("Coca-Cola"), => OK
Utils.clickBtn("Checkout"), => OK
CartPage.checkProduct("Coca-Cola", "5.06", "2"), => OK CartPage.clickBack(), => OK
ProductPage.clickProduct("Coca-Cola"), => NOK
To fix it, it is enought to just be more precise on the trigger to avoid confusions.
This fix fixes probably a pair of tours.
error-runbot-id~227669
(and probably others)
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#243749This update addresses a technical issue within the Odoo spreadsheet module where pivot tables would generate tracebacks when encountering fields that were no longer present due to data changes or module removals. The fix ensures the spreadsheet functionality remains stable and reliable, even with evolving data structures. This prevents disruptions to users generating reports.
Original PR description
Task: 5085724 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#228166
This update resolves a technical issue that caused a traceback error when creating pivot tables in the spreadsheet reports. The fix ensures that pivot tables function correctly, even when certain data dimensions are missing, improving the reliability of reporting. This enhances the usability of the enterprise spreadsheet functionality.
Original PR description
Task: 5085724 Forward-Port-Of: odoo/enterprise#103369
This update fixes an issue where follower list avatars weren't consistently displayed with the correct proportions, particularly for non-square images. The change utilizes a standard Odoo class for avatars, ensuring all images are displayed correctly and maintaining a professional appearance. This improves the visual quality of the follower list.
Original PR description
Before this commit, follower list menu had avatar that do not preserve ratio of avatars. This is noticeable for avatars that have ratio quite different from 1:1, like 3:2 or 2:3 or even less squarish. This happens because of missing `.o_object_fit_cover`, that [1] erroneously removed from REF of follower template part into its own component. This commit uses an equivalent but more official solution: `.o_avatar`, which is a classname dedicated for avatars, which has `.o_object_fit_cover` property. Task-5412078 Before / After <img width="638" height="526" alt="Screenshot 2026-01-12 at 17 23 54" src="https://github.com/user-attachments/assets/b8d3a921-52a8-48b7-a0d0-5fbfdd33a92c" /> <img width="640" height="528" alt="Screenshot 2026-01-12 at 17 23 33" src="https://github.com/user-attachments/assets/8070420c-f341-4085-bcb2-2fba060765f0" /> [1]: https://github.com/odoo/odoo/pull/200382 Forward-Port-Of: odoo/odoo#243684 Forward-Port-Of: odoo/odoo#243328
This update fixes a bug where changes to the analytic distribution widget weren't being saved correctly when the user navigated away from the field. Now, edits to the analytic distribution are automatically saved when the user clicks elsewhere, mirroring the behavior of other key fields like invoices. This ensures data consistency and a smoother user experience.
Original PR description
**Issue** When editing a line on the reco widget, close and keep change on analytic widget on unfocus **Steps to Reproduce** 1. Activate Analytic Accounting 2. Go on the Bank Reconciliation Widget 3. Edit a line 4. Change the Analytic Distribution. 5. Click elsewhere. 6. The Analytic Widget should close and keep the changes. (as it does on invoices) **Fix** Properly detect the condition for closing the widget. task-5232476 Forward-Port-Of: odoo/odoo#234398
This update fixes an issue where only the first attachment from an expense was included in the generated journal entries. The change ensures that all attachments associated with approved expenses are now correctly copied, improving accuracy and providing complete expense documentation.
Original PR description
**Steps to reproduce:** * Install **hr_expense** and **accounting** modules. * Create two or more expenses, each with **multiple attachments**. * Submit and approve the expenses. * Create the **journal entry** of all approved expenses. * Open the generated journal entry and review its attachments. **Observed behavior:** * Only the **first attachment** from each expense is present on the journal entry. * Additional attachments are missing. **Cause:** * while creating journal entry, the logic of expense iterate on `message_main_attachment_id`. * `message_main_attachment_id` stores only a **single attachment**, so only one file per expense is copied. **Fix:** * Iterate on `attachment_ids` instead of `message_main_attachment_id`. * Ensures **all attachments** from each expense are included in the generated journal entry. opw-5414834 Forward-Port-Of: odoo/odoo#243962 Forward-Port-Of: odoo/odoo#241044
This update fixes a problem with how mass mailing tests wait for the ThemeSelector to load, ensuring more reliable test results. Additionally, the commit optimizes test execution by removing unnecessary assets, reducing test run times by 10-40%.
Original PR description
The ThemeSelector rendering was optimized ([commit]) to minimize UX transition delays for the user, but that makes it a bit tricky to wait for in tests. This commit adds a function to properly wait for everything required to select a theme/favorite by clicking on it, in order to reduce non-determinism in `mass_mailing` tests. [commit]: https://github.com/odoo/odoo/commit/0f7ee1764e8b59029003c6ad7269e185b30c6b43 It also removes some assets loading during `mass_mailing` tests that are not relevant. This helps shave off 10-40% test time per test, depending on the complexity of the test. runbot-error-237513 runbot-error-237747 runbot-error-237769 runbot-error-237770 runbot-error-237772 task-5500038
5 changes
Resolved issues and error corrections
This update fixes a bug that occurred when users attempted to apply a zero-amount discount in sales orders. The issue stemmed from a division-by-zero error. The fix ensures the system handles zero discounts gracefully, preventing errors and maintaining data integrity.
Original PR description
The system raises an error when the user tries to apply a fixed amount discount of 0.0. **Steps to produce:** - Install `Sales` module with demo data. - From the settings enable `discount`. - Make a sale order with product > click on Discount > click Fixed Amount and set amount as `0.0` > click on apply. **Error:** `ZeroDivisionError : float division by zero` **Cause:** - When the discount amount is set to 0.0, at [1] we attempt to compute the factor, which causes an error due to a division by zero. **Solution:** - Added a condition to check that current_base_amount_currency is not zero, and if it is, set the factor to 0.0. [1]: https://github.com/odoo/odoo/blob/10887c3081afbfd0734c6a3ac24301c94d14bc24/addons/account/models/account_tax.py#L3718-L3720 **sentry-6967181350** I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where tax names and invoice labels were displayed in English for Vietnamese users. By adding the necessary Vietnamese translations to the chart template CSV, users will now see tax information in their preferred Vietnamese language, improving the user experience and ensuring accurate reporting.
Original PR description
The `name` and `invoice_label` fields on `account.tax` are translatable fields (translate=True), but the Vietnamese chart template CSV was missing the corresponding translation columns. This caused…
The `name` and `invoice_label` fields on `account.tax` are translatable fields (translate=True), but the Vietnamese chart template CSV was missing the corresponding translation columns. This caused tax names and invoice labels to display in English even when the user's language was set to Vietnamese. By adding the `name@vi_VN` and `invoice_label@vi_VN` columns to the tax template CSV, taxes will now display with proper Vietnamese labels when the chart of accounts is installed for Vietnamese companies, improving the user experience for Vietnamese-speaking users. Technical details: - Added `name@vi_VN` and `invoice_label@vi_VN` columns to the CSV header - Added Vietnamese translations for all tax records in the template - Translations follow Vietnamese tax terminology conventions - The chart template loader automatically processes columns with `@lang` suffix and applies them as translations for translatable fields 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#241681 Forward-Port-Of: odoo/odoo#236502
This update fixes an issue where only the first attachment from an expense was included in the generated journal entry. The change ensures that all attachments associated with an expense are correctly copied, improving accuracy and providing complete financial records. This resolves a previous reporting discrepancy.
Original PR description
**Steps to reproduce:** * Install **hr_expense** and **accounting** modules. * Create two or more expenses, each with **multiple attachments**. * Submit and approve the expenses. * Create the **journal entry** of all approved expenses. * Open the generated journal entry and review its attachments. **Observed behavior:** * Only the **first attachment** from each expense is present on the journal entry. * Additional attachments are missing. **Cause:** * while creating journal entry, the logic of expense iterate on `message_main_attachment_id`. * `message_main_attachment_id` stores only a **single attachment**, so only one file per expense is copied. **Fix:** * Iterate on `attachment_ids` instead of `message_main_attachment_id`. * Ensures **all attachments** from each expense are included in the generated journal entry. opw-5414834 Forward-Port-Of: odoo/odoo#243962 Forward-Port-Of: odoo/odoo#241044
This update resolves an issue where scheduled email notifications and activity updates continued to run even after records were deleted. The fix prevents errors related to attempting to send messages to non-existent records, improving notification reliability and preventing confusing error messages for users. It ensures that deleted records don't cause disruptions in email workflows.
Original PR description
RATIONALE When a cascade delete occurs in DB, ORM methods are not called. More specifically loosely connected records using res_model / res_id pair are not removed when unlink override exists. SPECIFICATIONS Fix various use case in mail * notifications sent for scheduled messages; * failure notifications management; * activities mark as done; Task-5138556 Forward-Port-Of: odoo/odoo#243693 Forward-Port-Of: odoo/odoo#233071
This update addresses a potential issue where deleted records in Odoo could still be accessed, leading to errors. The fix ensures that related records are checked for existence before accessing data from deleted records, primarily due to how cascade deletions are handled in the database. This improves stability and prevents unexpected behavior when records are removed.
Original PR description
In order to be defensive we have to check records linked to messages, notifications or activities exist before checking related information like display_name, or even to skip them in various flows. This happens notably due to DB-level cascade deletion that does not remove side records linked through (model, res_id) pairs. It implies some additional exist queries. Task-5138556 Forward-Port-Of: odoo/enterprise#104243 Forward-Port-Of: odoo/enterprise#101185
6 changes
Enhancements to existing features
This update expands the list of models automatically included in Odoo's preset export configurations. This ensures that the exporter consistently includes essential models, streamlining the process of backing up and restoring Odoo databases. It's a small improvement that enhances data protection and simplifies system recovery.
Original PR description
In this PR we add several models to the **PRESET_MODELS_DEFAULTS** list such that the exporter includes necessary models by default. Forward-Port-Of: odoo/enterprise#86287
Resolved issues and error corrections
This update corrects a terminology issue in our accounting reports. Specifically, it replaces instances of 'VAT' with 'tax' across various locations, ensuring consistent and accurate reporting for US and international users. This change improves clarity and avoids confusion related to tax terminology.
Original PR description
In the US and many other countries, the term "VAT" doesn't really exist. Most countries have their own term to refer to a sales tax or other types of taxes and have already adjusted it via translations. Given that we can't create a translation for en_US just to translate VAT -> Tax, we have to swap the few places that refer to taxes as VAT to actually use tax as it is a more universal term than VAT. task-5401292
This update resolves an error that prevented users from creating and saving bank statements within the accounting module. The issue stemmed from a problem accessing data within the system, now corrected by using a more reliable method for data retrieval. This ensures a smoother experience when managing bank transactions.
Original PR description
We get an owl error: `TypeError: Cannot read properties of undefined (reading 'root').` The code tries to read data from this.env.model, but it is undefined. Steps To Reproduce: 1. Install `account_accountant` 2. Go to Accounting Dashboard > Bank > `...` > Transactions 3. Open in the list view 4. Select any number of transactions 5. Type something in the statement field of one of the rows 6. Press Create and Edit to create a new Statement 8. Save the statement Ticket [link](https://www.odoo.com/odoo/project.task/5352277) opw-5352277 Forward-Port-Of: odoo/enterprise#104072 Forward-Port-Of: odoo/enterprise#101232
This update fixes a display issue in search results, now consistently showing a helpful 'Domain is invalid' message instead of errors. Additionally, the search logic has been optimized for better performance and allows users to easily filter for records that don't meet specific criteria (e.g., 'Is Not Set').
Original PR description
Search method logic was rewritten so since commit:
https://github.com/odoo/odoo/commit/92301a5b300dec1ddfca44dc35318b83d67c56fa
`raise NotImplementedError(_("some text"))`
no longer raises an error nor does it ever show the error message. Instead a notification that says "Domain is invalid. Please correct it" is always displayed when the method is unable to run the search. Therefore we update the legacy way of doing it in these search methods so that the code is clean (i.e. so no one copies it) and to avoid translating strings that will never be visible.
Additionally, the search logic was also updated such that the `value` exists is no longer needed and the `=`/`!=` operators are handled by `in` for optimized code. This change makes it so users can now do the "Is Not Set" search since it will return only the records that do not match the "Is Set" logic.
Forward-Port-Of: odoo/enterprise#104213
Forward-Port-Of: odoo/enterprise#104115This update resolves a technical issue that caused a traceback error when using pivot tables within Odoo's spreadsheet functionality. The fix ensures pivot tables now function correctly, regardless of the data dimensions used, improving spreadsheet usability for users. This improves data analysis and reporting.
Original PR description
Task: 5085724 Forward-Port-Of: odoo/enterprise#103369
This update resolves an issue where FrontDesk hosts with limited access were unable to check out visitors via email. The fix allows the checkout process to run with elevated permissions, ensuring all hosts can successfully complete the visitor checkout. This improves the user experience for FrontDesk staff.
Original PR description
Steps to reproduce: * Create a visitor record with a host who has only FrontDesk user access. * Ensure Notify with Email is enabled on the station. * Click Check Out Visitor from the received email → access error appears. Issue: * Hosts with only FrontDesk user access received an access error when clicking the “Check Out Visitor” button from the email notification. * They were unable to complete the visitor checkout process. Fix: * Run the checkout action with sudo() so the host can successfully check out the visitor from the email link. Impact: * Hosts can now check out visitors without encountering permission errors. task-5373026 Forward-Port-Of: odoo/enterprise#104250 Forward-Port-Of: odoo/enterprise#101179
5 changes
Enhancements to existing features
This update enables public users to register for document sharing when using a 'none' access link, resolving an issue where new users weren't linked to the intended partner. Now, when inviting a member without a user, the system prompts them to create a user that's correctly associated with the partner, streamlining the document sharing process.
Original PR description
Purpose ======= We can share a document to a partner without a user, and with `access_via_link == 'none'`. In that situation, the partner is forced to create a user, but if he clicks on signup, then the new user won't be linked to the partner set on the `documents.access` (a new partner will be created). Now, when inviting a member, if he doesn't have a user, we invite him to create a user. If the partner has a user, then we just redirect him to the login page. Task-5242208 Forward-Port-Of: odoo/enterprise#104374 Forward-Port-Of: odoo/enterprise#100628
Resolved issues and error corrections
This update resolves an issue where copying headings in the knowledge editor caused URL redirection problems. It also improves the editor's responsiveness by reducing unnecessary layout adjustments triggered by mouse movements. These changes enhance the overall stability and usability of the knowledge editor.
Original PR description
### [FIX] knowledge: prevent heading link id duplication on copy/paste Prior to this commit, copy/pasting a heading would preserve its `data-heading-link-id` resulting in mismatches for URL redirections. After this commit, such ids are always reset to guarantee unicity. ### [FIX] knowledge: throttle mousemove for heading link button Prior to this commit, every `mousemove` event could cause a layout trashing to reposition the heading link button. After this commit, the repositioning is debounced at a more reasonable rate. task-5384684 Forward-Port-Of: odoo/enterprise#101445
This update fixes an issue where appointment dates were displayed out of order in the online booking cart. The original fix inadvertently reversed the date order due to how appointment dates were formatted. The change ensures dates are correctly presented, improving the user experience for booking appointments.
Original PR description
**Steps to produce:** - Install `appointment,website_sale` modules. - Go to website > appointment > Online Cooking Lesson. - Book a slot > Proceed to payment. - Open the cart. **Issue:** - The…
**Steps to produce:** - Install `appointment,website_sale` modules. - Go to website > appointment > Online Cooking Lesson. - Book a slot > Proceed to payment. - Open the cart. **Issue:** - The appointment dates are displayed in an incorrect order in the cart. **Root cause:** - In the linked commit, the logic reverses the `self.name` lines to fix a display issue. - However, since appointment dates are split across multiple lines, reversing the list also unintentionally reverses the appointment date order. **Solution:** - Ensure that the appointment dates are formatted to appear on a single line, preventing them from being split into multiple list entries and incorrectly reordered when the lines are reversed. [commit]: https://github.com/odoo/odoo/pull/223433/changes/5b69176e64e6a4cc46966a8c41b675ed3d98dd0a Before: <img width="554" height="138" alt="image" src="https://github.com/user-attachments/assets/3e13a2a5-61d5-48c5-8e6a-85f313f7b6ca" /> After: <img width="566" height="120" alt="image" src="https://github.com/user-attachments/assets/f0b04592-7fd4-4104-b200-cf9b6f080962" /> opw-5420805 ---
This update fixes formatting issues in live chat ticket descriptions created by the chatbot. Previously, system notifications were included, making descriptions difficult to read. Now, only relevant chat messages are used, ensuring clearer and more organized ticket information.
Original PR description
In [1], chat bot's create lead/ticket steps were improved to set the formatted discussion as the lead/ticket description. The same holds for lead/ticket commands. However, the /ticket command was not properly updated. As a result, the discussion is poorly formatted, making it difficult to read. Also, the description should only include relevant messages, not system notifications such as "agent joined the channel". This commit fixes both issues. task-5491212 community: https://github.com/odoo/odoo/pull/243856
This update fixes a confusing error message displayed when cash point closing with Fiskaly fails. The new message now includes the detailed response from Fiskaly, allowing users and support teams to quickly diagnose and resolve issues related to cash point transactions. This improves the user experience and streamlines troubleshooting.
Original PR description
When a cash point closing fails with Fiskaly, the error message shown to the user was not very informative. This commit enhances the error message to include the actual response from Fiskaly, making it easier for users to understand what went wrong. opw-5461084
1 change
Resolved issues and error corrections
This update optimizes the SQL query used to generate the budget report, resulting in significantly faster performance, especially when dealing with large amounts of data. The change avoids a slow query strategy and allows for a more efficient join process, leading to quicker report generation times.
Original PR description
Before this commit, the SQL query generated in `_get_aal_query` utilized a `LEFT JOIN` with a complex `OR` condition on the join clause: `(bl.company_id IS NULL OR bl.company_id = al.company_id)`.…
Before this commit, the SQL query generated in `_get_aal_query` utilized a `LEFT JOIN` with a complex `OR` condition on the join clause: `(bl.company_id IS NULL OR bl.company_id = al.company_id)`. Because this condition lacks a strict equality constraint, the planner cannot build a hash table for the join. Consequently, it is forced to fallback to a Nested Loop Join strategy, evaluating the condition as a filter for every row pair. This results in significant performance degradation on large datasets. This commit optimizes the query by splitting the logic into two separate `SELECT` statements combined with a `UNION ALL`: 1. Matches where `company_id` is explicitly equal. 2. Matches where `company_id` is NULL. By separating these conditions, the planner can now prioritize a Hash Join for the equality check and handle the NULL join separately, significantly reducing execution time. References: - Original PR introducing the logic: https://github.com/odoo/enterprise/pull/82955 - Plan Before (Join Filter): https://explain.dalibo.com/plan/a55476hgb73ea7g6#plan - Plan After (Hash Cond): https://explain.dalibo.com/plan/3b9g484569a86efb#plan opw-5460862