Daily updates from Odoo
Thursday, October 2, 2025
58 changes · 19.0
Resolved issues and error corrections
The salary calculator no longer crashes when a working schedule is removed. If no schedule is selected, it uses the company schedule by default so users can continue configuring benefits and sharing offers without interruption.
Original PR description
#### Steps to Reproduce In Payroll → Employees → Salary Calculator: 1. Select an employee with a working schedule. 2. The working schedule is auto-filled in the modal. 3. Remove the working schedule. #### Issue A traceback occurs because the flow tries to recompute work entries with an empty calendar in the Salary Calculator. The purpose of this PR is to make the Working Schedule field optional, with the company's schedule as default when it's empty. #### Fix - Always attach `salary_simulation=True` in the base `_get_version()` and propagate the context when creating a new version for the simulation employee, to avoid unnecessary work entry recomputations. - The Working Schedule field is no longer required: it now has a placeholder and defaults to the company’s calendar when left empty. - The "Configure Benefits" and "Copy Link" buttons are now always enabled since there's always a working schedule (company's schedule is required). task-5063150
This fix corrects how withholding tax adjustments are calculated in Belgian payroll. It helps ensure employee payslips and related payroll accounting use the right tax amounts, reducing the risk of incorrect payments or reporting.
Original PR description
This commit fixes the withholding tax adjustment computation. task-5112828
Opening Time Off from an employee profile no longer triggers a Missing Record error. This ensures users can access leave information reliably from their profile without interruption.
Original PR description
**Steps to reproduce (without demo data):** - Install hr_holidays - Go to "My Profile" - Open "Time Off" **Issue:** Accessing Time Off from a user profile triggers a `Missing Record` error. **Cause:** The system was passing the user’s active_id to the employee record incorrectly. **Fix:** Now, when the context's active_model is 'hr.employee', the correct active_id is applied. **Commit issue:**https://github.com/odoo/odoo/pull/225839 Forward-Port-Of: odoo/odoo#229497
Payroll users can now generate payslips from a pay run with multiple employees without encountering an error. The fix updates payroll processing to use the current work entry date field, helping teams complete payroll runs smoothly.
Original PR description
Steps to reproduce: - In the Payroll app, go to Pay Runs - Select a pay run with several employees in it - Click on "Generate Payslips" - Get a traceback Reason: The function responsible to generate payslips did not get updated when the fields "date_start" and "date_stop" where replaced by "date" in work entries, causing the error. How it was fixed: Changed "date_start" and "date_end" in the condition to "date" Task ID: 5084666
Marketing automation email templates have been updated to work with the latest email building blocks. This helps ensure campaign, trial, partnership, discount, and website sales emails keep their intended layout and presentation.
The vehicle kanban view now correctly shows and uses the contracts button. This helps fleet users access vehicle contract information reliably from the overview screen.
Original PR description
Fix contracts button in vehicle kanban Task-5109335 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228341
This fix makes employee record handling more reliable when databases contain unusual or inconsistent version information. It helps prevent HR processes from being affected by edge cases in employee data history.
Original PR description
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
This fix corrects the styling of the Belgian payroll holiday attestation screen so it appears as intended. It helps employees and HR users view the holiday attestation information more clearly after a previous UX update used the wrong layout classes.
Original PR description
We recently fixed the UX of holiday attest but the classes used in xml were wrong. We fix this in this task. Task: 5109176
The Belgian payroll employee view now uses the correct styling for holiday certificates. This fixes a recent display issue so HR users see the holiday attest information as intended.
Original PR description
We recently fixed the UX of holiday attest but the classes used in xml were wrong. We fix this in this task. Task: 5109176
The Point of Sale order search now shows paid orders only from the current register setup or its trusted related registers. This prevents staff from seeing unrelated paid orders from other PoS configurations, reducing confusion and keeping order lookup results relevant.
Original PR description
Before this commit, when searching paid orders in the PoS UI, orders from other configs could appear even if they were not part of the trusted configs or the same PoS config. This commit ensures that only orders related to the current PoS configuration (or its trusted configs) are loaded and displayed. opw-5083747 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228691 Forward-Port-Of: odoo/odoo#227709
Batch updates to message followers now handle removals correctly. This prevents some records from keeping or losing followers incorrectly when multiple records are updated at once, improving consistency in Mail notifications and subscriptions.
Original PR description
When updating `message_partner_ids` on a batch of records, the previous implementation of the inverse method could lead to incorrect results if the new value implied unsubscription. The `message_unsubscribe()` method, called inside the loop over the records, unlinks `mail.followers`. This `unlink` operation invalidates all the fields cache. As a result, when processing the next record in the batch, its cached fields (the new value of `message_follower_ids`) were erased, causing the logic to fail. This commit fixes the issue by postponing all unsubscription operations. opw-5050023 Forward-Port-Of: odoo/odoo#227499
The HTML editor now avoids including ignored, untracked content when saving an editing snapshot. This prevents errors that could block snapshot creation and helps keep editor history actions reliable for users.
Original PR description
When creating a snapshot step, unobserved nodes (i.e. node inserted via `ignoreDOMMutations`) should not be included in the snapshot step. This commit restores a previous behavior in which, on serialization, nodes that had no entry in the node map were ignored (instead of throwing an error). Because of this thrown error, before this commit it was not possible to create a snapshot step if the editable contained unobserved nodes.
Belgian payroll Dimona declarations now better track declaration status and support updated government API requirements. This reduces manual follow-up and helps payroll teams submit more accurate employee start and end declarations.
This fixes budgets that are shared across companies without a specific company assigned. The budget screen now has a fallback currency so money amounts display correctly when those companies use the same currency.
Original PR description
Budgets can work without a company, making the assumption that all the companies using the budget have the same currency. This is done by not setting a company on the budget. Since the currency is computed on the company, we need a fallback for the monetary widget to work.
The Belgian payroll working schedule change process now opens the employee record with the newly selected version instead of showing an outdated list view. This reduces confusion for HR users and helps them continue their workflow in the right place after validating a schedule change.
Original PR description
…dule change The working schedule change wizard was redirecting to a list of version when validating. This was the old behavior with the contract. Instead, redirect to the employee form view with the new version selected. task-5126204 Forward-Port-Of: odoo/enterprise#95877
This fix ensures text highlights with transparent custom colors display evenly, without darker edges caused by overlapping fill and outline colors. It also adjusts a website menu test so it runs reliably in more test environments.
Original PR description
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
This fix prevents an error from appearing when users edit a refusal email while processing an applicant. The unavailable template-saving option is hidden for this flow, allowing recruitment users to continue without interruption.
Original PR description
Steps to reproduce: - open any applicant in recruitment app - click on refuse button - enable send email toggle key - edit the message - try to save the template Issue: - traceback pop ups and not able to save the template Reason: - The method 'open_template_creation_wizard' is missing, causing the error when trying to save the template. This method was not implemented. Solution: - Remove the 'save the template' feature for this version by adding the context. It require two fields which are not present in the current model, thus avoiding the error. task-4948736 Forward-Port-Of: odoo/odoo#220118
Scanning a package now correctly converts quantities when the package and delivery line use different units of measure. This prevents warehouse staff from seeing partial or incorrect delivered quantities, such as 10 g instead of 10000 g, when the stock is packaged in kilograms.
Original PR description
Manual forward port of https://github.com/odoo/enterprise/pull/90878 **Problem:** When scanning a package with a different UoM than the barcode line, the conversion is not made. **Steps to…
Manual forward port of https://github.com/odoo/enterprise/pull/90878 **Problem:** When scanning a package with a different UoM than the barcode line, the conversion is not made. **Steps to reproduce:** - Enable the "Packages" setting; - Create a new storable product and set kg as its UoM; - In the inventory tab, add "g" in the packagings - Click on the on hand smart button and select update quantity - Add a new line; - In the package column create a new package; - Set a quantity of 10 kg; - Create a delivery and select your product; - Set a demand on 10000 and select g as the UoM; - Mark as todo; - Open the delivery in the Barcode app; - Scan the package. **Current behavior:** The quantity on the line is now 10 / 10000 g **Expected behavior:** It should be 10000 / 10000 g **Cause of the issue:** https://github.com/odoo/enterprise/blob/4c9fa9dc010958710d848fbcb3241b17ea7205ca/stock_barcode/static/src/models/barcode_picking_model.js#L1500-L1505 remaining_qty is expressed in the uom of the quant so it will be 10 but qty_needed is expressed in the uom of the line is it will be 10000. qty_used beeing the minimum of those two it will be 10. **Fix:** To define how much quantity to take from the package, we convert the line's quantity by using the package's UoM. Then, when we add this quantity to the line's quantity, we re-convert it by using the line's UoM. opw-4860064 Forward-Port-Of: odoo/enterprise#95659 Forward-Port-Of: odoo/enterprise#93693
This fixes how subscription combo sections are handled when creating invoices. It prevents correct section information from being overwritten and avoids adding unnecessary section details, helping invoices stay accurate and easier to read.
Original PR description
This commit improve fix of PR https://github.com/odoo/enterprise/pull/90989 to avoid overriding right combo section values and avoid setting unnecessary values on the section. opw-5069278 Forward-Port-Of: odoo/enterprise#95831 Forward-Port-Of: odoo/enterprise#94776
Fixed an issue where the favorite star on spreadsheet dashboards did not visually update immediately on mobile after being tapped. This makes the favorite action clearer and more consistent with the rest of Odoo.
Original PR description
The star icon on mobile would have a strange behaviour. After clicking it, the star would not change between filler/not filled until clicking elsewhere. It turns out that on mobile, after a click the hover rule is applied. And our hover rule would modify the icon to be the opposite of what it should be. This commit changes the CSS to use the same css as `BooleanFavoriteField` to stay consistent with the rest of Odoo. Task: [5092945](https://www.odoo.com/odoo/2328/tasks/5092945) 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#227663
The Talent applications button now opens the same set of related applications that is shown in the application count. This prevents recruiters from seeing a mismatch between the count and the list, making talent records easier to review accurately.
Original PR description
`_get_similar_applicants_domain` used in `action_open_applications` did not return the same domain used in `_compute_application_count`. Fixed by complementing the domain within `_get_similar_applicants_domain` used in the action to include applications with the same associated `pool_applicant_id` as the current applicant/talent. Task-5092128 Forward-Port-Of: odoo/odoo#228007
This fixes an automated Accountant app test so it waits for the final merge wizard action before closing. It reduces false test failures and helps keep accounting-related updates moving through validation more reliably.
Original PR description
The last check of the tour is always true. So it sometimes closes too early. Wait really for the last operation for the last check runbot-error-108440 Forward-Port-Of: odoo/enterprise#95991
Fixes an issue in the HTML editor where the color picker could close unexpectedly when previewing a background color for a table cell. This makes table formatting more reliable and avoids interrupting users while editing content.
Original PR description
Problem: When applying a background color to a `td`, the color picker dismisses unexpectedly. Cause: After c810b0c17b2f882b0ab5d073ba38464bffb0617e, we rely on the class `o_selected_td` to check if…
Problem: When applying a background color to a `td`, the color picker dismisses unexpectedly. Cause: After c810b0c17b2f882b0ab5d073ba38464bffb0617e, we rely on the class `o_selected_td` to check if we are in a selected `td` to keep the toolbar open. However, in another fix (254efd86cd1ce871807fdc25479ebc5beeb4eab3), we removed that class during the color preview operation. Previewing a color on a `td` triggers a selection change, which runs `shouldBeVisible`. Since `o_selected_td` is not found, the toolbar closes along with the color picker. Solution: Update https://github.com/odoo-dev/odoo/commit/254efd86cd1ce871807fdc25479ebc5beeb4eab3. A better fix is to use `o_selected_td_bg_color_preview` which will undo the `box-shadow` when we preview a color. Steps to reproduce: 1. Add a table. 2. Select a cell. 3. Apply a background color. 4. Select the cell again. 5. Hover a color to preview. → The color picker dismisses once a color is hovered. opw-5066309 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225827
Uploaded file fields on field service worksheets are now visible when customers open or sign the worksheet report in the portal. This prevents missing attachment information and makes completed worksheet reports more accurate for review and approval.
Original PR description
Steps to reproduce: ------- - Install industry_fsm_report module - Open FSM app - Select worksheets from settings in the configuration - Go to worksheet templates in the configuration - Create a worksheet template - Click the design template button. You arrive in the studio - Add file field and close it - Create a new task and select a newly created template in the worksheet template - Click the worksheet button in the control panel - Upload a file and save it - Click on the sign report button - Here file field is not visible Issue: ------- The file field is not visible in the worksheet portal. Cause: ------ The view of the file field is not created for the worksheet portal. Solution: ------- Created the view of the file field to display in the worksheet portal. task-3691529 Forward-Port-Of: odoo/enterprise#95754 Forward-Port-Of: odoo/enterprise#56035
Survey descriptions and end messages now avoid a content option that could prevent embedded videos from appearing to respondents. This ensures shared surveys display their message content as intended outside the editor.
Original PR description
Embedded components do not render when the html field content is displayed outside the editor, as their mechanism relies on the editor plugin. Solution: --------- Disable embedded components for the…
Embedded components do not render when the html field content is displayed outside the editor, as their mechanism relies on the editor plugin. Solution: --------- Disable embedded components for the survey messages (Description and End Message). Steps to reproduce: ------------------- * Create a new survey * Add a video as End Message or Description * Use the share link to view de survey * Video not showing Cause of the issue: ------------------- The new web_editor has a plugin system, and one option that is enabled by default is embedded_components. This option has been introduced in: https://github.com/odoo/odoo/commit/03f495c696030214c17e6479076571823513f60e According to the description: "It is forcibly set to false in HtmlMailField since embedded components can only be rendered inside Odoo." Observation : ------------ similar fix: https://github.com/odoo/odoo/commit/1446167e482745c71725563e56411948c3dd1f41 opw-5005752 Forward-Port-Of: odoo/odoo#224808
Anonymous self-order customers could see an error after their restaurant order was paid because the system tried to update information they were not allowed to change. This fix limits order updates to the necessary details, so customers see the correct order status without disruption.
Original PR description
Before this commit, updating an order in a self as an anonymous user raised a traceback: "Failed to write field pos.order.message_partner_ids" Steps to reproduce - Open a self in an anonymous window and create an order. - In the restaurant, pay the order. - Back in self, an error notification is displayed, and the order is not updated. The issue occurred because all fields were being loaded, including ones not writable for anonymous users. After this commit, only the required field are loaded. task-5126416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Self-order kiosks can now complete payment result updates without triggering an access error. The change removes an unused data field from the kiosk flow, improving reliability for customers using self-service ordering.
Original PR description
Before this commit, when the `_send_payment_result` method is called from the kiosk (which uses the public user), an AccessError is raised while trying to load the `message_partner_ids` field on `pos.order`. After this commit, the issue is fixed by not including this field in the loaded data, since the self order app does not use it. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents a completed kiosk payment from being processed twice by the payment terminal listener. It reduces unnecessary error logs and helps keep self-order payment flows more reliable for staff and customers.
Original PR description
Before this commit, when using an IoT payment terminal in the Kiosk, an error could sometimes be logged due to the event listener running twice after the payment is completed. After this commit, the issue is fixed by moving the `removeListener` call to be before the RPC call, preventing the event from being triggered multiple times.
This fixes point-of-sale dialogs so unnecessary default “Ok” buttons no longer appear when another action button is already present. It makes popups and form dialogs clearer for cashiers and other POS users, reducing confusion during sales, refunds, gift cards, events, and restaurant flows.
Original PR description
When dialogs were added to POS in [1] the dialog scss file was explicitly excluded for unspecified reasons. However since [2] there is some pure scss style to hide the default "Ok" button when there are any other buttons on the dialog. Which was previously done in javascript. As a result "Ok" always appears in POS form dialogs. After testing there does not seem to be any reason not to include the dialog scss styles so they're added back. However as all the "popup" dialogs in point_of_sale use "default buttons", and there are sometimes multiple "default buttons" we do want to support multiple default buttons. As currently the logic assumes only one exists. task-5103532 [1]: https://github.com/odoo/odoo/commit/0957ab329999852e61facf8591c7982424645e5d [2]: https://github.com/odoo/odoo/commit/1cf179bbf1c49a6d69588911c2a3d98dbeadd3d9
Editing a message with mentions no longer lets users accidentally alter or partially delete those mention links. This keeps conversations cleaner and prevents broken references to people or channels, including in live chat and mail discussions.
Original PR description
This fixes the issue that when editing a message with mentions, the mentions were editable and could be partially deleted. This is fixed by preprocessing the message body when loading it for edition, addding contenteditable="false" and draggable="false" to the mention links. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The ESG module now retrieves the correct IPCC table information before exporting data, preventing cases where the download returned no data. It also fixes a unit-checking issue that could create server log errors during the download process.
Original PR description
## [FIX] esg: fetch ipcc database Before this commit, sometimes the download button for IPCC database does not work because the request made to IPCC database to fetch data, does not return any data. The reason is because the table name used in parameter changed after a certain time. This commit gathers the table_name when we do extra rpc to fetch all parameters to use to correctly export the data. ## [FIX] esg: check unit fetched to correctly process data gathered Before this commit, when the user downloads the IPCC database, an error is raised in server log because an uom recordset is compared to a string instead of checking the unit gathered with the expected string. This commit alters the check to correctly check the right things.
This fixes a regression that prevented portal users from creating project tasks by sending emails to a project alias. It restores the expected email-based task creation flow for external users, reducing manual follow-up for project teams.
Original PR description
The new safety belt introduced in 745f3accaf775550294d6f1bf562a0dcc15f7a08 made it impossible for portal users to create tasks by sending emails to the project alias. @moduon MT-11332 Forward-Port-Of: odoo/odoo#228986 Forward-Port-Of: odoo/odoo#225321
Opening the list side panel in spreadsheets now works even when a saved sort uses a field that was later removed or renamed. This lets users access the panel and remove the invalid sorting instead of being blocked by an error after an upgrade.
Original PR description
If a list is sorted on an invalid field and you try to open the list side panel, it crashes. It should open to allow the user to remove the sorting. A list with an invalid sorting field if the spreadsheet was created in a given version, then upgrades to a version where that field has been removed or renamed. Task: 4962837 Forward-Port-Of: odoo/enterprise#94972 Forward-Port-Of: odoo/enterprise#92393
This fixes an issue where Spanish tax report logic could fail when records were created without date settings, such as during automated checks. The change makes the report handling more resilient while keeping normal date validation unchanged for regular use.
Original PR description
The `_get_mod_period_and_year` method assumed that `options['date']` would always be present with `date_from` and `date_to`. However, during the automatic `TestEveryModel.test_computed_fields_without_dependencies`, this method is called on a `new()` record where no options are provided. This resulted in a `KeyError: 'date'`. We now gracefully handle missing or incomplete `options` by returning `(None, None)` instead of raising an exception. This ensures that tests and new records can be created without errors, while preserving the original validation logic when valid options are given. build_error-231511 Forward-Port-Of: odoo/enterprise#94154
Website editors can once again use the “On Hover” animation option on images that have decorative shapes. The option is only hidden when the selected shape already includes its own animation, preventing conflicting effects while restoring expected design flexibility.
Original PR description
Applying a shape to an image unintentionally disabled the "On Hover" animation option. This commit restores the option with proper checks, ensuring it remains disabled only when the applied shape includes an animation. The related code was also refactored slightly for improved readability. Steps to reproduce: 1. Enter edit mode in Website. 2. Add an image and apply a shape. 3. Notice that the "On Hover" animation option is incorrectly hidden. Forward-Port-Of: odoo/odoo#225527
Fixes several issues in Email Marketing introduced by a recent refactoring, including incorrect colors, awkward editor options, empty content blocks, and display problems for sent emails. This helps users edit campaigns more reliably and view previously sent mailings correctly without layout or scrolling glitches.
Original PR description
This task bundles fixes for issues introduced with the mass_mailing [refactoring]: [FIX] mass_mailing: align fontFamilyPicker option Some options have different alignments, this commit introduces…
This task bundles fixes for issues introduced with the mass_mailing [refactoring]: [FIX] mass_mailing: align fontFamilyPicker option Some options have different alignments, this commit introduces usage of an extra class to adapt the alignment of the fontFamilyPicker option so that it displays nicely with other options. [FIX] mass_mailing: remove empty containers and sections Prior to this commit, removing all columns from a container would make a snippet unusable but it would still be in the DOM. After this commit, empty rows, containers and sections (snippets) are removed. [FIX] mass_mailing: use o_mail_no_colorpicker instead of s_col_no_bgcolor Update usages of s_col_no_bgcolor to use o_mail_no_colorpicker instead, and this class hides the option to change the background color. [FIX] mass_mailing: remove erroneous mass_mailing style Prior to this commit, some colors were not accurate when using the ColorPicker, notably `o-color-2` had a different color when previewed in the `ColorPicker` than when actually applied in the DOM (Beige vs Purple). [FIX] mass_mailing: fix separator title snippet Prior to this commit, the separator title snippet had the option to have "None" column, which didn't make much sense. This commit removes that option. [FIX] mass_mailing: fix theme selector favorite template star color Prior to this commit, the color for `fa-star` element in the Theme Selector, when a user selects a mailing saved as a favorite, was darker than usual. [FIX] mass_mailing: display mailings without body_arch in readonly After the `mass_mailing` [refactoring], sent mailings with a `body_html` but without a `body_arch` where not properly displayed in the `MassMailingHtmlField` widget. How to reproduce: - Create a new mailing by selecting multiple CRM Leads in the list view - Click on the "Email" action of the control panel - Write and send an Email - Go to the Email Marketing app and open the email Issue: - The email is displayed empty. Resolution: Display the `body_html` if the `body_arch` is empty. [FIX] mass_mailing: prevent infinite scrolling when viewing mails Since the mass_mailing [refactoring], viewing some emails in readonly could result in the page growing its `scrollHeight` indefinitely: How to reproduce: - Write and send a mailing with the basic theme (normal editor) - Open the mailing in readonly Issue: - The scroll views grows its `scrollHeight` indefinitely. Resolution: Remove layout padding for the basic theme, since it will interfere with the automatic iframe sizing process. Adding a padding there would make it impossible to reconcile the height of the iframe content with the height of the iframe itself, and that computation is required to prevent the iframe from having an overflow (functional spec. is that the Form view should scroll the content, and no scrollbar should appear in the iframe). [refactoring]: https://github.com/odoo/odoo/commit/82969dc5c6c36a7a91194cf15b33c9abb560a8e7 task-5134263 Co-authored-by: Damien Abeloos <abd@odoo.com> Co-authored-by: Thomas Josse <thjo@odoo.com>
This update fixes internal spreadsheet test helpers so they can handle sorting scenarios correctly. It helps ensure spreadsheet-related changes are tested more accurately, reducing the risk of sorting issues reaching users.
Original PR description
Task: 4962837 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#227566 Forward-Port-Of: odoo/odoo#223011
This fix prevents IoT device WebRTC connections from dropping when an action takes more than a few seconds. Longer-running actions now run separately so the connection can keep sending keep-alive signals, improving reliability for users operating connected devices.
Original PR description
Before this commit, if an action took more than 5 seconds to execute, it would cause the WebRTC connection to disconnect. This was due to the action blocking the WebRTC thread for that connection, which internally is sending keep-alive messages to keep the connection active. The action prevents this from happening and so the connection gets automatically closed by the browser. After this commit, we run the action inside a loop executor (essentially giving the action its own thread). This prevents the connection thread getting blocked and so the connection stays open as expected. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue in the HTML editor where opening the color picker from a link popover could create an extra button and leave preview colors in the wrong state. Users can now adjust or reset button colors more reliably, with the original button restored correctly after hovering through color options.
Original PR description
Before this commit: the onchange is applied when the color picker closes, it has a few issues, 1. adding duplicate button cause the reference of the link element is not passed correctly 2. the preview color isn't reset when mouse no longer hovering on the colors After this commit: The onchange is applied when on color reset. No more additional button inserted and color of the button is properly restored after the cursor is out of color picker task-4966317 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225664
Inventory revaluation now delays rounding until after calculations are complete. This prevents small rounding differences from building up and incorrectly creating negative remaining values during stock valuation.
Original PR description
Before this commit, the remaining_value_unit_cost was rounded before any computation. In the case where the numer of layers with remaining value and remaining quantity increase, the rounding error introduced by that rounding quickly explodes, leading to a negative remaining_value during revaluation computation. After this commit, the remaining value is rounded at the end, after the computations and the checks. This ensures that the rounding error remains constant and does not accumulate over the execution of the method. opw-4901966 Forward-Port-Of: odoo/odoo#229376 Forward-Port-Of: odoo/odoo#222690
Fixes several Knowledge article comment issues so users can consistently see and use comments after saving, reloading, or switching between read-only articles. It also prevents crashes when trying to add comments inside code blocks, improving stability for article collaboration.
Original PR description
### Issue 1: Summary: When a user adds a comment inside a baseContainer element, the comment beacons created during the comment insertion can be discarded during the document normalization step. How…
### Issue 1: Summary: When a user adds a comment inside a baseContainer element, the comment beacons created during the comment insertion can be discarded during the document normalization step. How to reproduce: - Open an article in Knowledge. - Select text and change the block style from "Paragraph" to "Normal" using the powerbox. - Add a comment on the selected text using the powerbox. - Write a message in the comment thread. - Save and reload the article. Issue: - The comment beacons disappears from the editor and the user can't see it anymore. Resolution: When the editor is initialized, `div` are not yet categorized as paragraph related elements. The `comments_plugin` logic to identify valid positions for comments beacons should take that into account and allow elements which are candidates to be a paragraph related element. ### Issue 2: Summary: There was an issue where comments were not displayed when switching from a locked article to another (read-only). How to reproduce: - Create two articles and add a comment on each. - Lock both articles (so that they are effectively read-only). - Switch from one article to the other. Issue: - Comments are not displayed to the user. Resolution: When switching between read-only articles, `KnowledgeHtmlViewer` is not fully reloaded and continues using the same `CommentBeaconManager` instance for the newly opened article. As a result, comment beacons are not displayed when switching article. The simplest solution to this issue is to re-instantiate a new `CommentBeaconManager` whenever the HTML value changes to ensure comments are correctly displayed. ### Issue 3: There is an issue in the logic of `computeVerticalDimensions` to display comments. If the `top` value of a thread in the article is `0`, it will be filtered out and not displayed because `top` was used as a boolean value. Instead, it should properly consider `top` as a finite number to display the comment or not. Note: This issue is not easily reproducible because there are few configuration where a comment would have a top value equal to 0. ### Issue 4: There is a crash when inserting a knowledge comment in a `/code` block: In this previous [task], insertion in `pre` elements was filtered to prevent non-phrasing content from being inserted (as it is invalid per the html specification). To prevent a crash, knowledge comments will be disabled in `<pre>` elements, as they rely on `anchor` elements for the comment position in the article body. [task]: 216e9eb task-4984152 Forward-Port-Of: odoo/enterprise#95952 Forward-Port-Of: odoo/enterprise#91408
This fix prevents the website preview from briefly showing outdated styling after a page design change. Business users get a smoother editing experience when saving theme changes and navigating between pages.
Original PR description
In this [commit], fallback iframe was added to avoid flickering between iframe reloads. But the flicker still happens if we change page's style, since we do not apply the new styles to the fallback iframe. To reproduce the issue: - Open Website and start editing - Move to the 'Theme' tab - Change page layout to 'Boxed' - Set background color to a non-transparent color, e.g. red - Save, and do any action to reload the iframe, e.g. go to /contactus => The iframe flickers from the previous color to red, which shouldn't be the case. Task-4985472 [commit]: https://github.com/odoo/odoo/commit/7b19831e1c624b483008feb526ba773ec8b23009 Forward-Port-Of: odoo/odoo#228863 Forward-Port-Of: odoo/odoo#221391
Attendance officers who are not HR officers can now create, edit, and delete attendance records for the employees they manage. This removes an access error while keeping the elevated access limited to the attendance management workflow.
Original PR description
…rs to create attendances Because creating attendance records requires access to the `version_ids` field on the employee and subsequently `hr.version` records, which require `hr.group_hr_user` group on the user. This change runs said flow in sudo mode only if the user has `hr_attendance.group_hr_attendance_officer` or it's implying groups. task-5071058 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226080
This fixes barcode delivery processing so that when workers split a reserved package into another destination package, the new split line keeps the original source package information. This prevents package details from being lost during partial transfers, improving warehouse accuracy and traceability.
Original PR description
### Before this PR: - Put a package in WH/Stock with quantity 100 - Create delivery for partial quantity for example 50 - Go to app barcode - Try to split the package into two different packages scanning another destination Package - The splitted line will be created with empty package instead of the package already reserved before ### After this PR: Scanning another destination package , the new line created splitting the old one will have the package_id Forward-Port-Of: odoo/enterprise#95779 Forward-Port-Of: odoo/enterprise#81170
The API documentation now skips a default value that could not be converted into the format needed for display. This prevents an error when generating documentation for affected public methods and keeps the documentation page usable.
Original PR description
There is the following public method on the ir.ui.view model:
def distribute_branding(self, e, branding=None, parent_xpath='',
index_map=ConstantMapping(1)):
The default value for `index_map`: `ConstantMapping`, is not json-serializable. Trying to `json.dumps` it raises a TypeError. We want to ignore the default value in this case.
Reported-by: Sunhyeok Sam <suju@odoo.com>
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-prFixed an issue where the Turkish General Ledger CSV export could be generated blank after a previous report update. The export now correctly includes the expected accounting entries, helping businesses retrieve complete ledger data for reporting and compliance.
Original PR description
## Before this commit: After the refactor of the General Ledger in the referenced commit, `l10n_tr_reports` no longer able to fetch the `aml_ids`. This caused the CSV export of the General Ledger to be generated as blank. Ref commit: https://github.com/odoo/enterprise/commit/235a5160d13296328b79e4092a8b88a733628268 ## After this commit: Ensured that `aml_ids` are properly retrieved, so that the General Ledger CSV export contains the expected data. Forward-Port-Of: odoo/enterprise#95577
This fixes an error that could appear after closing a fullscreen YouTube video added through the website editor. The mail fullscreen handling now ignores unrelated fullscreen activity, helping users close videos without disruptive browser errors.
Original PR description
Versions -------- - 19.0+ Steps ----- 1. Go to an eCommerce product page; 2. open the website editor; 3. add a YouTube video as extra media; 4. save changes; 5. open the video in fullscreen; 6. close the video. Issue ----- > `UncaughtPromiseError > TypeError` > `Uncaught Promise > can't access property "closeOverlay", this is undefined` Cause ----- The `mail.fullscreen` service adds an event listener to `window` on start. This listener gets triggered on `fullscreenchange` events. Once triggered, there's a naked `exit()` call, hence when entering the `exit` function, `this` is not defined. Solution -------- - Explicitly store `closeOverlay` in `state`. - Call `state.exit()` instead of `exit()`. - Return from `exit` if `id` is undefined (i.e. non-mail fullscreen). opw-5105959
This fix makes the send button visible when editing a chatter message on mobile devices and places the discard editing option in a clearer position. Mobile users can now complete or cancel message edits without confusion or hidden controls.
Original PR description
**Purpose of this PR:** This PR addresses UI issues in the mobile view of the chatter during message editing. - Ensures the send button is properly displayed while editing messages on mobile. - Moves the "Discard Editing" action above the composer. **Before this PR:**  **After this PR:** <img width="446" height="132" alt="image" src="https://github.com/user-attachments/assets/1842f341-268a-40e3-8915-dc08fb9162b3" /> task-[4780731](https://www.odoo.com/odoo/project/1519/tasks/4780731) Forward-Port-Of: odoo/odoo#213943
Changing a user's login through the password wizard now refreshes the page and can hide the login field when needed. This prevents confusing errors and ensures users are prompted to log in again after their login details are updated.
Original PR description
This allows hiding the login and reloading the page on update which is necessary to prompt relogging instead of getting an error. password wizard is convenient to reuse as it already includes the user login and overall targets the same kinds of modifications. Additionally it may be desirable to require a password to modify the login from this page in the future. task-5130854
This fix keeps certain Mexican electronic invoicing weight fields consistent with official stamped documents by preventing later edits where they could create mismatches. It also hides duplicate weight information in product screens when variants are used, reducing customer confusion.
Original PR description
In refactor for l10n_mx_edi_stock, l10n_mx_edi_extra_weight was added to handle the weight of the driver and luggage. However, the condition to prevent the field from being edited once it has been stamped was not added, which could cause confusion if it could be edited later and a value different from that of the CFDI could be seen. The condition to make it readonly has been added, like the rest of the location fields in stock.picking. In addition to this, when testing the flow, we also detected a conflict with Odoo Standard in the l10n_mx_edi_extended module. This module added the weight field again, now on the product accounting page. The standard weight field had a condition to make it invisible if the product had variants, but this one did not, which could cause confusion for customers, so these conditions were also added. I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update changes a purchase-related validation from a hard block into a warning during migration to Odoo 19.0. Users are still alerted when something may need attention, but migrations can continue more smoothly without being stopped by this check.
Original PR description
The constrain on `purchase_ok` could block the migration to 19.0. In order to still alert user something may be wrong but but letting the migration run smoothly, this commit change the constrain to a warning. 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
Fixes an issue where the Customer Account setting in Website Sales could not be changed because it was reset after saving. Businesses can now correctly choose how customer accounts are handled during online checkout.
Original PR description
Scenario: - install website_sale - try to change auth_signup_uninvited (Customer Account) setting to another value - save Result: the option can never be changed and is always reset to the same…
Scenario: - install website_sale - try to change auth_signup_uninvited (Customer Account) setting to another value - save Result: the option can never be changed and is always reset to the same value. Cause: there is code on the inverse method of account_on_checkout that sets auth_signup_uninvited. Before 19.0 version, the inverse method of account_on_checkout was called before the inverse method of auth_signup_uninvited, so: - account_on_checkout inverse would set auth_signup_uninvited - auth_signup_uninvited would then set auth_signup_uninvited => so the code in _inverse_account_on_checkout was just dead code. In 19.0 the inverse methods are executed in the other order, and now the inverse method _inverse_auth_signup_uninvited is dead code and _inverse_account_on_checkout is the only methods that sets the value of auth_signup_uninvited. Fix: this fix proposes to only set auth_signup_uninvited if the value of account_on_checkout has changed. opw-5104120 opw-5109360 opw-5117550 opw-5119586 closes #229358
Website image galleries now load the correct template when visitors click images, avoiding a disruptive error message. This helps job pages and other website pages with gallery snippets work as expected for visitors and editors.
Original PR description
Clicking on an image gallery snippet currently triggers a "missing template" error. This happens because the gallery template is only defined in the 000 version file, while the corresponding view record for that version has been disabled. This commit resolves the issue by moving the gallery templates to the 001 version file, ensuring they are properly loaded. Steps to reproduce: 1. In Website, navigate to /jobs. 2. Create a new job and save it. 3. Click on any image at the end of the job page. 4. Observe the "missing template" error. Forward-Port-Of: odoo/odoo#226333
This fix makes website page settings behave reliably when users rename a page URL and remove it from the menu at the same time. It also ensures newly marked page templates appear immediately in the New Page dialog, avoiding confusion and reloads during website editing.
Original PR description
Since [1], the page dependencies algorithm was updated, requiring adjustments to the tour logic. Additionally, following [2], the "Add new content" button was changed from an `<a>` tag to a…
Since [1], the page dependencies algorithm was updated, requiring adjustments to the tour logic. Additionally, following [2], the "Add new content" button was changed from an `<a>` tag to a `<button>`, which also needed to be reflected in the tour. Furthermore (see [3]), removing a page from the menu could silently fail when the page URL was changed in the same save because the wizard only looked up menus by the current URL. Resolve menus by page_id (fallback to URL) in both compute and inverse, and unlink accordingly, ensuring "In Menu" toggles work reliably across URL changes. Also, since [4], the "New Page" dialog cached the templates list, so pages newly marked as "Is a Template" didn't appear until a reload. Fetch templates without client-side caching so the Custom tab reflects changes immediately. This fixes the tour steps for "Verify is not in menu" and "Verify template Cool Page exists." Steps to reproduce: A. "In Menu" toggle fails when URL also changes (unlink by URL only) - Website > Go to any page (e.g., /cool-page). - Click Edit > Page (properties). - Change URL from /cool-page to /cool-page-2. - In the same dialog, disable "In Menu" (It should be automatic). - Click Save & Close. - Bug (before): The corresponding menu item is not removed because the unlink resolves only by the old/current URL. Now: Menus are resolved and unlinked by page_id (fallback to URL), so the menu entry is correctly removed. B. "New Page" > Custom templates list becomes stale (client cache) - Create a normal website page (not a template). - Open Page (properties) and enable "Is a Template". Save. - Without reloading the site, click New (Add new content) > New Page. - Open the Custom tab. - Bug (before): The page you just turned into a template doesn't appear because the dialog used a cached list. Now: The dialog fetches templates without client caching, so the new template appears immediately. [1]: https://github.com/odoo/odoo/commit/cd4b0c91c1cf60ff72e91cf0544cb255ee5aff3f [2]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 [3]: https://github.com/odoo/odoo/commit/d6c8177824be3 [4]: https://github.com/odoo/odoo/commit/b7fe6e6704fad runbot-224020 Forward-Port-Of: odoo/odoo#216533
This update prevents request failures when Odoo runs with newer underlying web libraries, such as those shipped with Debian Trixie. It ensures response headers are handled correctly so pages can complete normal post-processing instead of crashing during request handling.
Original PR description
Support the possibility to pass a wrapped `Headers` to the constructor of the wrapped `Response` This is related to…
Support the possibility to pass a wrapped `Headers` to the constructor of the wrapped `Response`
This is related to
https://github.com/odoo/odoo/commit/6c8a90ecba45fb99addf1b86fe237fd626fba650#diff-77bd6b19c39e211959885024bcad914655ff84cfc10c16633687d014e50aa69aR383 which passes a wrapped `Headers`
to the constructor of the wrapped `Response`.
The issue is that the wrapped `Headers` was passed to the original `werkzeug.wrappers.Response`, and then, internally in `werkzeug`, method which are implemented on the original `Headers` are not proxied on the wrapped `Headers`.
```py
Exception during request handling.
Traceback (most recent call last):
File "/data/build/odoo/odoo/http.py", line 2798, in __call__
response = request._serve_db()
File "/data/build/odoo/odoo/http.py", line 2261, in _serve_db
raise self._update_served_exception(exc)
File "/data/build/odoo/odoo/http.py", line 2253, in _serve_db
return service_model.retrying(serve_func, env=self.env)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/service/model.py", line 184, in retrying
result = func()
File "/data/build/odoo/odoo/http.py", line 2327, in _serve_ir_http
self.registry['ir.http']._post_dispatch(response)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
File "/data/build/odoo/addons/website/models/ir_http.py", line 269, in _post_dispatch
super()._post_dispatch(response)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
File "/data/build/odoo/addons/utm/models/ir_http.py", line 26, in _post_dispatch
super()._post_dispatch(response)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
File "/data/build/odoo/odoo/addons/base/models/ir_http.py", line 364, in _post_dispatch
request.dispatcher.post_dispatch(response)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
File "/data/build/odoo/odoo/http.py", line 2404, in post_dispatch
root.set_csp(response)
~~~~~~~~~~~~^^^^^^^^^^
File "/data/build/odoo/odoo/http.py", line 2746, in set_csp
if 'Content-Security-Policy' in headers:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/data/build/odoo/odoo/tools/facade.py", line 79, in wrap_func
result = func(self._wrapped__, *args, **kwargs)
File "/usr/lib/python3/dist-packages/werkzeug/datastructures/headers.py", line 328, in __contains__
self._get_key(key)
^^^^^^^^^^^^^
AttributeError: 'Headers' object has no attribute '_get_key'. Did you mean: '_del_key'?
```
The exception did not occur before Trixie, because the implementation of `__contains__` was not using the method `_get_key` of `werkzeug.datastructures.Headers` werkzeug < 3.1.0
```py
def __contains__(self, key):
"""Check if a key is present."""
try:
self.__getitem__(key, _get_mode=True)
except KeyError:
return False
return True
```
werkzeug >= 3.1.0
```py
def __contains__(self, key: str) -> bool:
"""Check if a key is present."""
try:
self._get_key(key)
except KeyError:
return False
return True
```
https://runbot.odoo.com/odoo/runbot.build.error/233070Helpdesk ticket lists now sort ticket references in a more natural order, even after the count reaches three digits. This makes it easier for users to find the newest or oldest tickets without confusing results caused by text-based sorting.
Original PR description
**Issue** With the default `helpdesk.ticket` sequence, once users reach 100 tickets, ordering tickets by `ticket_ref` in the list view is unintuitive as it is a Char field (so '11' > '100') and the results are not useful if the user wants to see the oldest/newest tickets. opw-4891916 Forward-Port-Of: odoo/enterprise#95548 Forward-Port-Of: odoo/enterprise#93058
This fixes an internal test setup issue so purchase reordering rule tests can access the product route field again. It helps keep automated checks reliable after a recent route visibility change, with no direct impact on end users.
Original PR description
The setup class `TestReorderingRule` fails with `AssertionError: field 'route_ids' is not visible`.
This happens because the `route_ids` field on the product form is only visible when `has_available_route_ids` is `True`, which requires at least one route to be `product_selectable`.
After recent changes here: https://github.com/odoo/odoo/pull/223685, the Buy route (`purchase_stock.route_warehouse0_buy`) is no longer product-selectable, causing the field to be hidden and the test to break.
This commit re-enables `product_selectable` on the Buy route in tests to make sure `route_ids` is visible and the reordering rule tests run successfully.
I also removed `cls.env.user.group_ids += cls.env.ref('uom.group_uom')` it was a duplicated line, from two different fixes.
[RB-232574](https://runbot.odoo.com/odoo/error/232574)
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prPublished product tags now show in the eCommerce sidebar even before individual product variants are created. This helps shoppers discover and filter products consistently, especially for items with dynamically generated variants.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Have an attribute which creates variants dynamically; 2. create a product with two or more dynamic attribute values; 3. add a new tag to the product; 4. publish the product to eCommerce. Issue ----- The tag doesn't show up in the side-bar until after a product variant has been created. Cause ----- The tags are searched based on `product_ids` instead of `product_template_ids`, leading to tags assigned to dynamically created product variants not showing up until a variant has been created. Solution -------- Search tags based on `product_template_ids.is_published` as well as `product_ids.is_published` (in case of `addition_product_tag_ids`). opw-4985989 Forward-Port-Of: odoo/odoo#229631 Forward-Port-Of: odoo/odoo#228544