Thursday, July 9, 2026
16 changes · 19.0
Resolved issues and error corrections
This fixes an issue in the website editor where opening the Documents tab after selecting an icon could cause an error. Users can now switch media options more reliably without interrupting their editing workflow.
Original PR description
### Steps to reproduce: - Open the website editor and insert a snippet. - Inside the snippet, add an image and a document via /media. - Select the image, click Replace, pick an icon. - Click the icon, then click Replace from the sidebar. - In the dialog, click the Documents tab. - Traceback occurs. ### Root cause: - Both icon and document box elements are `<span>` tags. `DocumentSelector` inherits `selectInitialMedia()` from `FileSelector` which only checks the tag name, so it incorrectly returns true for icons. This causes `fetchAttachments` to call `querySelector(a)` on the icon span, which returns null and crashes. ### Solution: - Override `selectInitialMedia()` in `DocumentSelector` to also check for the `o_file_box` class. Add optional chaining on `querySelector(a)` as a safety net. task-6310147 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270548
The website editor now accepts video option values in both expected formats, preventing errors when boolean values are used. This makes video configuration more reliable for users working with the HTML editor, especially in debug mode.
Original PR description
Since https://github.com/odoo/odoo/commit/3e1456e97b1e525bd56185b8ef9547367234e6b1, the videoOption props can be a string or boolean. In debug mode, this causes a stacktrace when the option value is boolean. Fix: Allow both strings and boolean types for the value prop. Task-6139928
This fixes an incorrect warning shown while editing a partner view, where the system suggested a missing field even though the view behaved correctly. The change keeps the field hidden as intended and reduces confusion for users or administrators editing the view.
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#274719 Forward-Port-Of: odoo/odoo#273041
Event managers can now drag and drop questions in the Event Questions page to set their order. This makes it easier to manage event templates, and the chosen order stays consistent wherever those questions are shown.
Original PR description
Previously, questions in the event template could not be reordered via drag-and-drop on the Questions page. Instead of adding the handle to the inline list embedded in the event.type form view, we add it to the dedicated event.question list view (event_question_view_list). This will allow the users to reorder from the event questions and the sequence will be synced everywhere those questions appear. Steps to reproduce: 1.Go to event, configurations, and event questions. 2.We can't drag and drop questions opw-6260478 Forward-Port-Of: odoo/odoo#270576
The bubble report layout now keeps the company address area to the same relative width as other layouts. This prevents logos or other customized company details from appearing oversized, making printed reports look more consistent and professional.
Original PR description
In the bubble layout, the `name="company_address"` div was inside an unconstrained `<td>`, causing percentage-based widths set in `company_details` (e.g. `width: 25%` on a image) to resolve against…
In the bubble layout, the `name="company_address"` div was inside an unconstrained `<td>`, causing percentage-based widths set in `company_details` (e.g. `width: 25%` on a image) to resolve against the full table cell width, resulting in oversized content compared to other layouts. **Without fix:** <img width="1127" height="411" alt="withoutfix" src="https://github.com/user-attachments/assets/244c3407-1dbb-4b83-95d9-ebaba2b2b13c" /> For e.g, The folder layout wraps the same block in a `w-50` div, so percentage widths resolve against ~half the page width. <img width="1111" height="410" alt="folderexp" src="https://github.com/user-attachments/assets/ee72712a-94da-483c-9a8e-cb3a850dac8e" /> Added `w-50 ms-auto` to the `name="company_address"` div in the bubble layout to align its sizing context with the other layouts, ensuring consistent rendering of user-defined styles in `company_details` across both layouts. **With fix:** <img width="1119" height="413" alt="wfix" src="https://github.com/user-attachments/assets/6b1caf24-3a8e-450f-865e-cce2b9788fe9" /> Commit which made the bubble layout in table: https://github.com/odoo/odoo/commit/8eb61a245cd3b650e309fdb55d24654c34d785cd opw-6287230 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#270725
This update makes Odoo's older-Python compatibility behavior match newer Python versions when marking code as deprecated. It helps developers catch incorrect usage earlier and keeps platform behavior consistent across supported environments.
Original PR description
The native `warnings.deprecated` decorator strictly requires a string literal as its first positional argument and cannot be applied as a bare decorator. This commit enforces the same type verification in the fallback implementation for Python < 3.13. Follow-up of odoo/odoo@42fcc766af0584ef720a1cee5beb7878cdd1a572 runbot-941402
This fix prevents an error that could occur when users press the Tab key while focused inside a link preview in the HTML editor. It makes editing content with links smoother and avoids an unexpected interruption during keyboard navigation.
Original PR description
Since [1] elements within the link preview can be focused. However, when pressing tab an error is raised. This commit prevents this error from happening. [1]: https://github.com/odoo/odoo/commit/34db19f4a2b42d7e41205d7d793f5b3f408c19af task-6366337 Forward-Port-Of: odoo/odoo#274682
This fixes an issue where custom website fonts with spaces in their file names could fail to load because the generated style information was invalid. It also preserves the correct font weight, helping uploaded fonts display as intended on websites.
Original PR description
When uploading a font file "FontName 123 Light.otf" the baseFontName needs to be quoted in the font-face CSS to be valid. Single font files parsing for the shortestNamedFont now also correctly keeps…
When uploading a font file "FontName 123 Light.otf" the baseFontName needs to be quoted in the font-face CSS to be valid.
Single font files parsing for the shortestNamedFont now also correctly keeps the weight for the targetFonts.
Description of the issue/feature this PR addresses:
Uploaded fonts with spaces in the name are not working.
Current behavior before PR:
When uploading a font with a space in the filename like "FontName 123 Light.otf" the css declaration in the attachement is wrong and not working:
```css
@font-face {
font-family: FontName 123 Light;
font-style: normal;
font-weight: 400;
src: url("/web/content/1057/FontName 123 Light.otf");
}@font-face {
font-family: FontName 123 Light;
font-style: normal;
font-weight: 400;
src: url("/web/content/1057/FontName 123 Light.otf");
}
```
Desired behavior after PR is merged:
The font name is now correctly quoted and the font attributes are no longer overwritten for the shortestNameFont:
```css
@font-face {
font-family: "FontName 123 Light";
font-style: normal;
font-weight: 400;
src: url("/web/content/1057/FontName 123 Light.otf");
}@font-face {
font-family: "FontName 123 Light";
font-style: normal;
font-weight: 300;
src: url("/web/content/1057/FontName 123 Light.otf");
}
```
Info @wt-io-it
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#268842The module card menu no longer shows an upgrade option for imported and industry modules where it did not perform any useful action. This reduces confusion for users, while existing upgrade flows for industry modules remain available elsewhere.
Original PR description
This commit removes the 'upgrade' button found in the t menu of a module in kanban view, for imported and industry modules. This action does nothing on those modules, and the upgrade of industry modules can be done with the 'Upgrading' button on the footer so there is no need to replace this. Task-6255091
This fixes an unstable automated test for the Mail video call experience by waiting until a meeting is fully active before switching channels. It helps keep quality checks reliable and reduces false failures during development, without changing user-facing behavior.
Original PR description
The test starts a meeting, then switches to another channel to join its call, expecting the camera button to read "Turn camera on". Starting a meeting runs startMeeting(), which fires…
The test starts a meeting, then switches to another channel to join its call, expecting the camera button to read "Turn camera on". Starting a meeting runs startMeeting(), which fires enterFullscreen() as a fire-and-forget tail once the meeting call is joined. The test only waited for the meeting's "Stop camera" button (set mid-join, before that tail) before navigating, so enterFullscreen could still be pending during the channel switch. When it ran late it pointed the fullscreen channel at the newly joined channel and turned isFullscreen on. That channel's in-call view is gated on showCallView (!isFullscreen), so it was torn down and the "Turn camera on" button never rendered within the 3s timeout. Wait for the meeting view to be fully active (fullscreen) before navigating away, so the whole startMeeting chain (enterFullscreen included) has settled first. This backports to 19.0 the same fix already applied to saas-19.1 in commit 5abc187fc40c (odoo/odoo#273650) and forward-ported to saas-19.2; it was never backported to 19.0, where the test and the enterFullscreen tail already exist. Earlier versions are unaffected: they have neither this test nor the enterFullscreen tail in startMeeting. https://runbot.odoo.com/odoo/error/941484
Hindi number formatting now uses the Indian digit grouping style, such as 10,00,000 instead of 1,000,000. This makes large numbers easier and more familiar to read for Hindi-language users in Odoo.
Original PR description
Currently the number grouping for Hindi is incorrectly set. 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#274721 Forward-Port-Of: odoo/odoo#274443
Creating a company with an EU VAT number now triggers only one VAT verification instead of two. This reduces unnecessary external service calls, improving performance and lowering the risk of hitting service limits.
Original PR description
When we create a company with a EU VAT, we used to do 2 IAP call to verify the VAT number. One was on the create() and the other one on the write(). For performance reason and because the vies check service may limit ip address, the verification was already disable when importing files (in both create and write). This commit remove the compute on the create one (and keep the one on write), so that it only do 1 IAP call to verify the VAT. Task-6139346 Forward-Port-Of: odoo/odoo#274644
The Discuss GIF picker now shows the Klipy branding required by the GIF provider, including a Klipy search prompt and a powered-by link. This keeps the feature compliant with Klipy’s usage rules while preserving GIF search functionality for users.
Original PR description
## Summary - Adds KLIPY-required branding to the Discuss GIF picker per [Klipy attribution guidelines](https://docs.klipy.com/attribution): - **Search KLIPY** placeholder in the search bar - **Powered by KLIPY** footer linking to https://klipy.com (shown when the GIF picker feature is enabled) - Follow-up to the Tenor → Klipy API migration (`c29d45e3`). - Adds corporate CLA signature for Royal Import & Export Ltd (`doc/cla/corporate/royalimport.md`). ## Test plan - [ ] Install/upgrade `mail`, hard-refresh backend assets - [ ] Configure a Klipy GIF API key under Settings → General Settings → Discuss - [ ] Open Discuss, open GIF picker — verify **Search KLIPY** placeholder and **Powered by KLIPY** footer - [ ] Run `addons/mail/static/tests/gif_picker/gif_picker.test.js` (includes new attribution test)
This update fixes an issue in the sales accounting area to improve reliability when working with sales order lines. The limited pull request details do not describe the exact user scenario, but the change is intended to prevent incorrect behavior reported through a support case.
Original PR description
Long description Steps to reproduce: ------------------- * * > Observation: Why the fix: ------------ opw-6290222
Users no longer need to be linked to their own employee record to create an expense from a document. They must still have permission to create expenses for another employee, so normal access controls remain 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#123523 Forward-Port-Of: odoo/enterprise#118955
Audit checks that are successfully reviewed now refresh the number of invalid records shown in the report. This prevents users from seeing outdated anomaly counts after a check has been corrected, improving confidence in audit reporting.
Original PR description
Problem: Sometimes after an audit check passes (gets reviewed successfully), the count of invalid records in the audit report is not updated. Steps to reproduce: 1. Add a check for an audit cycle 2. Make sure the check's domain is satisified by at least one record 3. Check the audit report and see the check you added 4. The check status should show an anomaly and the count of invalid records will be greater than 0 5. Now, edit the check so that the domain is not satisfied by any record 6. Check the audit report again and see the check you edited 7. The check status should show "Reviewed" but the count of invalid records will still be greater than 0, which is not correct Cause: When updating the status of an audit check, the count of invalid records is not updated, only the status gets updated. opw-6264177