Daily updates from Odoo
Monday, November 24, 2025
24 changes · master
Enhancements to existing features
Signing templates now organize their field definitions in a dedicated extension point, making future adaptations easier to maintain. This mainly helps teams and partners customize signing workflows with less risk when applying updates.
Original PR description
Introduced a dedicated _getTemplateFields() method to make easier to override or extend the fields in patches. Forward-Port-Of: odoo/enterprise#100096 Forward-Port-Of: odoo/enterprise#95722
The spreadsheet version history panel now uses tile colors with better contrast in dark mode. This makes previous versions easier to read and reduces visual strain for users working with dark mode enabled.
Original PR description
Change the color of the tiles of the version history to have a better contrast in dark mode. Task: [5265478](https://www.odoo.com/web#id=5265478&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form)
Sent email records now keep the exact address used when contacting a recipient. This prevents past notification details from changing if the recipient's partner email is updated later, improving auditability and clarity.
Original PR description
Purpose ======= When we send an email to a partner, we don't store the email used. So if we change the email of the partner, then the email shown in the mail notification won't be accurate anymore. Now, we store that email in `mail_email_address`. Task-5215602
Toolbar buttons in Web Studio now display their matching keyboard shortcuts in their tooltips. This helps users discover faster ways to work and makes common editing actions easier to learn.
Original PR description
This PR updates toolbar button tooltips to display their corresponding keyboard shortcuts. Community PR: https://github.com/odoo/odoo/pull/233741 task-5160025
Resolved issues and error corrections
Uninstalling the Databases module no longer leaves behind a project access rule that refers to removed database fields. This prevents an error during uninstall and helps keep the system stable when customers remove the module.
Original PR description
Currently an error occurs when user uninstalls the `databases` module. **Steps to replicate:** * Install and uninstall databases **Error:** `ValueError: Invalid field project.project.database_hosting…
Currently an error occurs when user uninstalls the `databases` module.
**Steps to replicate:**
* Install and uninstall databases
**Error:**
`ValueError: Invalid field project.project.database_hosting in condition ('database_hosting', '=', False)`
**Root cause:**
* This error happens because when the user installs `databases`, record rule [1] is created by the module and it overrides rule [2]. Later, when databases is uninstalled, rule [1] is still there, but it tries to access the field 'database_hosting' [3], which was removed during the uninstall. Since that field no longer exists, it causes an error.
**Solution:**
* Revert the domain back to the one defined in project module.
[1]:
https://github.com/odoo/enterprise/blob/437f724c182ddf22bd3df9a7e1582ffa4b29e33b/databases/security/databases_security.xml#L43-L46
[2]:
https://github.com/odoo/odoo/blob/9333df06e15134df92efed765cf95db38c0dfede/addons/project/security/project_security.xml#L57-L62
[3]:
https://github.com/odoo/enterprise/blob/437f724c182ddf22bd3df9a7e1582ffa4b29e33b/databases/models/project_project.py#L17-L26
sentry-7035410943
Forward-Port-Of: odoo/enterprise#99987Budget values in accounting reports now show the same rounded amount when viewed and edited. This prevents confusing extra decimal digits from appearing in budget input fields, making report updates clearer for users.
Original PR description
**Issue:** When editing budget values in the Profit & Loss report, users see floating-point precision errors (e.g., 0.999999 instead of 1.00) in the input field, even though the display shows the…
**Issue:** When editing budget values in the Profit & Loss report, users see floating-point precision errors (e.g., 0.999999 instead of 1.00) in the input field, even though the display shows the correct rounded value. **Steps to Reproduce:** 1. Go to Accounting → Reporting → Profit and Loss Report 2. Enable Column Budget 3. Enter budget value: 5.00 4. Save → Value displays correctly as: 5.00 ✓ 5. Click to edit the same cell 6. Input field shows: 5.000000000174602 ✗ (instead of 5.00) 7. Save without changes → Display shows: 5.00 ✓ 8. Edit again → Still shows: 5.000000000174602 ✗ **Root Cause:** The frontend reads from cell['no_format'] when populating the edit input field. This field receives the raw column_value which contains floating-point precision errors accumulated during aggregation operations. While the display formatting applies rounding, the edit mode receives the unrounded value. **Solution:** Round column_value using float_round() immediately after detecting an editable budget column, before the value is used anywhere. This ensures both the display path and edit path receive the same properly rounded value based on the company's currency decimal places. opw-5158862 Forward-Port-Of: odoo/enterprise#98478
Invoice reports now keep section amounts aligned correctly when the Country of Origin column is displayed. This prevents confusing invoice layouts and helps users read totals accurately.
Original PR description
Before this commit when having section and the country of origin column, the amount was is the wrong place. The solution is to add 1 to the line colspan when display origin is set. opw-5333624 Forward-Port-Of: odoo/enterprise#100012
This update removes duplicate internal methods identified by automated code checks. It helps keep the affected HR payroll, salary contract, and expense processing areas easier to maintain, with no expected change for day-to-day users.
Original PR description
found by pylint 4 Forward-Port-Of: odoo/enterprise#100078 Forward-Port-Of: odoo/enterprise#99809
Swiss Federal Tax Administration exchange rates are now saved with the correct publication date instead of a later validity date. This prevents rates from appearing under the wrong day, improving accuracy for companies using Swiss currency rate updates.
Original PR description
Steps to reproduce: - Select exchange service: [CH] Federal Tax Administration (FTA). - Add USD (or other currencies). - Fetch the new rates (click on the reload icon). Issue: Rates are returned for yesterday but stored with today’s date. Cause: The request fetches yesterday’s rates and we store the date using `gueltigkeit` (valid-until). FTA rates are typically valid until the next morning (around 7 AM) or until the next business day on weekends. Example (fetch on Fri 14.11.2025): <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> For example, if we fetch on the 14th (Friday), we get this value: <gueltigkeit>15.11.2025,16.11.2025,17.11.2025</gueltigkeit> Solution: Query the FTA endpoint using today’s date and store the rate date from `datum` (publication date) instead of `gueltigkeit`. opw-5189127 Forward-Port-Of: odoo/enterprise#100046
Swiss payroll test coverage was adjusted so it no longer depends on accounting configuration being present. This helps ensure payroll validation and related declarations can be tested more reliably without unnecessary accounting setup requirements.
Original PR description
Forward-Port-Of: odoo/enterprise#99853 Forward-Port-Of: odoo/enterprise#98672
This update fixes how default filing deadlines are configured for multiple country-specific Intrastat and tax return reports. It helps ensure each company uses the correct return deadline settings, reducing configuration errors in localized reporting.
Original PR description
The fields default_deadline_periodicity and default_deadline_days_delay have been added on the return type model because they handle the company dependant property of their associated field, and they are the ones that should be used in the xml. Forward-Port-Of: odoo/enterprise#99793
Spreadsheet version history tiles now use colors with better contrast in dark mode, making past versions easier to read. Related spreadsheet document tests were also updated to match the latest resizing behavior, helping keep the feature reliable after the spreadsheet engine update.
The update corrects an internal test for Belgian SODA accounting imports by ensuring the needed analytic setup is created during the test. This helps keep automated quality checks reliable and prevents false failures in development pipelines.
Original PR description
This https://github.com/odoo/enterprise/commit/e01d865d922d47d8ba1638a48e6d481363fc1f04 introduced an error while running the test without enough analytic accounts. We instead manually create the analytic plan and accounts required for the test. runbot-234353
The VoIP keypad input now uses a better font size when it is empty, so its placeholder text displays correctly. This makes the calling interface clearer and avoids confusing clipped guidance for users entering a number.
Original PR description
In https://github.com/odoo/enterprise/pull/99877, the font size for the Keypad input was fixed to a value suitable for most cases. Still it is problematic when the input is empty: the placeholder is not fully displayed. Here we set an appropriate value for the font size in that later case.
This fixes an issue in the Sign app where a signer could see date placeholders meant for later signers. The change helps keep the signing experience clearer and avoids confusion during multi-signer document workflows.
Original PR description
Version: - saas-18.3 Steps to reproduce: - Add date fields for multiple signers. - When the first signer signs, the date placeholder for the next signer becomes visible to the first signer. Issue: - Date fields for next signers were showing placeholders to the current signer. Fix: - Added a condition to only set the placeholder when it has a valid value. Impact: - Ensures date placeholders are visible only to the correct signer. task-5218970 Forward-Port-Of: odoo/enterprise#100252 Forward-Port-Of: odoo/enterprise#98256
Opening the translation widget for invoice terms and conditions no longer triggers an error when those terms are made translatable by GCC invoice localization. This helps users edit translated invoice text without interruption.
Original PR description
With l10n_gcc_invoice, the narration field on invoice (the Terms & Condition part) becomes translatable. However, when opening the translation widget, a traceback happens as the "fields" (the text-to-fill part) to load don't have a specified name. opw-5269869 Forward-Port-Of: odoo/enterprise#100003
Composite financial reports now apply the analytic grouping filter consistently to their underlying sections. This ensures the filter appears in the interface when enabled, giving users the expected reporting options without extra setup.
Original PR description
When using a composite report whose sections aren't used independently, enabling that filter on the composite report needs to enable it on their sections as well, else it won't show in the UI. This is the standard behavior for all report filters. Forward-Port-Of: odoo/enterprise#100135
This fixes an internal payroll accounting test so it uses the right company when checking account-related partner settings. It helps ensure Belgian payroll accounting remains reliable in multi-company situations, reducing the risk of incorrect accounting configuration going unnoticed.
Original PR description
We are now testing for consistency between the company properties set on partners related to accounting values. opw-5127901 Forward-Port-Of: odoo/enterprise#100192
This update prevents an error when Stripe webhook events include virtual cards with no shipping details. It helps expense card events process reliably instead of failing on missing shipping information.
Original PR description
Add a fix to a pattern of error found in webhook events where virtual cards whose shipping value is "None" would be accessed as dict Forward-Port-Of: odoo/enterprise#100291
Code cleanup and technical improvements
The WhatsApp integration was updated to stay aligned with recent internal changes to how conversation member lists are handled. This keeps WhatsApp-related discussions working consistently after the underlying platform refactor, with no expected change for end users.
Original PR description
This commit adapts the whatsapp code to account for the refactoring of `hasMemberList`. Pr community: https://github.com/odoo/odoo/pull/236510
This update standardizes how XML files are checked and refreshed in electronic invoicing tests for Guatemala and Mexico. It helps developers maintain these compliance-related tests more reliably, reducing the risk of errors when invoice formats or rules change.
Original PR description
This commit adds helpers and improves on the way we assert XML files in `AccountTestInvoicingCommon` and all accounting test that extend from it. From now on, all accounting test code that assert an…
This commit adds helpers and improves on the way we assert XML files in `AccountTestInvoicingCommon` and all accounting test that extend from it. From now on, all accounting test code that assert an XML tree/string to an XML file should call the `assert_xml` helper, and design their test file name/location/etc. around this framework. This approach has a few major benefits: ### Assert / Save XML When testing XML files, we often need to perform create/read/update operations on the asserted XML to make sure it corresponds to the most updated/intended data. Previously, to save something to an XML, a developer would need to write their own local helpers to save the XML in the right directory. This was cumbersome and error-prone, so we decided to design a helper that allows developer to immediately save AND/OR update the asserted XML: to save/update an XML, we can simply add `SAVE_XML` as an additional test tags. ### Better test naming and optional subfolder management To better organize test files, the `assert_xml` method allows us to write just the test key name (without `.xml`), and the framework will automatically get the XML to assert/save from the `test_files` directory. An optional `subfolder` parameter is also added to allow writing to specific subfolder within `test_files`. ### Better `___ignore___` management in assertion XMLs Sometimes, we want to ignore a few XML node that are not relevant, or have content that are not deterministic (changes on every test run). To handle this, previously, developers would need to modify the assertion XML content by hand or write their own local script to do so. With this new framework, we just need to add an `ignore_schema.xml` file somewhere in the `test_files` directory. If put inside a subfolder, it will be applied with more priority towards the XML that are put on that specific subfolder. ### Save "pure" XML (before applying `___ignore___`) in temporary folder When calling `SAVE_XML`, before applying the ignore patches, the XML will be saved in a temporary folder (same folder as the screenshots for tours), so that developers can use them in external tests in the future, and for any other saving reasons. In addition, this commit also: - add `edi_tags` helper to save all the common tags for EDIs, which also enables `EXTERNAL_MODE` testing inspired by `l10n_mx_edi` - convert some non-assert XML test helpers into a class method - add `XmlCollector` exception to be used to stop a method and collect an XML data for tests in EDIs. (see `l10n_gt_edi`) - refactor `l10n_mx_edi*` modules to use these helpers related-community-PR: https://github.com/odoo/odoo/pull/235565 task-4891206
This update removes an outdated internal messaging function from WhatsApp and Mexican e-invoicing areas. It aligns Enterprise code with the main Odoo platform cleanup, reducing maintenance overhead without expected changes for end users.
Original PR description
\* = whatsapp, l10n_mx_edi Enterprise counter-part. task-5347566 https://github.com/odoo/odoo/pull/236778
This change reorganizes how WhatsApp conversation member online and offline status information is stored in the messaging system. It should not change day-to-day behavior for users, but it helps keep the codebase cleaner and easier to maintain for future improvements.
Original PR description
PR community: https://github.com/odoo/odoo/pull/235248
The option for preparation printers connected through IoT has been moved into the dedicated POS IoT module. This keeps point-of-sale IoT features organized in the right place, making configuration and maintenance more consistent without changing the overall business workflow.
Original PR description
In order to improve consistency between modules, we moved the IoT preparation printer option to the `pos_iot` bridge module. see odoo/odoo#234883 Task: 4954046