Wednesday, June 3, 2026
125 changes
5 changes
Resolved issues and error corrections
This update ensures that email backgrounds remain consistent with the selected theme color, even after website palette changes. Previously, a new palette update would overwrite the originally set background color in sent emails. This fix maintains the intended design and prevents unexpected color variations.
Original PR description
When a mass mailing block uses a `bg-o-color-N` theme color class, the mailing's `body_arch` stores the class and `convert_inline` correctly inlines the resolved color into `body_html`, matching the…
When a mass mailing block uses a `bg-o-color-N` theme color class, the mailing's `body_arch` stores the class and `convert_inline` correctly inlines the resolved color into `body_html`, matching the website palette at save time. The class also stays on the element in `body_html`. The stylesheet rule that gives `bg-o-color-N` its color is declared with `!important`. When the website palette is later rebuilt (any change to the primary colors), the new `bg-o-color-N` rule wins over the inline color whenever `body_html` is rendered. So an already-sent mailing reopened in the backend shows the new palette's color instead of the one that was picked, and resaving the mailing bakes that new color into `body_html`. `classToStyle` already does the right thing for the property value. What was missing is dropping the class itself from `body_html` once its style has been inlined, so no future `!important` palette rule can override the inline color. `body_arch` keeps the class, so the editor preview stays theme-aware while editing, but `body_html` is now stable across palette rebuilds. Steps to reproduce: 1. Open Email Marketing and create a new mailing using the Welcome Message template 2. Select a content block, open Customize, set the background to the 5th theme color 3. Save the mailing 4. Open the Website editor and change the 5th primary color to a different value 5. Reopen the saved mailing in the backend => the block's rendered background follows the new website color instead of the one picked at design time Ticket [link](https://www.odoo.com/odoo/project.task/5892350) opw-5892350 Forward-Port-Of: odoo/odoo#267570 Forward-Port-Of: odoo/odoo#253934
This update fixes an issue where order names weren't correctly updated when a customer (partner) was changed on an existing order, particularly in scenarios like Delivery/Eat In presets. The fix ensures that order names accurately reflect the current customer, improving order clarity and data consistency.
Original PR description
When a partner is changed on an order that was previously named after another partner (e.g. in a Delivery/Eat In preset scenario), the order name was not updated. This was because once `floating_order_name` is set, the order is no longer considered a "direct sale", and the logic to update the name from the partner was bypassed. This commit updates `setPartner` to check if the current name matches the name of the previous partner. If so, it updates the name to the new partner's name. task-id: 6000287 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#267044 Forward-Port-Of: odoo/odoo#251811
This update corrects a visual issue in German invoices (DIN5008) where columns were misaligned after hiding the item composition. Enabling the 'Show Position Column in Reports' setting resolved this, ensuring invoices print with correctly aligned data. This improves the professional appearance of invoices for our German clients.
Original PR description
| Before | After | |--------|--------| | <img width="1573" height="830" alt="image" src="https://github.com/user-attachments/assets/1960b51b-5c3e-4560-bd09-a20adfe2b381" /> | <img width="1573" height="830" alt="image" src="https://github.com/user-attachments/assets/565d0238-a295-44b7-bdaa-e7c6dd1200cf" /> | Steps to reproduce ================== - Install l10n_din5008,l10n_de - Use a german company - Go to settings - Enable "Show Position Column in Reports" - Go to Invoicing > Sales > New - Add a new section - Click on the three dots - Check "Hide composition" - Add a new line with a product - Confirm the Journal Entry - Print the Invoice PDF => Every column after the description is offset by one opw-5427590 Forward-Port-Of: odoo/odoo#261527
This update resolves an issue where paying a PL supplier without a VAT number on invoices over 15,000 PLN would trigger an error. The fix adds a check to prevent unnecessary verification creation, improving the stability of the bank verification process for PL suppliers.
Original PR description
[FIX] l10n_pl_bank_verification: PL Supplier no VAT When a PL supplier has no VAT and a PL company tries to pay him a bill above 15.000 PLN, there is a traceback. The reason is that there was no check for partner with no VAT, a verification was created every time the field was compute. Forward-Port-Of: odoo/odoo#267888 Forward-Port-Of: odoo/odoo#266878
This update fixes a technical error in Odoo's internal tools that could cause a crash when copying data. The issue stemmed from how Python 3.14 handles weak references during copying, leading to a runtime error. The fix utilizes a more reliable method for copying the data, ensuring stability and preventing future disruptions.
Original PR description
In Python 3.14, iterating over weak references (like `transaction.envs`) can trigger a `RuntimeError: dictionary changed size during iteration`. This happens mostly because the Garbage Collector can remove a weakref while `OrderedSet.copy()` is rebuilding the set via `dict.fromkeys()`. Instead of re-initializing the set by iterating over its elements, we now directly use the dictionary's native `.copy()` method. This atomic operation prevents the GC from modifying the size of the underlying `_map` during the copy. Forward-Port-Of: odoo/odoo#267947
2 changes
Resolved issues and error corrections
This update fixes a previous limitation where channel owners without system admin privileges couldn't promote members to admin roles. The change ensures that channel owners can now correctly assign admin access, improving channel management capabilities. This resolves a usability issue for channel administrators.
Original PR description
`canSetAdmin` was checking the target member role instead of the current user's role. Because of that, a channel owner who was not a system admin could not promote another member to admin. task-6250058 Forward-Port-Of: odoo/odoo#266615
This update fixes a technical issue in Odoo related to Python 3.14's garbage collection. Specifically, it prevented a runtime error that occurred when copying data structures using an `OrderedSet`. The change utilizes a more reliable copying method to avoid conflicts with the garbage collector, ensuring data integrity.
Original PR description
In Python 3.14, iterating over weak references (like `transaction.envs`) can trigger a `RuntimeError: dictionary changed size during iteration`. This happens mostly because the Garbage Collector can remove a weakref while `OrderedSet.copy()` is rebuilding the set via `dict.fromkeys()`. Instead of re-initializing the set by iterating over its elements, we now directly use the dictionary's native `.copy()` method. This atomic operation prevents the GC from modifying the size of the underlying `_map` during the copy. Forward-Port-Of: odoo/odoo#267947
2 changes
Resolved issues and error corrections
This update corrects a technical issue where message authors were sometimes incorrectly identified. The change ensures that the correct user (partner or guest) is always used as the message author, improving the reliability of message attribution. This resolves a potential inconsistency in how message authorship is tracked.
Original PR description
A message's author is identified by one of two fields depending on its model: `author_id` (for partners) or `author_guest_id` (for guests). Previously in `changeThread`, the value of `thread.effectiveSelf` (which can be either a Partner or a Guest) was provided as the `author_id` regardless of its actual model. This commit explicitly uses `store.self_partner` as the `author_id` and `store.self_guest` as the `author_guest_id` to resolve the occasional mismatch. Forward-Port-Of: odoo/odoo#267464
This update ensures that activity labels in the Chatter interface always display the correct information, even when the default summary is removed. Previously, the system only stored the summary, leading to blank labels. Now, both the summary and display name are stored, guaranteeing accurate activity labels for users.
Original PR description
Before this commit: --- - Chatter activity display used [`summary`](https://github.com/odoo/odoo/blob/4ba8950c25452cfe3310d40c26bd359c27f6c576/addons/mail/static/src/core/web/activity.js#L42) to get…
Before this commit: --- - Chatter activity display used [`summary`](https://github.com/odoo/odoo/blob/4ba8950c25452cfe3310d40c26bd359c27f6c576/addons/mail/static/src/core/web/activity.js#L42) to get the display name. - If `summary` was empty, it fell back to [`display_name`](https://github.com/odoo/odoo/blob/4ba8950c25452cfe3310d40c26bd359c27f6c576/addons/mail/static/src/core/web/activity.js#L44). - However, `_to_store` only [stored](https://github.com/odoo/odoo/blob/4ba8950c25452cfe3310d40c26bd359c27f6c576/addons/mail/models/mail_activity.py#L680) `summary`. - As a result, nothing was shown when `summary` was empty, even though `display_name` was set. Steps to reproduce: --- - Create an activity in chatter - Remove the default summary if set. - Observer the title. https://github.com/user-attachments/assets/1684feb7-02d0-4ac1-9c00-d2aaae88e045 After this commit: --- - Added `display_name` to `_to_store` along with `summary`. - Chatter activity now correctly falls back to `display_name`. - Users can now see the correct activity label in chatter. OPW: 6212976 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#266706
1 change
Resolved issues and error corrections
This update fixes an issue where negative line items in the MX CFDI tax reporting were incorrectly distributed. The change is necessary due to new features added to the module. This ensures accurate tax calculations for Mexican businesses using the CFDI standard.
Original PR description
In MX CFDI, negative lines are not allowed so they are distributed over other lines. But because this PR introduces some other `special_type` like `global_discount` and `down_payment`, it becomes useless to check `base_line['special_type'] == False`. Fix for https://github.com/odoo/odoo/pull/267435 task-5900496 --- I confirm I have signed the CLA and read the PR guidelines at [www.odoo.com/submit-pr](http://www.odoo.com/submit-pr)
1 change
Resolved issues and error corrections
This update corrects a minor error in the date interval inversion function, ensuring it handles a wider range of input values accurately. The fix includes new test cases to verify correct behavior across various scenarios, preventing potential issues with date calculations.
Original PR description
The [commit] introduced the method for inverting the interval inside the given limits. The method was failing for the following edge cases: ```python >>> invert_intervals([(1, 2), (4, 5)], 0, 10) result - [(2, 4), (5, 10)] expected - [(0, 1), (2, 4), (5, 10)]? >>> invert_intervals([(-2, -1)], 0, 10) result - [(0, 10)] expected - same >>> invert_intervals([(11, 12)], 0, 10) result - [] expected - [(0, 10)] >>> invert_intervals([(-1, 1), (2, 5), (8, 12)], 0, 10) result - [(1, 2), (5, 8)] expected - same >>> invert_intervals([(2, 5), (8, 12)], 0, 10) result - [(5, 8)] expected - [(0, 2), (5, 8)] >>> invert_intervals([(2, 5), (11, 12)], 0, 10) result - [] expected - [(0, 2), (5, 10)] ``` This commit fixes the function to correctly handle all the cases. The test cases are also added to test all the edge cases. [commit]: https://github.com/odoo/enterprise/commit/53450065be0c3ec9d648d4fd39ec3a9a912bd06c
2 changes
Resolved issues and error corrections
This update resolves a problem where users accessing archived documents through certain methods (like widgets or direct URLs) would incorrectly display a 'not found' message. This fix ensures that archived documents are correctly displayed, improving the user experience when accessing older records. It's a follow-up to previous improvements related to document handling.
Original PR description
When a user tries to access an archived document via * a many2one widget * `/odoo/documents.document/<id>` * a discuss notification they end up in "All" with a toast specifying that the document was not found. Follow-up of Task-6068437 (follow up of Task-5386466). Task-6214488 Forward-Port-Of: odoo/enterprise#117229
This update resolves an issue preventing accurate order data synchronization from Point of Sale (POS) systems. The fix corrects a typo and updates the system to correctly identify invoices as 'done' rather than 'invoiced', ensuring reliable data transfer. This improves the integration between POS and accounting systems.
Original PR description
In this commit: - Update `read_pos_data` to check `done` state for invoicing instead of `invoiced` state - Load `account.move` model instead of `account_move` (fix typo) Task-5887318
6 changes
New functionality added to Odoo
This update introduces the ability to print reports directly from Obox devices, mirroring functionality for IoT printers. The system now presents a popup allowing users to select a printer for each report, ensuring reports can be printed regardless of network connectivity. Currently, this implementation is simplified with limitations on printing multiple documents at once.
Original PR description
This commit adds report printing support for Obox printers, similarly to what already exists for IoT printers. A report can be linked to a printer, and then when printing a popup is shown to select from the linked printers. For now the implementation is intentionally simpler than the IoT equivalent, in the following ways: - Only one printer can be printed to at a time, not multiple. - The user cannot save preferences for which printer is selected, instead the popup to select a printer is shown every time. - There is no option to disable duplex (this will require an Obox change first). The print job uses a queue action so it does not rely on the user being on the same network as the Obox. task-6241709
Enhancements to existing features
This update refreshes the visual appearance of snippet thumbnails in the web editor, enhancing their design and clarity. The new thumbnails provide a more modern and intuitive representation of each snippet category, improving the overall user experience.
Original PR description
*: website_sale_renting This commit updates the snippet thumbnails in the web editor with new more modern designs. The updated thumbnails are more visually appealing and provide a clearer representation of each snippet category. task-5868664 Requires: - https://github.com/odoo/odoo/pull/246564
Resolved issues and error corrections
This update clarifies how subscription prices are set up. Previously, the system automatically filled in pricelists, leading to user confusion about price scope. Now, users manually select the pricelist, eliminating errors and simplifying the subscription pricing process.
Original PR description
When adding a new pricing rule on a subscription product (either from the product form's Prices tab or from the subscription plan's Pricing page), we was pre-filling the pricelist field with the company's first available pricelist. This caused confusion because users assumed the price would apply to all pricelists, while it was actually scoped to that one pricelist only. This led to broken combinations on the eCommerce product page and required an extra manual step to clear the pricelist for each rule added. task-6154318
This update automatically fixes formatting issues in the Obox modules, ensuring consistent code style. The changes were made to improve code readability and maintainability, aligning with our development standards. This work is part of an automated process enforced by Odoo's linting system.
Original PR description
This commit fixes all Prettier formatting errors in the Obox modules. The lint check itself is enforced in odoo/odoo#267994.
This update optimizes the way Odoo calculates the display of work orders, specifically within the MRP module. By changing a selector used in the code, the system now recalculates styles more efficiently, leading to faster performance during common actions like resizing windows or scrolling through large tables.
Original PR description
Avoid using the :has() selector and use a specific class on the body instead to replicate the same behavior, this reduces work during the "Recalculate Style" phase. It lowers recalculation time during window resizes, heavy scrolling, and table sorting by preventing broad selector matches and limiting style checks to elements with the specific class. Forward-Port-Of: odoo/enterprise#119024 Forward-Port-Of: odoo/enterprise#118618
A test was failing due to a limitation in how the POS system loads partner data. This fix ensures that all partners are properly searched for, resolving the test failure and improving the reliability of the point-of-sale tax functionality. This primarily impacts the US partner search functionality.
Original PR description
**Issue:** `test_pos_fiscal_position_without_pos_avatax` test is failing with demo data because a US partner is created and searched for in the tour, but only the first 100 partners (alphabetically ordered) are loaded in the POS. Therefore, he's not found. runbot-938983 Forward-Port-Of: odoo/enterprise#118345
1 change
Resolved issues and error corrections
This update resolves an issue where an error was incorrectly triggered when setting intrastat codes on product templates. The fix ensures the error is only raised when a product template lacks variants and uses dynamic attributes, aligning with the correct process for storing intrastat codes on product variants.
Original PR description
Problem: When saving an intrastat code on a product template with no variants, an error should be raised because intrastat codes are stored on the product variants. However, the error gets raised when creating a product template with intrastat code set because the variants get created after the product template is created, so it doesn't find any variant although the default variant will be created right after saving the product template. Solution: The constraint should only be triggered when saving the intrastat code on a product template with dynamic attributes and no variants. Since dynamic attributes are the only ones that can lead to a product template with no variants, we can check if the product template has dynamic attributes and no variants before raising the error. Forward-Port-Of: odoo/enterprise#118986
3 changes
Resolved issues and error corrections
This update fixes a display issue where negative extra prices on combo items were incorrectly shown with a '+' sign or incorrect currency formatting. The change ensures that negative prices are consistently and accurately displayed, improving the clarity and accuracy of the point-of-sale and kiosk interfaces.
Original PR description
When a combo choice has a negative extra price, the POS and Kiosk would incorrectly display a '+' sign in front of the negative price (e.g., '+ -0,30 €'). Additionally, depending on the currency formatting rules, a negative price might be displayed with the minus sign after the currency symbol (e.g., '$ -1.00'). This commit fixes this by conditionally displaying the '+' sign only when the extra price is strictly positive, and handling the minus sign manually to ensure it is always prepended correctly (e.g. '- $ 1.00'). task-id: 6226406 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes a bug where online orders with 'tax included' products were incorrectly calculating prices. The fix ensures that the displayed unit price and tax-inclusive price accurately reflect the total cost of the product, including the applicable tax. This improves order accuracy for UrbanPiper integrations.
Original PR description
Steps to reproduce: --- - Configure Point of Sale with UrbanPiper credentials. - Sync a product priced at 100 with a 5% GST (tax type = Tax Included). - Place a test order. Issue: --- - Wrong calculation in order line: - unit_price: 95.24 - Tax Excl. price: 90.70 - Tax Incl. price: 95.24 - Expected: - unit_price: 100 - Tax Excl. price: 95.24 - Tax Incl. price: 100 Cause: --- - While computing the unit_price with Tax Included, the tax amount was not added back. Fix: --- - Ensure unit_price includes the tax amount when tax type is Tax Included. task-5031196
This update fixes a potential error that could occur when copying data within the Odoo tools module in Python 3.14. The fix ensures the copy operation is performed reliably, preventing a runtime error caused by the Python Garbage Collector. This improves the stability and reliability of the tools.
Original PR description
In Python 3.14, iterating over weak references (like `transaction.envs`) can trigger a `RuntimeError: dictionary changed size during iteration`. This happens mostly because the Garbage Collector can remove a weakref while `OrderedSet.copy()` is rebuilding the set via `dict.fromkeys()`. Instead of re-initializing the set by iterating over its elements, we now directly use the dictionary's native `.copy()` method. This atomic operation prevents the GC from modifying the size of the underlying `_map` during the copy. Forward-Port-Of: odoo/odoo#267947
2 changes
Resolved issues and error corrections
This update resolves an issue where spreadsheet formulas in the accounting module were sending incorrect data types to the server, leading to errors. Now, all company IDs are automatically converted to numbers, ensuring formulas work correctly regardless of the input format (string or number).
Original PR description
Current behavior before PR: - The `ODOO.CREDIT`, `ODOO.DEBIT`, and `ODOO.BALANCE` formulas passed `companyId.value` directly to the server without converting it to a number. - If a user passed company_id as a string (e.g., '1' from a cell), it was sent to the server as a string, causing a server error. Desired behavior after PR is merged: - `companyId` is converted using toNumber() before being passed to the getter and the server, so '1' becomes 1. - null is preserved as-is (no company filter) while any non-null value is safely cast to an integer. Task: [6240005](https://www.odoo.com/odoo/project/2328/tasks/6240005) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update addresses a technical bug related to how Odoo copies data using OrderedSets in Python 3.14. The fix ensures that the copy process is more stable by utilizing the dictionary's native copy method, preventing errors caused by the Python Garbage Collector. This improves the reliability of Odoo's internal data management.
Original PR description
In Python 3.14, iterating over weak references (like `transaction.envs`) can trigger a `RuntimeError: dictionary changed size during iteration`. This happens mostly because the Garbage Collector can remove a weakref while `OrderedSet.copy()` is rebuilding the set via `dict.fromkeys()`. Instead of re-initializing the set by iterating over its elements, we now directly use the dictionary's native `.copy()` method. This atomic operation prevents the GC from modifying the size of the underlying `_map` during the copy.