Wednesday, July 8, 2026
17 changes · saas-18.3
Enhancements to existing features
The Azerbaijani Manat (AZN) currency symbol has been updated to its official Unicode sign, ₼. This keeps currency displays accurate and consistent for users working with Azerbaijani accounts or pricing.
Original PR description
This commit updates the base currency symbol for the Azerbaijani Manat (AZN) to its official Unicode character '₼'. Related Upgrade PR: https://github.com/odoo/upgrade/pull/10107 Backport of: https://github.com/odoo/odoo/pull/262471 task-6112867 Forward-Port-Of: odoo/odoo#274368
Resolved issues and error corrections
This fix preserves the existing behavior of file-related navigation in Knowledge when users run newer Chrome versions. It prevents a browser change from unintentionally affecting how the Knowledge app handles scrolling actions.
Original PR description
Since Chrome 150, scrolling methods like `scrollIntoView()` return a Promise instead of `undefined`. This commit adds block braces to ensure the action returns `undefined` and keeps the same behavior as before. Reference: - https://chromestatus.com/feature/5082138340491264 - https://chromium.googlesource.com/chromium/src/+/50f3e3d0a9bc02aad8b8161dbdd59046991dd2c7 runbot-941309 Forward-Port-Of: odoo/enterprise#123231 Forward-Port-Of: odoo/enterprise#123031
Canceled appointment bookings no longer prevent businesses from lowering a resource's capacity. This avoids an error when updating resources after a booking has been canceled, keeping appointment management smoother and more accurate.
Original PR description
Steps to reproduce: 1. Install `appointment` 2. Create an appointment type using resources 3. Create a resource with capacity `4` 4. Book an appointment on that resource with reserved capacity `4` 5.…
Steps to reproduce: 1. Install `appointment` 2. Create an appointment type using resources 3. Create a resource with capacity `4` 4. Book an appointment on that resource with reserved capacity `4` 5. Try to reduce the resource capacity 6. Cancel the appointment 7. Try again to reduce the resource capacity Current behavior: - Reducing the resource capacity raises: `The capacity used can not be lesser than the capacity reserved` Issue: - Canceled appointments still prevent lowering the resource capacity, even though the booking is no longer active. Cause: - Canceling an appointment only archives the related `calendar.event`, it does not remove the corresponding `appointment.booking.line`. That booking line keeps its previous `capacity_reserved` value, while `capacity_used` is a stored computed field depending on the resource capacity. When the resource capacity is reduced after cancellation, the archived booking line is recomputed with the new lower resource capacity and this violates the SQL constraint Solution: - For inactive booking lines: Set `capacity_used = capacity_reserved` opw-6036053 Forward-Port-Of: odoo/enterprise#112485
This update prevents delivery tracking from failing when EasyPost returns an empty tracker value. Users can continue working without seeing an error while the system falls back safely when tracking link data is unavailable.
Original PR description
The PR https://github.com/odoo/enterprise/pull/111833 handled the specific case when the tracker data is missing from the EasyPost response, however in certain cases `tracker` key exists, but it has a `None` value, which leads to a traceback when trying to access the stock move:
```
File "/home/odoo/src/enterprise/18.0/delivery_easypost/models/easypost_request.py", line 392, in get_tracking_link
public_url = shipment.get('tracker', {}).get('public_url')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'get'
```
This commit provides a fallback to avoid getting the error from the side of the user.
opw-6270242
Forward-Port-Of: odoo/enterprise#119400Users can now create an expense from a document even if their account is not linked to an employee. They still need permission to create expenses for another employee, so the change removes an unnecessary blocker while keeping access controls in place.
Original PR description
Removes the constraint saying a user has to be linked to an employee to create an expense from a document. In this case, the user still needs the rights to create an expense for another employee. task-6237021 Forward-Port-Of: odoo/enterprise#118955
This fixes an issue in the Documents app where the selection bar could remain visible but stop working after moving between folders that contain the same file. Users can now continue selecting, clearing, or adding documents without switching views or clicking elsewhere to reset the page.
Original PR description
**Steps to reproduce:** - Install Documents app - Go to a folder and select a file - SelectionBox appears at the top - Click on another folder containing the same file (e.g. "All") - Box is still…
**Steps to reproduce:** - Install Documents app - Go to a folder and select a file - SelectionBox appears at the top - Click on another folder containing the same file (e.g. "All") - Box is still there, but interactions are broken (can't clear/add) - Going to another view type (kanban/list) or clicking elsewhere reset it **Issue:** `SelectionBox` doesn't update itself on folder changes, but `_reapplySelection` still tries to re-select the relevant records when switching folders (it was probably done to make it work when switching views, as it re-mount the component). **Fix:** Add current selected category to the `t-key` to trigger a re-rendering of the `SelectionBox` using a state with the current folder id. In 18.3 it was partially fixed in the same way by using the `targetRecords.length` in [1]. Feels like a hack (and we add a state just for this) but it ensures the component has the proper data for the current folder. We could also disable it on load for now, and we should make sure people don't accidentally use the state as the actual folder value... [1] https://github.com/odoo/enterprise/commit/8baaad621a1555680cd77ab514f626137b5b584d (Also a module update is needed to apply the fix due to the xml changes, so it might be better to apply it in master) opw-6348049
Opening the user or resource restriction fields on appointment slots no longer causes an error. The broken filter was removed because it did not limit choices and only prevented users from editing the form reliably.
Original PR description
Clicking the "Restrict to User" or "Restrict to Resources" field on a slot crashed with:
invalid input syntax for type integer: "appointment_type_id.staff_user_ids"
The field domain was a quoted string instead of a list, so it was passed through as a literal value. Remove the domain: it never filtered anything and only broke the form.
opw-6349497
Forward-Port-Of: odoo/enterprise#122651Grid view pop-up lists now display the user-friendly label for grouped selection fields instead of internal technical values. This makes drilled-down list titles clearer and easier for users to understand, especially for labels like "Non Billable".
Original PR description
When grouping a grid view by a selection field and clicking on the cell magnifier, the list title showed the technical name (e.g. non_billable) instead of the display name (e.g. "Non Billable"). This commit adds a condition specifically for selection fields, ensuring that their display names are used. task-5980035 Forward-Port-Of: odoo/enterprise#122303 Forward-Port-Of: odoo/enterprise#120894
Fixed the French Intrastat export warnings so their internal links open only the journal entries that actually have missing required information. This helps users correct export issues faster and avoids confusion from being sent to unrelated accounting entries.
Original PR description
Steps to reproduce: 1. Have a French company with intrastat report module installed 2. Create and validate a bill to another EU country, without filling out at least one of the required intrastat fields 3. Go to the intrastat report, and export it as XML DEBWEB2 4. In the export wizard, click on the internal links on the warning messages Issues: 1. In the Intrastat report in French localization, when there are missing values detected in the export, the Export Wizard shows internal links that lead to every journal entries - instead of showing only the relevant entries. The warning banner on the report uses the action action_invalid_code_moves which has a domain to limit what is shown on the view form. However in the method _fill_value_errors there was no domain. opw-6215339 Forward-Port-Of: odoo/enterprise#117997
The Print button on customer invoices is being changed back to the main action instead of a secondary one. This makes the invoice screen clearer and helps users quickly find the expected printing option, except in cases where the document has already been sent.
Original PR description
In task-6269645, the print button on customer invoices was set to secondary instead of primary. This is a mistake and it's confusing, so it's being reverted in this commit because it only needs to be secondary if the move is sent. task-6357618 Forward-Port-Of: odoo/odoo#273953
This change updates a system setting so the EDI proxy client is neutralized to a demo state instead of a test state. It helps ensure the configuration matches the intended use for current users and avoids confusion in the setup.
Original PR description
The system parameter is already brought to demo in account_peppol module. But the current users are not for pdp. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#272462
This update restricts the 'Read More/Less' feature (collapsible blockquotes) to only email messages within the Odoo system. Previously, this feature was applied to all message types, leading to cluttered views. This change improves the clarity and organization of email communications for users.
Original PR description
Purpose of this commit:
Restrict the collapsible blockquote feature ('Read More/Less') to mail-type messages only. Previously, it was being applied to all message bodies with blockquotes.
task- 4592901This update fixes an issue where the HTML editor was incorrectly triggering font size checks on selected list items, even when other formatting changes were applied. The fix now ensures that font size checks are limited to list items using font size formatters, improving the editor's performance and reliability. This ensures consistent formatting behavior.
Original PR description
#### Description of the issue this PR addresses: - Fully selected list items could go through font size checks even when applying unrelated formatters. #### Desired behavior after PR is merged: - Restrict list item font size checks to font size formatters only. task-6329161 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update addresses a bug that caused access errors when deleting fields in website forms. The fix ensures the system searches for field usage in a broader, unrestricted context (using 'sudo') to prevent these errors, improving the stability of field deletion operations.
Original PR description
# How to reproduce - Install the Website module - Install another module that has atleast one model with one html field, sanitize=Flase or sanitize_form=False and groups - Remove the field's group…
# How to reproduce - Install the Website module - Install another module that has atleast one model with one html field, sanitize=Flase or sanitize_form=False and groups - Remove the field's group from the current user - Enable dev mode - Go to Settings > Technical > Database Structure > Models - Pick any model (e.g. sale.order.line) - Add a field to that model & Save - Delete the added field & Save > Note : Significantly harder to reproduce since : https://github.com/odoo/odoo/commit/9a336bbb94b0a4266d84f7554c024c3abd2d1e7c I am not sure a field as mentionned in the steps exists # The problem An access error is raised for the module wich access rights were removed, even if the module is not linked in any way with the picked model # Cause of the issue Deleting the field will endup calling the `unlink()` method of `BaseModel` on the `ir.model.fields` record. This function triggers all `@api.delete` methods defined on the model : https://github.com/odoo/odoo/blob/5538132d9d14c4cc5031fc50ac0388ad2ab0fc92/odoo/models.py#L4548-L4552 This will call the this method : https://github.com/odoo/odoo/blob/5538132d9d14c4cc5031fc50ac0388ad2ab0fc92/addons/website/models/website_form.py#L153-L154 That was introduced by : https://github.com/odoo/odoo/commit/c0a827519844ec43537e4487f6abe358bb82ba9a Which prevents a field from being deleted if it is actively used in any website form. But this method does a search on every model return by `_get_html_fields` which may contains models that are not accessible by the user, so we get an access error. # Proposed solution Since `_check_if_used_in_website_form` should perform the same independently from the user, we can do the search in sudo opw-6231951 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#272916 Forward-Port-Of: odoo/odoo#265781
This update fixes a formatting issue with numbers displayed in Portuguese (pt_PT) and Hindi (hi_IN). It ensures numbers are grouped correctly according to international standards – three digits for Western countries and two digits after the first three for India, improving readability and accuracy. This change ensures consistent and appropriate number formatting for our users in these regions.
Original PR description
Currently the number grouping for Portuguese and Hindi is missing. Number grouping is used to separate long numbers in logical groups to make then easier to read. In Western countries, the grouping is usually done in groups of three digits (e.g. `1,000,000` instead of `1000000`), while in India, the grouping is done in groups of two digits after the first three digits (e.g. `10,00,000` instead of `1000000`). Source: https://www.unicode.org/cldr/charts/48/by_type/numbers.number_formatting_patterns.html#24a93b3d14ba17b2 All languages will be revised in a follow-up `master` PR. [task-6320391](https://www.odoo.com/odoo/project.task/6320391) Forward-Port-Of: odoo/odoo#274535 Forward-Port-Of: odoo/odoo#274443
This update corrects a warning message appearing when editing a partner view in Odoo. The warning incorrectly indicated a missing 'true' field, but the field is intentionally hidden. This change ensures a cleaner user experience and removes unnecessary notifications.
Original PR description
There is a warning saying that there is no "true" field when editing the view. But in reality this is currently working as expected and the field is hidden. related to opw-5947987 Forward-Port-Of: odoo/odoo#273041
This update ensures that attachments added to email templates when scheduling messages correctly link to the scheduled message record. Previously, attachments weren't properly associated, causing access issues when viewing scheduled messages from different users. This fix resolves a potential data inconsistency.
Original PR description
**Problem:** When scheduling a message using an email template with custom attachments, those attachments will not have their `res_model` and `res_id` updated to relate to the scheduled message…
**Problem:** When scheduling a message using an email template with custom attachments, those attachments will not have their `res_model` and `res_id` updated to relate to the scheduled message record. This can lead to access errors. **Cause:** When composing a message using an email template with attachments, those attachments are created with their `res_model` and `res_id` values corresponding to the mail composer record. However, when scheduling a message, only attachments with no `res_id` value (or a value of 0) are updated to correspond to the scheduled message record. https://github.com/odoo/odoo/blob/77b180e8251fb8019e0034e1c2f485fd2c34ea4e/addons/mail/wizard/mail_compose_message.py#L1198-L1201 https://github.com/odoo/odoo/blob/30ca89b9e0d3c43d019167ec2de816c263f4bb92/addons/mail/models/mail_scheduled_message.py#L86 **Purpose:** Modify the `mail.scheduled.message` override of `create` to not require an attachment have no `res_id` value to be properly updated. **Steps to Reproduce in Runbot:** 1. Add an attachment to an email template. 2. Open a mail composer using that email template, then schedule the message for later. 3. Attempt to view the scheduled message with a different user. More specific example flow: 1. Add an attachment to the Sales: Send Quotation email template. 2. Create a Quotation and send it with the Send by Email button, selecting Send Later instead of Send. 3. Attempt to view the Quotation with a different user. opw-6293587 Forward-Port-Of: odoo/odoo#272261