Daily updates from Odoo
Friday, September 12, 2025
118 changes
18 changes
Resolved issues and error corrections
A timing issue in the point-of-sale self-order payment test was corrected so the generated self-order link includes the required access token. This keeps kiosk QR code payment validation reliable and prevents failures related to IoT payment channel setup.
Original PR description
A call to `_get_self_order_route` in the `test_online_payment_kiosk_qr_code` test was happening too early, resulting on getting the self order url missing the `access_token`. This resulted in making the test fail due to the override of the `iot_http` service in `pos_self_order_iot`, relying on this token to get the IoT WebSocket channel. Enterprise PR: odoo/enterprise#93895
This fix prevents a closed websocket connection from being treated as an unexpected internal error during test handling. It restores the intended cleanup behavior, reducing confusing error reports and improving reliability in core infrastructure.
Original PR description
Followup to 16.0-closed-in-stop-xmo: the condition in `stop` is a `hasattr`, so we need to delete `self.ws` not set it to `None`. Setting it to `None` means the condition passes then blows up as soon as we try to use it, which means we "just" converted all the old `WebSocketConnectionClosedException` to an `AttributeError`. https://runbot.odoo.com/odoo/error/231446 Forward-Port-Of: odoo/odoo#226267
Fixes an issue where users returning from an external link in a dashboard were taken back to the first dashboard instead of the one they had selected. This preserves the user’s place and avoids confusion when navigating between dashboards and linked pages.
Original PR description
Steps to reproduce: - go to dashboards - select a dashboard with external links on scorecard charts for instance (do not select the first dashboard) - click on the chart w/ the external link to be redirected - Go back to the previous page through the browser The selected dashboard is now the first dashboard instead of the one you came from. the behaviour was broken since the introduction of the path-based routing in #157867 as we did not specify a path for the dashboard action but still worked because the action params were sent in the context but this was corrected in #216067 task-5067826 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
Due to time constraints the translations were not added in the commit adding the modules (72ac059edfcc35ad44c5faa9daf971123377af24). This commit adds the translations / fills the `.po` files. The translations were created by LMAN based on the 18.0 po files. Veri*Factu task: task-3745982 Forward-Port-Of: odoo/odoo#226298 Forward-Port-Of: odoo/odoo#225173
Original PR description
Due to time constraints the translations were not added in the commit adding the modules (72ac059edfcc35ad44c5faa9daf971123377af24). This commit adds the translations / fills the `.po` files. The translations were created by LMAN based on the 18.0 po files. Veri*Factu task: task-3745982 Forward-Port-Of: odoo/odoo#226298 Forward-Port-Of: odoo/odoo#225173
This update adjusts an internal email server test to match a changed error message from a supporting mail library. It helps keep automated quality checks reliable without changing how users work with Odoo.
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 Forward-Port-Of: odoo/odoo#226489
This update fixes failing automated tests in the online shop area. It helps keep the website sales feature reliable by ensuring test checks run successfully during validation.
Original PR description
runbot-error-227575 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Documents app now consistently shows the Activities button in the document chatter, including for files linked to other document-related models such as signing documents. This makes it easier for users to manage follow-ups and tasks from the same place without missing activity options.
Original PR description
Step to Reproduce: - Install `Documents_sign` module - open Documents - click on 'info & tags` button on the top right corner to show chatter - Open 'Odoo CLA.pdf' document Observation: - The Activities button is not shown in Chatter. Issue: - after this https://github.com/odoo/enterprise/commit/a32825ee00f2b330d99113f4d8c1488903fe744e, the activities button shows only for those documents which are related to `documents.documents` model or a document has no model, but it should be shown for all documents https://github.com/odoo/enterprise/blob/23fb26ae0f91a5bdb74d0d4fce48b31fa7abef86/documents/static/src/views/kanban/documents_kanban_renderer.xml#L21-L26 Solution: - Remove condition for Kanban and list view to show `activities` button in Chatter opw-5013427 Forward-Port-Of: odoo/enterprise#94361 Forward-Port-Of: odoo/enterprise#93093
The web test runner now reports critical setup problems during dry runs as real errors. This helps Odoo’s automated checks catch blocking test issues earlier and more clearly, reducing the risk of failed or misleading test runs.
Original PR description
The test runner replaces most occurences of `console.log` with a formatted `console.trace`, as to avoid duplicate runbot error messages in general. The issue is that during the dry run, errors that are caught should be logged on the runbot since these errors are more critical (i.e. duplicate test name, which will prevent the runner to run at all). This commit ensures that errors caught during dry run are logged as actual errors to prevent this issue. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225688
The web test runner now avoids over-simplifying test URLs when specific tests are excluded. This keeps automated test selections accurate, reducing the risk of running the wrong set of tests during development and validation.
Original PR description
Before this commit, when the test runner simplified the URL (e.g. if the runner is given the ID of every test in a suite, it will remove them and only include the suite ID), it always considered IDs as being "included", and ignored the "-" specifying that some IDs should be "excluded". --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225950
This fix makes the online rental checkout test wait until the cart has fully updated after a customer changes the rental duration. It helps prevent false build failures and improves confidence that rental pricing is displayed correctly before checkout checks continue.
Original PR description
steps to reprduce: 1. duplicate multi enterprise 18.0 database 2. run the tour `website_sale_change_rental_duration` in the duplicated database inspired from: https://github.com/odoo/enterprise/commit/c7542e897c537650966497065db9c7d033dcb8ee added a delay to wait when choosing the rental duration, after page is loaded when go to cart , check if the next page is loaded before checking untaxed amount build_error-227718 Forward-Port-Of: odoo/enterprise#93659 Forward-Port-Of: odoo/enterprise#89274
Survey datetime answers now show the same time in list views and detail forms by using the current user's timezone. This prevents confusion when reviewing submitted survey responses across different time zones.
Original PR description
Steps to reproduce ==================== 1. Create survey with some datetime questions. 2. Receive some response on it. 3. Check answer of datetime questions in answer tab. 4. Click on that answer to open form. ->The time shown in answer tab differs from actual value in form. The display_name of survey.user_input.line is computed based on the answers submitted by users. For questions of type datetime, the display_name was generated by converting the datetime value to a string without accounting for the user's timezone, leading to a mismatch between the actual value and the displayed time. After this commit ================== This commit updates the computation of display_name for datetime answers to consider the current user's timezone. Task-4890423 Forward-Port-Of: odoo/odoo#226354 Forward-Port-Of: odoo/odoo#216281
This fix prevents inserted non-editable blocks, such as banners or tables of contents, from blocking full-content deletion in the HTML editor. It adds a blank paragraph before those blocks so users can reliably select all content and delete it, avoiding frustrating editing leftovers.
Original PR description
**Current behavior before PR:** If the first child of an editable element was `contenteditable="false"`, selecting all content and pressing backspace would not remove everything. This was due to a Chromium bug where non-editable elements as the first child are not fully selected. **Desired behavior after PR is merged:** When inserting elements such as a banner or table of contents, a paragraph is added before them. This ensures that the editable element never starts with a non-editable child. task: 5010666 Forward-Port-Of: odoo/odoo#223357
Stripe payment card fields now use the language selected on the website instead of defaulting to the shopper's browser language. This keeps checkout wording consistent for multilingual websites and reduces confusion during payment.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Enable Stripe; 2. enable a second language on the website; 3. use second language on website; 3. go to checkout; 4. open card payment method. Issue ----- The card field values are displayed using the current browser's locale instead of the website's language. Cause ----- The `locale` parameter isn't included when connecting to the Stripe API. Solution -------- Include the lang from the `html` element via `_prepareStripeOptions`. If not present, let it fall back on the browser's locale. opw-5024805 Forward-Port-Of: odoo/odoo#226045
Fixes an issue in the website editor where choosing a vertical alignment option for a table cell did not apply the change because the menu closed too quickly. This makes table formatting more reliable for users editing website content.
Original PR description
### Steps to reproduce: - Navigate to the Website module. - Drag and drop a Text Snippet. - Create a Table (e.g., /table) and select a table cell. - Click on Vertical Align button in toolbar and apply alignment option. ### Description of the issue/feature this PR addresses: - When clicking on a vertical align option inside the dropdown, overlay was immediately closed. Because of this, the click event handler was not triggered, and the selected vertical alignment was not applied to the table cell. ### Desired behavior after PR is merged: - Prevent overlay from closing by using `data-prevent-closing-overlay`. task-5062814 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an internal dependency used by the Google Maps options in the website editor. It helps prevent editor issues caused by relying on a testing-only component, with no expected change to normal website visitor behavior.
Original PR description
The commit 47e971086ea57219a628a99d35e36354c71a4192 uses `Deferred` in the implementation of the google maps options plugin. But imported it from hoot. This commit fixes the import to use `concurrency.js` instead. task-4367641
This fixes an issue where selected website color palette names were saved without the expected quotation marks after a recent refactoring. Restoring the correct format helps prevent theme customization settings from being misread or applied incorrectly.
Original PR description
Since the refactoring, the `color-palettes-name` value is not surrounded by quotes in the `user_values.scss` anymore. This commit restores the quotes upon selection. task-4367641
Long custom out-of-stock messages on product pages now stay within their display box instead of spilling over at narrower screen sizes. This keeps product pages looking clean and readable for shoppers on different devices.
Original PR description
When the Out-of-Stock message contains a long string of text at certain screen sizes the text is longer than the parent div Steps to reproduce -------------------- 1. Have a tracked product with Continue Selling off and a long custom Out-of-Stock Message. 2. View the product shop page on the website. 3. Reduce the horizontal screen size until the text goes over the edge of the parent div(red rounded box). Cause ----- No CSS to handle when the text is longer than the parent element. Solution -------- Add text-wrap to parent div so the child element text wraps when necessary. opw-5056843
On small screens, selecting items such as Preferences from the user menu now closes the burger menu first. This prevents dialogs from opening hidden behind the menu, making mobile navigation clearer and less frustrating.
Original PR description
This commit ensures the BurgerMenu is closed when clicking on one of its items, and specifically on one of the BurgerUserMenu items. Steps to reproduce (on small screen): - on a "base" database (no app installed) - click on the BurgerMenu (top right) - click on "Preferences" => the user's preference dialog opens behind the BurgerMenu Forward-Port-Of: odoo/odoo#226739 Forward-Port-Of: odoo/odoo#225696
21 changes
Resolved issues and error corrections
Event track emails now use embedded image-based icons instead of relying on external icon fonts that many email clients cannot display. This ensures recipients see the intended visual elements in event communications, improving email clarity and consistency.
Original PR description
Font awesome classes must no be inserted into email as external servers do not use them so icons are not displayed. This commit replaces i tags with font awesome classes in mail by images. Task-5082165
This fixes an internal error-handling issue that could turn an expected closed connection event into a misleading system error. The change helps keep automated test and monitoring results clearer, making it easier for teams to identify real issues.
Original PR description
Followup to 16.0-closed-in-stop-xmo: the condition in `stop` is a `hasattr`, so we need to delete `self.ws` not set it to `None`. Setting it to `None` means the condition passes then blows up as soon as we try to use it, which means we "just" converted all the old `WebSocketConnectionClosedException` to an `AttributeError`. https://runbot.odoo.com/odoo/error/231446 Forward-Port-Of: odoo/odoo#226267
Due to time constraints the translations were not added in the commit adding the modules (72ac059edfcc35ad44c5faa9daf971123377af24). This commit adds the translations / fills the `.po` files. The translations were created by LMAN based on the 18.0 po files. Veri*Factu task: task-3745982 Forward-Port-Of: odoo/odoo#226298 Forward-Port-Of: odoo/odoo#225173
Original PR description
Due to time constraints the translations were not added in the commit adding the modules (72ac059edfcc35ad44c5faa9daf971123377af24). This commit adds the translations / fills the `.po` files. The translations were created by LMAN based on the 18.0 po files. Veri*Factu task: task-3745982 Forward-Port-Of: odoo/odoo#226298 Forward-Port-Of: odoo/odoo#225173
This fixes an internal test so it matches the updated wording returned by the email server library. It helps keep automated quality checks reliable without changing business functionality for users.
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
Fixes an error that could block users from downloading invoice attachments through the Send & Print wizard when Uruguayan electronic invoice files were present. The electronic invoice file is now excluded from that download flow, while remaining available from its own document screen.
Original PR description
When downloading attachment via the send & print wizard, we get an error from the server. This is because we raise an assertion error if any attachment is not from 'account.move' model. But the CFE file is from 'l10n_uy_edi.document' model. With this commit, we extend the `_action_download` method to filter the CFE file from the attachments. It is not blocking for client as he can still download it from the form view of the CFE document. Steps: - Create an invoice - Set a 0% tax on the invoice line - In 'Other infos' tab, fill the 'Incoterm', 'Sales Modality' and 'Transportation Rules' fields - Confirm - Open S&P wizard, select 'Create CFE' and confirm - Reopen S&P wizard, select 'Download' and confirm (can be done along the previous step too) -> Error opw-5043902 Forward-Port-Of: odoo/enterprise#93830
Scanning package type barcodes with GS1 barcode settings now works without causing server errors. This prevents interruptions in warehouse barcode workflows when teams scan package information.
Original PR description
Steps to Reproduce: - Set the barcode nomenclature to GS1 - Scan a package type barcode - Server logs an AttributeError(in Odoo 18) or KeyError(in Odoo 16 and 17) Issue: - The model class "stock.package.type" is missing an attribute "_barcode_field" Solution: - Add the attribute "_barcode_field" to the model class "stock.package.type" Task: [4888064](https://www.odoo.com/odoo/49/tasks/4888064) Forward-Port-Of: odoo/enterprise#94347 Forward-Port-Of: odoo/enterprise#93116
This fix stops Odoo from adding a log note when a Saudi e-invoicing error happens before any request is sent to ZATCA. It keeps invoice communication history cleaner by only logging actual ZATCA responses.
Original PR description
In a previous commit e90c35cde2a1f5de5d7bc4db7a525638ca3fab6e, we modified the logic of posting a log note when receiving a response from ZATCA to always log a note of the response. An issue occured because sometimes, Odoo raises user errors before sending a request to ZATCA, In which case, we do not need to log a note. Task-id: 5056724 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#226174 Forward-Port-Of: odoo/odoo#226036
The Point of Sale app no longer crashes when no cashier user is available. Instead, it safely returns no user value, allowing the existing checkout logic to continue as intended.
Original PR description
When there is no user, you get a traceback when it tries to access user.id. As the code that call getCashierUserId handles the fact that a falsy value is returned, we return undefiened when there is no user. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes sure serious setup issues in Odoo's web test runner are reported clearly during preliminary checks. It helps prevent critical test problems from being hidden, improving the reliability of automated quality checks before changes are accepted.
Original PR description
The test runner replaces most occurences of `console.log` with a formatted `console.trace`, as to avoid duplicate runbot error messages in general. The issue is that during the dry run, errors that are caught should be logged on the runbot since these errors are more critical (i.e. duplicate test name, which will prevent the runner to run at all). This commit ensures that errors caught during dry run are logged as actual errors to prevent this issue. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225688
The web test runner now preserves excluded tests when simplifying test URLs. This prevents selected test runs from accidentally including tests that were explicitly left out, improving reliability for internal quality checks.
Original PR description
Before this commit, when the test runner simplified the URL (e.g. if the runner is given the ID of every test in a suite, it will remove them and only include the suite ID), it always considered IDs as being "included", and ignored the "-" specifying that some IDs should be "excluded". --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225950
Appointment booking notifications are now sent only to the intended internal followers, not to attendees or visitors. This avoids confusing duplicate or inappropriate emails while keeping staff informed when new appointments are created.
Original PR description
[1] introduces the new paradigm of always sending emails to "relevant recipients" which fetches emails and partners linked to the relevant record to send a message.
In appointment the "Appointment Booked" template is only meant to be sent to followers of `mt{_calendar,_appointment}_event_booked` to inform users that a new appointment was created even if they are not personally assigned to it.
`test_request_meeting_message_for_manual_confirmation` is also updated to represent the case of some visitor creating booking an appointment instead of using internal users for everything to better represent real use cases. Additionally each mail.mail record is extracted and checked individually to make sure we send the right contents to the right recipients.
[1]: 1dd6070ecaab385446cc2df7cad444f046812061
task-5075513
task-4711415Survey answers for date and time questions now show times in the current user's timezone. This prevents confusion where the answer list displayed a different time than the detailed answer form.
Original PR description
Steps to reproduce ==================== 1. Create survey with some datetime questions. 2. Receive some response on it. 3. Check answer of datetime questions in answer tab. 4. Click on that answer to open form. ->The time shown in answer tab differs from actual value in form. The display_name of survey.user_input.line is computed based on the answers submitted by users. For questions of type datetime, the display_name was generated by converting the datetime value to a string without accounting for the user's timezone, leading to a mismatch between the actual value and the displayed time. After this commit ================== This commit updates the computation of display_name for datetime answers to consider the current user's timezone. Task-4890423 Forward-Port-Of: odoo/odoo#226354 Forward-Port-Of: odoo/odoo#216281
Users could encounter an error when using the debug Data view on records that include field properties. This fix lets the data view load and display those records correctly, improving reliability for troubleshooting and configuration work.
Original PR description
Example Steps: - Install `crm` - Add a random field properties in a random form view - Enable debug mode - Open debug menu - Select Data - Traceback ```py raise ValueError(f"Invalid field…
Example Steps:
- Install `crm`
- Add a random field properties in a random form view
- Enable debug mode
- Open debug menu
- Select Data
- Traceback
```py
raise ValueError(f"Invalid field {field_name!r} on model {self._name!r}")
ValueError: Invalid field 'properties.xyz' on model 'x.y'
```
There are two causes for this problem.
First, we use orm.read to retrieve data from records, which does not directly handle sub-field properties. We only need to use `definition_property` (which contains the overall schema of the JSON field).
Second, when displaying the data, we use JSON.stringify with `replacer`:
```js
get content() {
const record = this.props.record;
return JSON.stringify(record, Object.keys(record).sort(), 2);
}
```
In this case, replace contains all the keys present in record, sorted. The problem is that the properties fields are themselves objects that contain the keys: `name`, `string`, `type`, `default`, `value`.
And giving an array to replace in `JSON.stringify` will filter the keys and keep only those that are whitelisted in it.
```js
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
const foo = {
foundation: “Mozilla”,
model: “box”,
week: 45,
transport: “car”,
month: 7,
};
JSON.stringify(foo, [“week”, “month”]);
// ‘{“week”:45,“month”:7}’, only keep ‘week’ and “month” properties
```
This will ignore the keys of the properties fields.
The fix is therefore to sort the object before stringifying it, without using replace.
Thanks to these two fixes, the data is displayed as expected, regardless of whether there are field properties or not.
opw-5017425
Forward-Port-Of: odoo/odoo#224437
Forward-Port-Of: odoo/odoo#224084Deleting a message that contains a link preview now also removes the related preview automatically. This prevents leftover previews from staying visible and avoids the need for manual cleanup.
Original PR description
**Specifications:** - Ensure link preview is removed when deleting a message. **Purpose:** - Previously, deleting a message with a link preview did not remove the preview, requiring manual intervention. - This fix ensures that when a message containing a link preview is deleted, its associated preview is also removed automatically, improving user experience. task-4678962 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#204930
Opening a spreadsheet instruction step in Shop Floor now works without showing an unexpected traceback. This removes a confusing error message for manufacturing users while keeping the spreadsheet step behavior unchanged.
Original PR description
To reproduce: - Make a new BOM for new product P, with 1 operation on assembly line 1 - Add a spreadsheet step to the operation - Make a MO for 1x P - Open shop floor, assembly line 1, click on the spreadsheet step Current behaviour: - The spreadsheet step opens correctly, but we get a traceback Expected behaviour: - The spreadsheet step opens correctly, no traceback task-4965313
Stripe card payment fields now use the language selected on the website instead of defaulting to the shopper's browser language. This creates a more consistent checkout experience for multilingual websites, while still falling back to the browser language when no website language is available.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Enable Stripe; 2. enable a second language on the website; 3. use second language on website; 3. go to checkout; 4. open card payment method. Issue ----- The card field values are displayed using the current browser's locale instead of the website's language. Cause ----- The `locale` parameter isn't included when connecting to the Stripe API. Solution -------- Include the lang from the `html` element via `_prepareStripeOptions`. If not present, let it fall back on the browser's locale. opw-5024805 Forward-Port-Of: odoo/odoo#226045
This fix prevents invoice attachments from appearing on related credit notes or other standard accounting records after reconciliation. Attachments from reconciled entries will now only be shown in the bank reconciliation view, keeping accounting chatter cleaner and less confusing.
Original PR description
Problem --------- In odoo/enterprise#85991, attachments from reconciled moves were displayed in the chatter along side the moves' attachments. This change was meant to affect only the bank reco widget. However, its scope reached the standard accounting behavior. STEPS --------- 1. Have 'account' installed 2. Create a move 3. Confirm and create the PDF attachment from the Send&Print 4. Create a credit note from it 5. Confirm the credit note -> The 2 moves are now reconciled and the PDF of the invoice is shown in the chatter of the credit note Objective --------- Only show reconciled moves' attachments in the bank reco chatter. Solution --------- Add a context key that is added when the Bank Reco widget is created and remove it when it is deleted. opw-#######
This change improves how Odoo detects whether the newer ngrok service is available for POS Box connectivity. It prevents Odoo from falling back to the older startup method when the service exists but is not yet running because setup still needs configuration.
Original PR description
Before this commit, the check in the ngrok controller for whether to use the new ngrok service or the old method of launching ngrok was flawed. The check used `systemctl is-active`, however this will only succeed if the service is up and running successfully, which isn't the case initially due to the missing token config. After this commit, we use `systemctl is-enabled` instead. This command succeeds as long as the service exists and is not disabled, even if it is currently in error. ```bash > systemctl is-active odoo-ngrok.service activating > echo $? 3 > systemctl is-enabled odoo-ngrok.service enabled > echo $? 0 ``` task-5075770 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226813
This fix prevents restaurant POS sessions from incorrectly treating all product categories as needing preparation when no preparation printer or display category is configured. Staff will no longer see unnecessary order/send-to-preparation prompts during checkout in these configurations.
Original PR description
Steps to reproduce: - Open a pos restaurant config that has no prep printer/display. - Add an orderline. - The order button appear and if you try to pay the popup ask for send to preparation is shown. Issue: If there is no preparationCategories for a config getOrderChanges consider that all the available categories are the preparationCategories. Fix: If there is no preparationCategories, set the orderline uiState hasChange to false. Note: When no preparation printer category is defined, no categories is to be return by default. For the preparation display, if no preparation categories is selected preparationCategories will return all the available categories. Task-5016231
On small screens, selecting an option such as Preferences from the user menu now closes the burger menu first. This prevents dialogs from opening hidden behind the menu and makes mobile navigation clearer for users.
Original PR description
This commit ensures the BurgerMenu is closed when clicking on one of its items, and specifically on one of the BurgerUserMenu items. Steps to reproduce (on small screen): - on a "base" database (no app installed) - click on the BurgerMenu (top right) - click on "Preferences" => the user's preference dialog opens behind the BurgerMenu Forward-Port-Of: odoo/odoo#226739 Forward-Port-Of: odoo/odoo#225696
This fix ensures subscription contracts with no charge are not incorrectly flagged as needing an invoice. It helps prevent unnecessary invoice processing and keeps subscription billing status accurate.
1 change
Resolved issues and error corrections
This draft reverses a previous change affecting how rental products behave in the online shop. It likely restores earlier behavior for website rentals while the reverted change is reviewed or corrected.
Original PR description
revert of 655e0875b192575dd699cf36676c02f1c241daa2
15 changes
Resolved issues and error corrections
Archived quality points are now excluded from the product Quality Points smart button. This keeps the displayed count and list accurate, reducing confusion for users reviewing quality controls.
Original PR description
**Steps to reproduce:** 1. Install the module `quality_control`. 2. Go to **Products → select any product → Quality Points (smart button)**. * Create a new Quality Point that applies to *all…
**Steps to reproduce:** 1. Install the module `quality_control`. 2. Go to **Products → select any product → Quality Points (smart button)**. * Create a new Quality Point that applies to *all products*. 3. Open any product form. * Verify that the *Quality Points* smart button shows the created point and the correct count. 4. Archive the Quality Point. 5. Reopen the same product form and check the *Quality Points* smart button again. **Observed behavior:** - The archived Quality Point is still counted and shown in the smart button. **Root cause:** - During the refactor from raw SQL (`get_sql` + `cr.execute`) to the ORM query builder (`query.add_where(SQL(...))`), one outer bracket was dropped. [ref](https://github.com/odoo/enterprise/pull/66290/commits/a6362bc07eac7640f68d145a0f6a14a81f499913#diff-2ffdc2ffc25417076b580b772447514c7e9d8b3e2d2fff2d3100721eb5ccbaf4L542-R561) - This changed the operator precedence, causing the `active = true` condition to no longer properly apply when combined with the OR block. - As a result, archived Quality Points bypass the filter and are still counted. **Solution:** - Fix the missing bracket in the `query.add_where` SQL expression so that the `active` condition is always enforced before evaluating the OR block. opw-5046289 Forward-Port-Of: odoo/enterprise#94173
This fixes an issue in the Belgian CodaBox integration where processing multiple companies could trigger an error. The correction helps ensure company-specific CodaBox actions run reliably without disrupting users.
Original PR description
We incorrectly used the recordset `self` instead of the record `company` This commit fixes this opw-5036698 Forward-Port-Of: odoo/enterprise#94289
Downloading documents from the Send & Print wizard no longer fails when a Uruguayan electronic invoice file is present. The system now skips that specific electronic tax document in the wizard download, while users can still access it from the CFE document screen.
Original PR description
When downloading attachment via the send & print wizard, we get an error from the server. This is because we raise an assertion error if any attachment is not from 'account.move' model. But the CFE file is from 'l10n_uy_edi.document' model. With this commit, we extend the `_action_download` method to filter the CFE file from the attachments. It is not blocking for client as he can still download it from the form view of the CFE document. Steps: - Create an invoice - Set a 0% tax on the invoice line - In 'Other infos' tab, fill the 'Incoterm', 'Sales Modality' and 'Transportation Rules' fields - Confirm - Open S&P wizard, select 'Create CFE' and confirm - Reopen S&P wizard, select 'Download' and confirm (can be done along the previous step too) -> Error opw-5043902 Forward-Port-Of: odoo/enterprise#93830
Scanning package type barcodes with GS1 barcode settings now works without triggering server errors. This prevents interruptions in warehouse barcode workflows and keeps package handling smoother for users.
Original PR description
Steps to Reproduce: - Set the barcode nomenclature to GS1 - Scan a package type barcode - Server logs an AttributeError(in Odoo 18) or KeyError(in Odoo 16 and 17) Issue: - The model class "stock.package.type" is missing an attribute "_barcode_field" Solution: - Add the attribute "_barcode_field" to the model class "stock.package.type" Task: [4888064](https://www.odoo.com/odoo/49/tasks/4888064) Forward-Port-Of: odoo/enterprise#94347 Forward-Port-Of: odoo/enterprise#93116
The Count Entire Locations button now appears correctly during normal stock operations such as deliveries and receipts. It remains restricted only on the physical inventory page, helping warehouse users access the right action in the right workflow.
Original PR description
This commit fixes showing "Count Entire Locations" button in normal operations (delivery, receipt, etc.) and only restricts it in physical inventory page. Forward-Port-Of: odoo/enterprise#94194
Voice recording now shows a clearer notification when it cannot start because of a backend setup issue, such as a missing API key. This helps users understand what went wrong and reduces confusion when transcription is unavailable.
Original PR description
This PR adds a more explicit toast message for the recording when an error occurs on the backend (i.e. UserError). This applies to cases such as not having the API key set and trying to start the recording
Several spreadsheet dashboards have been corrected so charts line up properly and are easier to read. The Helpdesk and Operation Analysis dashboards also receive visual improvements, helping teams interpret key metrics with less confusion.
Original PR description
Forward-Port-Of: odoo/enterprise#94387
The Belgian salary configurator now prevents employees from combining a reimbursed private bike option with fuel card benefits. When private bike reimbursement is active, fuel card values are cleared and the related fields are disabled to keep salary choices consistent with policy.
Original PR description
The Belgian salary configurator allows employees to declare a private bike cost. When the "Private Bike" option is checked and its reimbursement value is greater than zero, the fuel card inputs must be reset to 0 and disabled. task-5062963 Forward-Port-Of: odoo/enterprise#94063 Forward-Port-Of: odoo/enterprise#93884
This fix prevents products using nightly rental pricing from being combined with other rental period types. It helps avoid incorrect rental configurations and pricing issues after recent changes.
Original PR description
with other rental periods. Fixes from regression testing post merge. Forward-Port-Of: odoo/enterprise#93715
This update corrects an issue in the SEPA Direct Debit payment form behavior. It helps ensure the payment flow works as intended for customers using SEPA direct debit, reducing the risk of failed or confusing checkout experiences.
Original PR description
Forward-Port-Of: odoo/enterprise#94462
This update corrects the product name from “Urban Piper” to “UrbanPiper” across point-of-sale restaurant-related screens, settings, translations, and tests. It helps keep branding consistent and avoids confusion for users configuring or using the integration.
Original PR description
Description of the issue/feature this PR addresses: Correct the spelling Current behavior before PR: Urban Piper was in 2 words. No space needed Desired behavior after PR is merged: UrbanPiper in one word
The accounting import screen now correctly passes the intended target to each import button. This prevents confusion or failed imports when the same page offers multiple import options.
Original PR description
Since [1], the import action will infer the model from the current action. In this case, the action is a client action with multiple import buttons. This commit, adapts the extends of the import action to accept the model as as a parameter. Forward-Port-Of: odoo/enterprise#94388
This fixes an error in the Salary Calculator that occurred when removing an employee's working schedule. Payroll users can now adjust salary simulation details without being interrupted by a system crash.
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 (`Expected singleton: resource.calendar()`) because `salary_simulation` was not correctly set in the context, causing the flow to recompute work entries with an empty calendar. #### Fix In order to avoid work entry recomputations during simulation, always attach `salary_simulation=True` in the base `_get_version()` and propagate the context when creating a new version for the simulation employee. task-5063150
This fix ensures temporary concurrency conflicts during website generation are handled in a way that allows the process to retry instead of failing prematurely. It improves reliability when multiple operations happen at the same time.
Original PR description
When a concurrency error occurs, we need to let it retry. To do this, we must catch the Serialization Failure and raise it. Forward-Port-Of: odoo/enterprise#93851
The wording in the bank synchronization duplicate finder was corrected to remove an instruction users could not actually follow. This avoids confusion by no longer suggesting that customers select a journal when that option is unavailable.
Original PR description
The aim of this commit is removing a small part of sentence in the find duplicate tool in bank synchronization. Indeed, this sentence is proposing the customer to select the journal where it's not possible to do it. no task id Forward-Port-Of: odoo/enterprise#94386
29 changes
Resolved issues and error corrections
Live chat agents now see recent website visit times in their own timezone instead of UTC. This makes the visitor history banner easier to understand and helps agents interpret customer activity accurately during conversations.
Original PR description
Before this PR, when browsing a website livechat in the discuss app, the banner containing the 3 last pages browsed by the user showed the utc time instead of the time in the timezone of the agent. Now, the livechat agent is seeing the visit timings in his timezone. To achieve this, we now construct the visit string in the frontend and receive the page and datetime (utc) info from the backend task-4937769 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225761 Forward-Port-Of: odoo/odoo#219113
Product pictures in the sales catalog now display without being stretched when they are not square. This improves the visual quality of quotations and helps users recognize products more easily.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have products with non-square images available for sale; 2. open a quotation; 3. open the product catalog. Issue ----- The product images appear stretched. Cause ----- Commit e8836b42200e3 replaced the `div.kanban_image` element with a `field` element using the `image` widget. It maintained the same size limit of 55x55 via the widget's options, but without additional input, this causes the widget to stretch the images to fill the area. Solution -------- Add the `object-fit-contain` as `img_class` to the options. This class contains the image to the area instead of stretching it. opw-5007629 Forward-Port-Of: odoo/odoo#225112
This fixes a small issue in the Mercado Pago payment form customization. It helps ensure the payment option behaves as intended during checkout, reducing the chance of customer payment friction.
This fix keeps spreadsheets in the light theme because the spreadsheet interface does not support dark mode yet. It prevents mixed dark and light styling, making the spreadsheet screen look consistent and easier to use.
Original PR description
Spreadsheet doesn't support dark theme. This fixes some style where dark and light themes are mixed. Task: 5082593 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
A stock app test now sets up a default route so it can run correctly when only the Stock module is installed. This prevents automated validation from failing due to a missing button, improving confidence in Stock module quality checks.
Original PR description
Issue Before This Commit: ============================ The test_stock_route_diagram_report tour fails when only the stock module is installed. The tour breaks because the element `.btn[id="stock.view_diagram_button"]` is not found. Steps to Reproduce: ============================ - Install only the `stock` module. - Run the `test_stock_route_diagram_report` test. - The tour breaks because the element `.btn[id="stock.view_diagram_button"]` is not found. Cause of the Issue: =========================== The tour breaks due to a recent [PR](https://github.com/odoo/odoo/pull/223685) that hides the `view_diagram_button` when no routes are available for the product. With This Commit: ============================ Ensure the tour runs successfully by activating a default MTO route in the test setup, so the required element is present. runbot-232573
The chat window message composer now uses more consistent spacing at the bottom and sides. This small layout fix makes the chat area feel cleaner and allows slightly more conversation history to remain visible on screen.
Original PR description
This makes consistent spacing of bottom and horizontal, and also has the benefit to show more message list in viewport. Before <img width="1169" height="644" alt="Screenshot 2025-09-11 at 11 52 03" src="https://github.com/user-attachments/assets/7863dc04-d572-4c37-b182-6d519956a041" /> After <img width="1167" height="647" alt="Screenshot 2025-09-11 at 11 48 21" src="https://github.com/user-attachments/assets/8980a2a2-93fc-4016-8e76-5b5b3fa6899a" />
This fixes a visual issue where thumbnail images in website product snippets could repeat in the background. Product displays now look cleaner and more consistent for shoppers browsing the website.
Original PR description
This PR fixes a issue where the thumbnail image on the 'products' snippets would repeat itself. task-5076717 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Embedded live chat users can now open meeting chats from the chat window as intended. This fixes a missing permission in the embedded experience, making meeting-related conversations accessible without changing broader live chat behavior.
Original PR description
The embed live chat has a subset of allowed thread actions. The meeting chat action was added but not added to the allowed thread actions. In the future, we will allow most of the thread actions, at least the ones allowed for guests. Environment should not impact feature availability. However for now, let's just enable the missing action.
Indian localization reports now calculate return statuses using the latest shared Odoo logic. This keeps these reports consistent with the rest of the system and helps avoid incorrect return states in Indian reporting workflows.
Original PR description
## Before this commit The state was computed using the `__get_state_field()` method. After the reference commit, the state computation logic was improved, but this updated logic was not applied in `l10n_in_reports`. Ref commit: https://github.com/odoo/enterprise/commit/a3083e9db2534d649bfc2d02dac79582ebb6397a ## After this commit: The computation of state in `l10n_in_reports` now follows the latest logic, keeping it consistent with the generic code.
Fixed an error that could prevent users from opening the rental availability view from a rental order. This helps rental teams check product availability reliably without being interrupted by a system traceback.
Original PR description
**Steps to reproduce:** 1. Go to Rental > Create a rental product and enable Sales. 2. Create a rental order with a customer and created product. 3. Click the availability icon and open the view rental. **Issue:** A traceback occurs: `Caused by: InvalidDomainError: Invalid domain representation: product_id,=` **Cause:** The rental availability check crashed due to improper domain construction: <img width="453" height="89" alt="image" src="https://github.com/user-attachments/assets/fd3ff556-fdab-40ab-9c1b-a539e5b164e8" /> **Solution:** Now the `product_id` is correctly retrieved from the record’s `id` property before building the domain, preventing crashes when opening the rental gantt view. opw - 5066061 Forward-Port-Of: odoo/enterprise#94288
Deleting all items from a grouped list no longer causes an error screen. This keeps list views stable when users remove the last records in a group.
Original PR description
After this commit [1], deleting all entries of a grouped list may trigger the following traceback: ``` TypeError: value[currencyField].forEach is not a function ``` This happens because the `currency_id` of an empty group becomes `0`, so `forEach` is called on a non-iterable value. This fix ensures that `currency_id` is correctly handled to prevent such error. [1] odoo@98f7462
Fixed an issue where downloading files from the Send & Print wizard could fail for Uruguayan electronic invoices. The wizard now skips the CFE attachment that belongs to the e-invoicing document, while users can still access that file from the CFE document itself.
Original PR description
When downloading attachment via the send & print wizard, we get an error from the server. This is because we raise an assertion error if any attachment is not from 'account.move' model. But the CFE file is from 'l10n_uy_edi.document' model. With this commit, we extend the `_action_download` method to filter the CFE file from the attachments. It is not blocking for client as he can still download it from the form view of the CFE document. Steps: - Create an invoice - Set a 0% tax on the invoice line - In 'Other infos' tab, fill the 'Incoterm', 'Sales Modality' and 'Transportation Rules' fields - Confirm - Open S&P wizard, select 'Create CFE' and confirm - Reopen S&P wizard, select 'Download' and confirm (can be done along the previous step too) -> Error opw-5043902 Forward-Port-Of: odoo/enterprise#93830
This change fixes an issue in the SEPA Direct Debit payment form customization. It helps ensure the payment form behaves as expected when customers use SEPA Direct Debit, reducing the risk of checkout or payment setup problems.
The PAN entity list in the Indian localization no longer shows the same Type column twice. This removes visual clutter and makes the list easier for users to read without changing any underlying data or workflow.
Original PR description
Before: - The list view in `l10n_in_pan_entity_view_tree` included `type` field twice, causing redundancy. After: - The duplicate field has been removed
The Website Builder mobile preview button now uses green to better match the product's visual theme. This is a small visual consistency fix with low business impact.
Original PR description
- The mobile preview button color is changed to green to align with the overall theme. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where image descriptions could be accidentally erased after reopening and saving the website SEO dialog without making changes. It helps preserve accessibility and SEO metadata reliably for website content.
Original PR description
Steps to reproduce: 1. Open Optimize SEO. 2. Mark an image as decorative. 3. Give a description(ALT) to that image from editor. 4. Open Optimize SEO again and save without doing anything. Issue: The description(ALT) on the image being set is lost. Cause: When reopening the `Optimize SEO` dialog, `seoContext.updatedAlts` still contained entries from previous edits. As a result, saving without making any further change triggered an call to `/website/update_alt_images` which reset the `alt` attribute to empty, effectively discarding the description. This PR ensures `seoContext.updatedAlts` is reset when opening the dialog.
Odoo now ignores accounting localization templates from modules that are not currently installable. This prevents unnecessary error logs when a custom localization module is present but not yet ready to be installed.
Original PR description
* Problem: if having a custom module that add extra tax to current localization module, ex: l10n_x inherit l10n_vn module, but the l10n_x module is not installable because it hasn't upgraded yet, the _get_chart_template_mapping include it as well, there for will log error in https://github.com/odoo/odoo/blob/18.0/addons/account/models/chart_template.py#L1219 * Solution: only get available template code for module that installable 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#225821
The account reports return screen now shows only the relevant reset button, reducing confusion for users handling tax or EC sales list returns. This fixes a display issue caused by the system checking return type details in the wrong place.
Original PR description
Multiple reset buttons were visible on returns, which was confusing. This happened because `is_tax_return_type` and `is_ec_sales_list_return_type` were referenced via `type_id` in invisible, which does not work correctly. To fix this, two related fields (`is_tax_return_type` and `is_ec_sales_list_return_type`) were added directly on `account_return`, and these are now used in invisible. ref - https://github.com/odoo/enterprise/commit/a3083e9db2534d649bfc2d02dac79582ebb6397a
This fixes a checkout issue where the browser could incorrectly restore the billing-address checkbox state after a customer used the back button. The billing address section now stays consistent with the customer’s actual choice, reducing checkout confusion.
Original PR description
Steps to reproduce: 1) Add a product and go to checkout 2) Uncheck use_delivery_as_billing 3) Click to edit the main address for example 4) Return to the previous page via the browser button 'back' See that use_delivery_as_billing is unchecked but the billing address row is hidden, it happens due to the browser's autocomplete.
Theme modules can now include their customization settings without being incorrectly rejected during validation. This prevents automated checks from failing for valid theme updates and helps keep theme releases moving smoothly.
Original PR description
Follow-up of PR https://github.com/odoo/design-themes/pull/1137 that introduced `theme_customizations` in design theme manifests for eCommerce block customizations. For Error https://runbot.odoo.com/odoo/runbot.build.error/232249 : Issue: - `ManifestLinter.test_manifests` errors in multiple theme modules. - The error was caused by the `theme_customizations` key being unrecognized in manifests and flagged as unknown. Fix: - Added `theme_customizations` to the list of allowed manifest keys, so the linter accepts it in theme module manifests.
The Newsletter Benefits snippet now shows a "Popup" label in the website editor preview. This fixes a missing label so users can more easily identify the snippet behavior before adding it to a page.
Original PR description
This PR adds the "Popup" label to the "Newsletter Benefits" snippet in the preview in `AddSnippetDialog`. [*]: website_mass_mailing | Before (missing label) | After (introduced label) | |-----------------------------|---------------------------------| | <img width="433" height="214" alt="image" src="https://github.com/user-attachments/assets/22bd30c6-0085-4739-bcf5-d4c84b1353a0" />| <img width="435" height="226" alt="image" src="https://github.com/user-attachments/assets/e29c2707-fb85-4252-931a-8044ffb183f0" /> |
Account return cards now show the correct Reset button instead of displaying two at once. This avoids user confusion and makes the return workflow clearer in accounting and Intrastat reporting.
Original PR description
Two buttons "Reset" are shown in the card of an account return. This is due to the invisible attributes that wrongly computes the value. Indeed, it is not possible to write something like "type_id.is_intrastat_return_type" in an invisible condition, so we need to make a related field.
The quick reorder button now shows text that can be translated for different languages. Its help text also updates immediately when the button becomes disabled, so customers see accurate guidance without refreshing the page.
Original PR description
Before this fix: - The quick reorder button title was not translatable. - After the quick reorder sidebar became empty, the button was disabled but its title was not updated accordingly. A page reload was required to see the correct title. After this fix: - The button title is now translatable. - The title is refreshed immediately when the button state changes, without needing a page reload.
This fixes a visual issue in Discuss calls where participants without video could show two green speaking outlines at once. The speaking indicator now appears in the right place, making calls look cleaner and less confusing for users.
Original PR description
Before this commit, when in a discuss call, a participant that talks while sending no video stream (both camera and screen-sharing off) would display double "is talking" green outline. This happens…
Before this commit, when in a discuss call, a participant that talks while sending no video stream (both camera and screen-sharing off) would display double "is talking" green outline. This happens when the card is not minimized, such as when this is the active main card or another participant has camera or screen-sharing on. In that case, the "is talking" outline effect is shown twice: one around the card border like card with video stream, and one around the participant avatar. The outline around the card like video stream is intended, the one around image should only happen when not around the card. This commit fixes by setting the "is talking" around image only when the card is minimized. Before <img width="498" height="315" alt="Screenshot 2025-09-11 at 15 41 09" src="https://github.com/user-attachments/assets/52334553-8ef9-460c-9162-805f44db5980" /> After <img width="499" height="314" alt="Screenshot 2025-09-11 at 15 33 39" src="https://github.com/user-attachments/assets/119ea12f-d90c-4f9d-a131-8fd6b15ec858" />
The mobile checkout cart summary now uses less screen space by hiding an extra separator. Spacing around the back action was adjusted to reduce accidental taps on the confirm button, making checkout easier on smaller screens.
Original PR description
The sticky cart summary is taking a lot of screen estate. This commit hides the - or - on mobile to optimize spacing. Replace padding top for margin top to avoid misslick on the confirm button. task-5080440 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Scanning package type barcodes with GS1 barcode settings now works without triggering server errors. This prevents interruptions in warehouse barcode workflows and improves reliability for package handling.
Original PR description
Steps to Reproduce: - Set the barcode nomenclature to GS1 - Scan a package type barcode - Server logs an AttributeError(in Odoo 18) or KeyError(in Odoo 16 and 17) Issue: - The model class "stock.package.type" is missing an attribute "_barcode_field" Solution: - Add the attribute "_barcode_field" to the model class "stock.package.type" Task: [4888064](https://www.odoo.com/odoo/49/tasks/4888064) Forward-Port-Of: odoo/enterprise#94347 Forward-Port-Of: odoo/enterprise#93116
[This commit][1] introduced errors in the Dutch and German translation files. As a result this module can not be installed anymore when any of these languages is used. This commit fixes the errors. [1]: https://github.com/odoo/enterprise/commit/d3d5e667a2d543b55a40148cb536e54d2ac64300
Original PR description
[This commit][1] introduced errors in the Dutch and German translation files. As a result this module can not be installed anymore when any of these languages is used. This commit fixes the errors. [1]: https://github.com/odoo/enterprise/commit/d3d5e667a2d543b55a40148cb536e54d2ac64300
This change fixes an internal upgrade test so it works correctly when run from external add-on locations. It helps keep automated checks reliable and reduces false failures during development and validation.
Original PR description
This test fails when executed on an external addons path. (runbot)
Self-billing invoice sequences now use a padded partner ID instead of the partner name, making references clearer and less likely to be confused with dates. The numbering is also grouped by commercial partner, helping keep invoice sequences consistent across related contacts.
Original PR description
- We prefer to use the partner's ID (padded to 5 digits to avoid confusion with the year) rather than the partner name - We make sure the sequence is unique per commercial partner rather than per partner. task-none
13 changes
Resolved issues and error corrections
Sales orders created from a contact now use the customer's preferred delivery address, matching the behavior in the Sales app. This avoids orders being sent to an older or less relevant address when customers have multiple delivery locations.
Original PR description
## Versions 17.0+ ## Issue When creating a SO from the Contacts app, the first delivery address is used, ignoring the preferred one. In contrast, the Sales app correctly uses the preferred delivery…
## Versions
17.0+
## Issue
When creating a SO from the Contacts app, the first delivery address is used, ignoring the preferred one. In contrast, the Sales app correctly uses the preferred delivery address. This fix ensures consistent behavior across both.
## Steps to reproduce
*Ensure Contacts app is installed*
*Activate "Customer Addresses" in the settings*
- Go to the Contacts app:
- Create a new contact:
- Name: C1;
- Contacts & Addresses:
- Delivery Address (Add 2 new addresses):
- D1;
- D2.
- Click the "Sales" action button:
- Create a new SO for C1 (pre-filled):
- Invoice Address: C1, D2;
- Delivery Address: C1, D2;
- Add any product with:
- Quantity: 1;
- Delivered: 1.
- Create the invoice and confirm it.
- Go back to Contacts and look for C1:
- Click the the "Sales" action button:
- Create a new SO and see the Delivery Address set to "C1, D1".
- Go to Sales app:
- Create a new SO and select C1 as customer;
- Delivery Address retrieves "C1, D2" as it is the preferred address.
## Cause
Each time an invoice is validated, the corresponding address gets a higher score.
This score is then used in the SQL ordering of customers/suppliers:
https://github.com/odoo/odoo/blob/b523f5c6d8e235a6cedb029f701a0ebd89a5f74a/addons/account/models/partner.py#L347-L354
## Fix
Apply context search mode if first call. This mimics the base behavior: https://github.com/odoo/odoo/blob/b57bb1decd46dcbb1fe602bb72b6f8e5382e9b28/odoo/addons/base/views/res_partner_views.xml#L534
opw-4916381
Forward-Port-Of: odoo/odoo#225189Event email templates now use embedded images instead of web font icons for location markers. This ensures recipients see the correct visual elements in their email clients and avoids confusing duplicate or empty icons when editing event emails.
Original PR description
Font awesome classes must no be inserted into email as external servers do not use them so icons are not displayed and also because some issues occur with the email editor. This commit replaces i tags with font awesome classes in mail by images. Task-5082165
Website sitemaps no longer list the same page more than once when website controllers are customized. This keeps search engine indexing cleaner without changing which pages are included.
Original PR description
When extending controllers (e.g. `WebsiteSale.shop`), sitemap entries were duplicated because deduplication relied on the endpoint function object. Overridden methods result in different function objects but identical sitemap URLs, leading to duplicates. This commit fixes the issue by deduplicating on the generated sitemap location (`loc['loc']`) instead of the function object, ensuring unique URLs in the sitemap even when controllers are extended. Fixes #224193 Forward-Port-Of: odoo/odoo#224406
Fixed how Uruguayan electronic invoices read document numbers that begin with multiple letters. This helps ensure affected credit and debit notes are generated and validated with the correct numbering format.
Original PR description
If UY EDI document has latam document number with more than one letter at the beggining, it is needed to take in consideration all the letters and not only the first one. Task Latam side: 1352 Task Adhoc side: 53173
The journal report test was updated so it no longer depends on a payment reference staying empty in every localization setup. This prevents build failures when Czech accounting localization is installed, improving release stability without changing user-facing functionality.
Original PR description
test_document_data_basic was failing in builds with l10n_cz installed because - we set move_sales_2.payment_reference = '' in setUpClass and without l10n_cz it stays empty - but with l10n_cz installed it gets recomputed because of precompute=True on taxable_supply_date (which a stored computed field that triggers an extra write on account.move when the company is in CZ, and that write causes the compute graph to run again, and _compute_payment_reference fills the value back in) this commit solves this issue by not making assumptions about the payment_reference value and would use it as is in the generated data validation build_error-231479
Planning calendar exports now use the correct timezone when a shift has no assigned employee. This prevents exported shift times from being shifted incorrectly, improving calendar reliability for users working with unassigned planning slots.
Original PR description
The test `test_planning_ics_file_without_assigned_employee` failed when running without demo data because the slot timezone was `Europe/Brussels` while the employee timezone was `UTC`.
The previous code in the method `ics_datetime()` converted to the slot timezone and then relabeled it as the employee timezone with `.replace(tzinfo=...)`, which shifted the actual instant.
This change ensures that ICS datetimes are always converted using astimezone to a single target tz:
- employee tz if the slot is assigned,
- otherwise the current user tz or `UTC` as fallback.
The test was also updated to assert the correct fallback `UTC` values:
`DTSTART:20230602T080000Z`
`DTEND:20230602T170000Z`
[runbot-231213](https://runbot.odoo.com/odoo/error/231213)This fix prevents a closed connection from being misread as a different internal error during test and core connection handling. It helps keep error reporting accurate, making issues easier to diagnose and reducing misleading failures.
Original PR description
Followup to 16.0-closed-in-stop-xmo: the condition in `stop` is a `hasattr`, so we need to delete `self.ws` not set it to `None`. Setting it to `None` means the condition passes then blows up as soon as we try to use it, which means we "just" converted all the old `WebSocketConnectionClosedException` to an `AttributeError`. https://runbot.odoo.com/odoo/error/231446 Forward-Port-Of: odoo/odoo#226267
The spreadsheet interface now consistently uses the light theme because dark theme is not supported there. This prevents mixed light and dark styling, giving users a clearer and more consistent experience.
Original PR description
Spreadsheet doesn't support dark theme. This fixes some style where dark and light themes are mixed. Task: 5082593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The automation rule trigger dropdown now uses the correct background color when dark mode is enabled. This keeps the interface visually consistent and easier to read for users working in dark mode.
Original PR description
Steps: - Install `base_automation` - Enable dark mode - Open Automation rules - Create a new rule - open trigger dropdown - the dropdown background is still in light mode This commit apply $dropdown-bg on `o_field_base_automation_trigger_selection` opw-5064357 Forward-Port-Of: odoo/odoo#226116
The journal report test was updated so it no longer depends on a payment reference staying blank in all local accounting setups. This prevents false build failures when Czech localization is installed, improving release reliability without changing customer-facing behavior.
Original PR description
test_document_data_basic was failing in builds with l10n_cz installed because - we set move_sales_2.payment_reference = '' in setUpClass and without l10n_cz it stays empty - but with l10n_cz installed it gets recomputed because of precompute=True on taxable_supply_date (which a stored computed field that triggers an extra write on account.move when the company is in CZ, and that write causes the compute graph to run again, and _compute_payment_reference fills the value back in) this commit solves this issue by not making assumptions about the payment_reference value and would use it as is in the generated data validation build_error-231479
The attendance Gantt popup now lets users enter a checkout time for an open attendance directly in the popup. This removes a frustrating blocker for correcting attendance records without leaving the Gantt view.
Original PR description
The Gantt popup form explicitly set `check_out` invisible when it was empty, which prevented users from manually entering a checkout for an open attendance. This commit removes the overriding xpath so that the form simply inherits the standard `hr_attendance_view_form` behavior, where the `check_out` field is always visible and editable. Users can now set a manual checkout directly from the Gantt modal. task-5026978
Stripe card payment fields now use the language selected on the website instead of defaulting to the shopper's browser language. This makes checkout more consistent for multilingual websites and reduces confusion during payment.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Enable Stripe; 2. enable a second language on the website; 3. use second language on website; 3. go to checkout; 4. open card payment method. Issue ----- The card field values are displayed using the current browser's locale instead of the website's language. Cause ----- The `locale` parameter isn't included when connecting to the Stripe API. Solution -------- Include the lang from the `html` element via `_prepareStripeOptions`. If not present, let it fall back on the browser's locale. opw-5024805 Forward-Port-Of: odoo/odoo#226045
Fixed an issue where users with Shop Floor set as their default start page could see an error after logging in. The app now handles reloads more safely, so manufacturing users can access the Shop Floor without interruption.
Original PR description
**PROBLEM** In debug mode, we can change the default home action of a user (the action he sees when logging in). When the action `action_mrp_display` is set as the home action, there is a traceback…
**PROBLEM** In debug mode, we can change the default home action of a user (the action he sees when logging in). When the action `action_mrp_display` is set as the home action, there is a traceback after logging in. **STEP TO REPRODUCE** 1. Go in debug mode 2. Change the home action of a user to the 'Shop Floor' action (in the user form, in the preference tab). 3. log out, and log in with this user. 4. a js traceback should appear. **CAUSE** In mrp_workcenter_dialog.js, the Shop Floor action uses the `menu` service to get the name of the current app. `setCurrentMenu()` which set the current app in the `menu` service is not called before the `appName` getter is called. https://github.com/odoo/odoo/blob/5c1234085b1c1e227846b24bde55a0392779069b/addons/web/static/src/webclient/menus/menu_service.js#L29-L36 This lead to a traceback because this.menu.getCurrentApp() is `undefined`. **FIX** Workaround if the current app is undefined. We already check what is returned by `getCurrentApp()` where it is used. opw-4926317
3 changes
Resolved issues and error corrections
This update adds the missing SZJ product code required by Hungary's official NAV electronic invoicing specification. It helps ensure Hungarian invoice data can be classified correctly and stay aligned with regulatory documentation.
Original PR description
Description of the issue/feature this PR addresses: In the official NAV XML 3.0 documentation (available at: https://onlineszamla.nav.gov.hu/dokumentaciok page 123), according to the list of possible product codes, there is an 'SZJ' code that is missing. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
DIN5008 invoice reports no longer show the customer phone number in the address block, and customer VAT details are moved out of that address section. This keeps the report layout cleaner and better aligned with the intended DIN5008 presentation.
Original PR description
This commit removes the phone number from the DIN5008 report layout. The customer's VAT is also no longer displayed in the customer's address section. The VAT is moved to another section. Description of the issue/feature this PR addresses: Current behavior before PR: The customer's phone number and VAT are displayed in the customer's address in the DIN5008 report layout. Desired behavior after PR is merged: The customer's phone number is no longer displayed and VAT moved to another section in the DIN5008 report layout. opw-5049074 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The product margin calculation now uses net invoice amounts when calculating average sales prices. This prevents tax-included and tax-excluded invoice lines from being mixed together, giving businesses more reliable margin reporting.
Original PR description
The price_unit of a account.move.line can be with or without tax. The sale_avg_price should be either incl. or excl. tax. To ensure the avg price is always excl. tax the price_subtotal can be used. Forward-Port-Of: odoo/odoo#199209