Wednesday, July 16, 2025
19 changes · saas-18.3
Enhancements to existing features
This update makes the Point of Sale weighing dialog easier to customize by separating the dialog call into its own function. It is a small internal improvement that helps partners or enterprise features adapt the weighing flow without changing core behavior for users.
Original PR description
Enterprise PR: https://github.com/odoo/enterprise/pull/89280 This commit makes a small change to move the code that calls the weighing dialog into its own function. This is so it can more easily be overridden. task-4910716 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#218603 Forward-Port-Of: odoo/odoo#217135
This update strengthens the internal testing setup for Point of Sale, making it easier to test store behavior, services, and individual interface components with realistic sample data. It helps developers catch issues earlier and supports future PoS extensions, while also adding a missing asset for the HTML editor module.
Original PR description
Improved test hoots in PoS to test model and service functions. It is now possible to access the `pos_store` via `getService(“pos”)`. This will automatically load mocked data and information on the various models. Components can also be mounted independently of the rest of the application, so that their functions can be tested. For the moment, only `point_of_sale` models are loaded, but the implementation is designed to be patched from other PoS modules. --- A missing asset has been added to the html_editor module.
Resetting an IoT box image development branch now also applies any newly required system and Python packages. This helps keep development and testing environments aligned after switching branches, reducing setup issues.
Original PR description
When resetting on another branch with aliases `odoo_dev` and `odoo_origin`, we now also install new packages from `requirements.txt` and `packages.txt`. Forward-Port-Of: odoo/odoo#219050
This update improves the internal testing setup for Point of Sale appointment features, making it easier to verify related services, models, and components independently. It helps future changes be tested more reliably, reducing the risk of regressions for PoS-related functionality.
Original PR description
Improved test hoots in PoS to test model and service functions. It is now possible to access the `pos_store` via `getService(“pos”)`. This will automatically load mocked data and information on the various models. Components can also be mounted independently of the rest of the application, so that their functions can be tested. For the moment, only `point_of_sale` models are loaded, but the implementation is designed to be patched from other PoS modules.
Resolved issues and error corrections
The live chat reporting tour test has been corrected so it works reliably in this Odoo version. This helps prevent false failures in automated checks and keeps live chat reporting quality assurance stable.
Original PR description
This commit fixes the `im_livechat_report_pivot_redirect_tour` that fails in 18.3. In later version, the pivot is directly accessed with the tour URL. In this version, the pivot is accessed from the command palette. Command palette steps makes the tour more complex than it should, remove them. The opportunity is taken to clean the test as well: - Do not hardcode live chat channel id in the test setup. - Better selectors to see what line we are clicking on at a glance (selector now includes record name). fixes runbot-229637 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
Users without Point of Sale administrator rights now see a clear Access Denied message when trying to load POS sample data, instead of encountering a technical error. This prevents confusion during POS setup and makes permission issues easier to understand and resolve.
Original PR description
Currently, an error is encountered when trying to load sample data in POS session if the **Administrator** is assigned the **User role** for the Point of Sale app. **Steps to reproduce:** - Install…
Currently, an error is encountered when trying to load sample data in POS session if the **Administrator** is assigned the **User role** for the Point of Sale app.
**Steps to reproduce:**
- Install the `point_of_sale` module (without demo data).
- Create a new POS session (from list view).
- Change the POS rights of the **Administrator** user from _Administrator_ to _User_.
- Open the pos sessions and on the product screen, click **Load Sample**.
**Error:**
```
while parsing /home/odoo/src/odoo/saas-18.3/addons/point_of_sale/data/scenarios/furniture_category_data.xml:5, somewhere inside
<record id="pos_category_miscellaneous" model="pos.category">
<field name="name">Misc</field>
<field name="image_128" type="base64" file="point_of_sale/static/img/misc_category.png"/>
<field name="sequence">1</field>
</record>
```
This commit will prevent the error by displaying an **Access Denied** pop-up for users without admin rights, when attempting to load the POS sample data.
Sentry - 6672207110
Forward-Port-Of: odoo/odoo#213813Refunds created in Point of Sale now display the expected “REFUND” label in the backend order list. This makes refunded transactions easier for staff to identify and reduces confusion during order review and reconciliation.
Original PR description
Currently, when refunding an order the name of the order does not show "REFUND". Steps to reproduce: ------------------- * Open pos session * Make an order * Refund the order * Go to the backend and see all orders > The refund orders does not show the "REFUND" label Why the fix: ------------ In previous version, when in `sync_from_ui` the state of the order in vals was 'draft'. In this version the state in vals is `paid`. This difference leads to the name being computed in `_complete_values_from_session`. This means that `_compute_order_name` is called before the order is fully created and thus `refunded_order_id` is not yet set and we're always using the next sequence to compute the order name. Now, when we already know the order is a refund we will not compute the name in `complete_values_from_session`. The name will get computed in `write`, which is called by `action_pos_order_paid`, as in previous version. opw-4521070 Forward-Port-Of: odoo/odoo#214542
Unhandled bus errors and failed promises are now captured in the bus logs. This makes it easier for support and developers to diagnose real-time communication issues, even when worker tools are hard to access or pages are reloaded.
Original PR description
Bus behaviors are not easy to troubleshoot: - Worker devtools not easily available. - Errors are kept in the worker, never logged nor raised client side. - Worker communicates with many tabs. To ease troubleshooting the bus, logs were introduced. It's much better because they can be downloaded from any tab, survive reloads... However, unhandled errors/promises are not logged which is cumbersome. This commit adds unhandled errors/promises to the bus logging. 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
Live chat chatbot steps now remove old answer options when a question step is changed to another type. This prevents outdated answers from staying attached to steps where they no longer apply, reducing confusion for teams managing chatbot flows.
Original PR description
**Current behavior before PR**: When the step type was changed from "question selection" to another type and the step was saved, answers were not cleared. **Desired behavior after PR is merged**: Now, when the step type is changed from "question selection" to any other type and the step is saved, the answers are cleared. **task**-[4510555](https://odoo.com/odoo/all-tasks/4510555) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219058 Forward-Port-Of: odoo/odoo#195698
SVG illustrations with updated file type information are now recognized correctly in the HTML editor. This prevents them from being treated like regular uploaded images, so users can still access dynamic color options when selecting illustrations.
Original PR description
When illustrations mimetypes changed from simple `image/svg+xml` to `image/svg+xml; charset=utf-8`, `html_editor` was not used for website pages yet - and it therefore missed the fix in [1]. Because of this, when an illustration is selected, it is detected as an uploaded image, and the dynamic colors are not available. This commit adapts the mimetype detection. [1]: https://github.com/odoo/odoo/commit/af11070a6d4eeb69ee49c28435341a220eb64203 Forward-Port-Of: odoo/odoo#218980
This change adjusts how translatable messages are written so they remain compatible with the translation tools used on Ubuntu Jammy. It prevents build errors during translation extraction, helping keep releases and automated checks running smoothly without changing business features.
Original PR description
On Jammy, babel does *not* cope well with f-strings as values inside `_()` calls: it uses `eval` to try and figure them out, which attempts to execute the f-string, which fails because the evaluation context is empty. This is likely fixed from Babel 2.11 onwards (python-babel/babel#915) but Jammy uses babel 2.8[^1]. https://runbot.odoo.com/odoo/runbot.build.error/97849 [^1]: This doesn't seem to trigger on Noble even though it uses 2.10, but locally it does trigger on 2.10.3 (installed via pip), so ubuntu might have backported the fix or something. Forward-Port-Of: odoo/odoo#218887 Forward-Port-Of: odoo/odoo#218803
Repair order labels now display correctly when multiple records are combined. This avoids confusing or untranslated labels for users working with aggregated repair-related records.
Original PR description
The `_()` function doesn't work in listcomp as it can't find the env to get the active lang. Forward-Port-Of: odoo/odoo#218919
Users can now filter email templates by category without hitting an access error. This keeps common email workflows, such as choosing templates when sending sale or purchase documents, working reliably for regular users.
Original PR description
Since commit 42be7cebc84ac4af36104b6d2eba9d3e5d115005, filtering mail templates on their category triggers a search on `ir.model.data` to avoid a memory error on a database having a lot of mail…
Since commit 42be7cebc84ac4af36104b6d2eba9d3e5d115005, filtering mail templates on their category triggers a search on `ir.model.data` to avoid a memory error on a database having a lot of mail templates. However, regular users don't have a read access to this model, so when a user tries to filter on the template category, they get an `AccessError`. With this commit, we add a `sudo()` on the search on `ir.model.data`, so that this error doesn't occur any more. To reproduce the issue on a runbot, follow these steps: - connect as *demo* on a 18.0 database - open a *Sale Order* or a *Purchase Order*, and click on *Send by email* - in the modal dialog, click on the vertical three dots to select a template - if *Search More...* is not available, save the template several times with different new names until *Search More...* appears on the list - click on *Search More...* - in the *Search...* field, click on one of the *Base Templates* or *Custom Templates* filters - boom! `Access Error, You are not allowed to access 'Model Data' (ir.model.data) records.` Forward-Port-Of: odoo/odoo#219034
The self-ordering cart page now correctly displays the custom background image configured for the experience. This keeps the checkout flow visually consistent with the business's branding and fixes a small display issue for customers.
Original PR description
Before this commit, the custom background image was not displayed on the cart page because an outdated method was used. This commit resolves the issue by applying the correct method. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Editing an existing website link that uses a relative address now preserves that relative address instead of converting it into a full website URL. This prevents unintended link changes when users open the link editor and apply without modifying the destination.
Original PR description
This PR is Backport of https://github.com/odoo/odoo/pull/216832 > [BSO] Drop block with button link > edit link: it shows the full URL (including protocol etc) for local URLs Steps to reproduce: - Open website builder - Click on a link with a relative URL (there is /contactus in footer) - Bug: the url shown is an absolute url (https://.../contactus) - Click "Edit Link" (one of the icons) - Click "Apply" - Bug: the url in the dom has changed (it saved the absolute url) The link popover used HTMLAnchorElement.href to get the url. This getter returns an absolute url even if the href attribute is a relative url. task-4367641 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Recruitment stage email templates can no longer be quick-created in a way that skips required setup. This prevents errors when users move an applicant into a stage linked to an incomplete template, keeping the application workflow reliable.
Original PR description
An error occurs when a user quickly creates a template for a stage, bypassing the validation of the `Applies to` field. As a result, an error is triggered when the user selects a stage that uses that template. **Steps to reproduce:** * Install `hr_recruitment` * hr_recruitment>Configuration>Stages>stage named `New`>Quick Create a mail template with random name and save. * Applications>All Applications>New application>Set stage to `New` `KeyError:False` **Solution:** * Disable quick create as to prevent creating mail templates with empty model ids. **Sentry-6675399135** --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#214195
The quality control worksheet test setup now assigns an email address to the administrator account. This prevents a sender email configuration error during automated tour testing, helping keep release validation stable.
Original PR description
Set the admin user's email explicitly to prevent "Please configure the sender's email address" error when running the tour with login='admin'. build_error-226779 Forward-Port-Of: odoo/enterprise#88283
Renaming an employee now succeeds even when the user does not have permission to rename the related document folder. This prevents administrative updates from being blocked by document access rights.
Original PR description
When an employee is renamed, it tries to rename the folder but if you don't have the rights on the folder, it raises an error and prevent you from renaming.
This fix prevents an error when users open the depreciation schedule for draft assets whose calculation board has not been generated yet. The system now uses the available draft entry date when no existing asset date is present, allowing the schedule to open normally.
Original PR description
Issue: https://github.com/odoo/odoo/issues/219112 Steps to reproduce:- - Minimum 1 asset in draft - Computation board not computed yet - Opening the depreciation schedule with draft entries. Cause:- - When asset is in draft and computation board is not computed yet no Journal Entries are created for that asset. - `asset_date` is minimum value among dates of related moves. - In this case there are no moves yet so `asset_date` is 'NoneType' - `asset_date = min([asset_date, move_vals['date']])` - In above line when we try to compare 'datetime.date' and 'NoneType' it gives rpc error. Fix: `min([asset_date, move_vals['date']]) if asset_date else move_vals['date']` Followup on commit: https://github.com/odoo/enterprise/commit/eb57a9bc4066ece08059384742d70705a646bbdc Forward-Port-Of: odoo/enterprise#90308