Daily updates from Odoo
Wednesday, July 9, 2025
94 changes
58 changes
Resolved issues and error corrections
This fix prevents the website editor from treating automatic interface changes, such as opening dropdowns or side panels, as real page edits. It helps avoid unnecessary or confusing saved changes while users build website pages.
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
Changing a separator's width in the website editor now keeps its selected color and style. This prevents users from having to reapply formatting and makes page editing more predictable.
Original PR description
Steps to reproduce bug - Add text snippet - Add a separator - Click on the separator - Set color/style - Click on the width - Change the width either by inserting another number or with up/down arrows => the color and style get reverted After this commit the separator style does not get reverted
This fix makes the website editor wait until the page inside the preview is fully ready before loading editing tools. It prevents rare timing-related crashes that could affect fast automated tests or users opening the editor immediately.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change prevents checkout errors when an order contains more than one delivery line. Delivery amounts are now calculated using the standard delivery logic, making checkout more reliable for affected orders.
Original PR description
Before this commit an error can appear if there two delivery line. Use method in delivery module to compute delivery amont. This method can compute if there are two line with delivery https://github.com/odoo/odoo/blob/18.0/addons/delivery/models/sale_order.py#L27 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#217705 Forward-Port-Of: odoo/odoo#217624
Users can now see complete dashboard names in the spreadsheet dashboard search panel by hovering over truncated entries. This makes it easier to identify and select dashboards with long names without guessing.
Original PR description
Before this pr: - Long dashboard names were truncated in the search panel. - There was no way for the user to see the full name. After this pr: - A tooltip has been added to display the full dashboard name on hover. Task: [4903713](https://www.odoo.com/odoo/2328/tasks/4903713) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217905 Forward-Port-Of: odoo/odoo#216578
Fixes an issue where editing an internal website link could turn it from a short relative address into a full absolute URL. This keeps website links cleaner and avoids unintended changes when users edit and save link buttons or menus.
Original PR description
> [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
Product back-in-stock reminder emails no longer display a price that could exclude taxes. This avoids confusing customers when website prices are configured to include tax.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Configure website to display prices tax-included; 2. disable selling out-of-stock products; 3. go to an out-of-stock product page; 4. request a reminder email; 5. replenish product stock; 6. run the `_send_availability_email` action; 7. check email that was sent. Issue ----- The price display in the email does not include taxes. Cause ----- The email only checks the `list_price` defined on the product. Solution -------- Don't include the price in the email: - On stable: hide the element to avoid breaking xpaths - On master: remove the price element from the email template opw-4712613 Forward-Port-Of: odoo/odoo#215292
The website editor now shows the background positioning overlay at the correct full size when editing snippets with custom height or width settings. This prevents misplaced overlays and tooltips, making background image adjustments more reliable for website editors.
Original PR description
Before this commit in some snippets background overlay wouldn't have
proper height and/or width because of the snippets `h-{}, w-{}` classes.
This commit overrides it with `!important`.
To reproduce the issue:
- open website and start editing
- drop columns snippet, add background image to one of the cards, click
on it
- Click on the background position option to change it(the one with
a crosshair icon)
- the overlay isn't shown properly, which also breaks the tooltip
position
This should be forward-ported up to 18.3 inclusive, and from 18.4 on, `background_position_overlay.js L135` should be changed because of the [html_builder refactoring].
task-4930050
[html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
Forward-Port-Of: odoo/odoo#215377This fix makes automated messaging presence tests more stable when test servers are under heavy load. It prevents false failures in Odoo's validation pipeline, helping releases proceed with fewer interruptions while not changing user-facing behavior.
Original PR description
Since [1], https://github.com/odoo/odoo/pull/207974 websocket timeout has been increased during test. Fetching notification only returns the notifications of the last 50 seconds initially. When runbot is under high load, this can lead to non deterministic failures. This commit patches the cursor date to bypass this issue. [1]: https://github.com/odoo/odoo/pull/207974 fixes rubot-223126,223758 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#217953
A validation problem in the website form builder was corrected by allowing the active form setting to be optional. This prevents unnecessary errors during website editing and helps keep form configuration smoother for users.
Original PR description
This commit fix the props validation issue.here `activeForm` props should be optional props. runbot-227681
This fix ensures custom website snippets only appear on the website they belong to. It prevents editors from accidentally using content blocks from another website, improving consistency for businesses managing multiple sites.
Original PR description
Steps to reproduce: - Create a custom snippet. - Switch website and enter in edit mode. -> Problem: the custom snippet is present in edit mode on the second website while it should only be available on the first one. The commit adds back the `website_id` information when loading the snippets. The information was missing since [the website refactoring]. Related to task-4367641 [the website refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2
Changing a company's country VAT label now reliably updates the label shown on contact forms. This prevents users from seeing outdated field names after their configuration change, reducing confusion in the Contacts app.
Original PR description
**PROBLEM** When changing the vat label associated to the country of the user's company, it should change the label of the `vat` field. The cached partners views are not invalidated as they should…
**PROBLEM** When changing the vat label associated to the country of the user's company, it should change the label of the `vat` field. The cached partners views are not invalidated as they should and the old views with the old label are presented to the user instead of the new ones. This can be confusing to the user, because while their change had an effect on the database, it doesn't reflect on the views showed to them. **STEP TO REPRODUCE** 1. On a fresh database, install the contact app. 2. From the contact app, Configuration->Countries, select United States which should be the country of the demo company. 3. Change the Vat Label field value. 4. Go on any contact form view, and notice the label of the `vat` field wasn't updated. 5. You can refresh the pages, and sometimes the new value will be there, sometimes not. **CAUSE** https://github.com/odoo/odoo/blob/ac106704f3c2d3e3fa94415134b9d5522b325378/odoo/addons/base/models/res_partner.py#L41C1-L55C1 In the mixin `FormatVATLabelMixin` we modify the form view, changing the label of the vat field accordingly. However, the `_get_view_cache_key` override that would add the field used to make the change (`self.env.company.country_id.vat_label`) to the cache key is missing. Which means the cache isn't invalidated when it should. **FIX** Invalidating cache when writing on `vat_label` opw-4825749 Forward-Port-Of: odoo/odoo#213101
Email recipient tags now use the contact's full display name when a contact has no individual name or email address. This prevents users from seeing vague "Unnamed" labels and makes it easier to identify the correct recipient in sales email workflows.
Original PR description
Steps to reproduce =============== 1. Create a company called Acme. 2. Create a child contact of type Invoicing address but do not give it any name. 3. Go to Sales. 4. Open send mail composer and add this partner as a recipient. ---> The recipient tag will show Unnamed. From [Commit 1], the fallback was given Unnamed. After this commit we'll use display_name as a fallback for no name and email. [Commit 1]: https://github.com/odoo/odoo/commit/cba81ac77d3bad1c686d95f3a9a67f6bde51c569 Task-4812554 Forward-Port-Of: odoo/odoo#211830
This fixes an error that could stop electronic invoice generation when an invoice line included tax details without a tax grouping. Those incomplete tax details are now skipped for the affected export field, helping invoices generate reliably.
Original PR description
Before this commit: If a tax detail of an invoice line has the None tax grouping key, there is a traceback when generating the UBL InvoiceLine/ClassifiedTaxCategory After this commit: We exclude tax details that have the None grouping key when generating the InvoiceLine/ClassifiedTaxCategory. task-none Forward-Port-Of: odoo/odoo#217731
This update corrects the display width of form options in the website HTML builder. It helps keep form configuration controls aligned and easier to use when editing pages.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update removes an outdated setting that caused a validation error when viewing a customer's Accounting tab in debug mode. It helps keep the accounting customer view clean and reliable for users and developers working in debug mode.
Original PR description
When being in debug mode and going to the customer -> accounting tab, we have a props validation error. Also some small linter issue no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates the way the web module generates internal hash values so results stay consistent across different system environments. It helps prevent false failures in nightly automated testing, improving release reliability without changing user-facing behavior.
Original PR description
The previous hashCode algorithm produced was distribution-dependent results, causing errors in the Runbot's nightly tests for different distributions. The new hashCode algorithm is the same as the one used in Hoot [1], and this algorithm produces non-distribution-dependent results. [1]: https://github.com/odoo/odoo/blob/4d7e941939b2d8b644cbf0d9a5a0aa2bb8d4c9e8/addons/web/static/lib/hoot/hoot_utils.js#L941 runbot-error : 227626
Fixes an issue where rotating certain large images could make the editing area scroll and interrupt the rotation control. Users can now keep adjusting image rotation smoothly without losing focus mid-action.
Original PR description
Problem: When a user rotates an image, certain image sizes can cause the editable area to become scrollable. This triggers `resetHandlers` from `usePositionHook`, resulting in loss of focus on the rotate controller. Solution: Add a flag to detect when the user is actively transforming (`mousedown`). Delay the reset until interaction ends (`mouseup`), preventing premature handler reset. Steps to reproduce: - Add a long image - Transform > Rotate until a scrollbar appears - You lose focus on the rotate controller opw-4890029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#215401
This fix ensures MyInvois documents created from Point of Sale consistently link back to their related orders. It prevents incomplete record updates that could cause failures or missing order references in Malaysian e-invoicing workflows.
Original PR description
Otherwise, it causes it fails to assign value to certain records, which is unadvised. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217713
Corrected a typo that prevented the HR future-status field from using the intended calculation method. This helps ensure employee version records are evaluated correctly with minimal visible impact to users.
Original PR description
This commit fixes a typo in the name of the compute method of the is_future field.
Customer address entries without a contact name now show their address type, such as invoicing address, instead of displaying “False” in selection lists. This makes it easier for sales users to identify the correct recipient and avoids confusing placeholder text.
Original PR description
Steps to reproduce =============== 1. Create a company called Acme. 2. Create a child contact of type Invoicing address but do not give it any name. 3. Go to Sales. 4. Open the dropdown to select customer ---> Recipient without name will show False after the parent name From commit [Commit 1], formatted display name was added. After this commit, add a fallback as customer's type to the name. [Commit 1]: https://github.com/odoo/odoo/commit/4f594949164f7ee6753f1da92222d2bd904d1d58 Task-4812554 Forward-Port-Of: odoo/odoo#211865
When an Odoo database is neutralized for testing or staging, the Italian FatturaPA e-invoicing option is now turned off. This prevents the system from accidentally creating or reconnecting a live e-invoicing proxy user when settings are saved in a neutralized database.
Original PR description
**Steps to reproduce:** - Install l10n_it_edi - Switch to an Italian company (e.g. IT Company) - In Accounting settings, activate "Fattura Electronica (FatturaPA)" - When saving the settings, the…
**Steps to reproduce:** - Install l10n_it_edi - Switch to an Italian company (e.g. IT Company) - In Accounting settings, activate "Fattura Electronica (FatturaPA)" - When saving the settings, the system tries to create an EDI proxy user if there is no existing EDI proxy user in "test" or "prod" mode - Neutralize the database with the following command: `odoo-bin neutralize -d [db_name]` - Go the settings and save **Issue:** Upon save, the system will try to create an EDI proxy user in "prod" mode (or "test" mode if "l10n_it_edi.proxy_user_edi_mode" system parameter is set to "test"). The database is neutralized. It should not create an EDI proxy user in "prod" mode by default. **Cause:** An EDI proxy user is created in "prod" mode automatically when there is no existing proxy user in that mode and "FatturaPA" is activated. During the neutralization of the database, all proxy users are switched to "demo" mode, but "FatturaPA" is not deactivated. Therefore, the configuration is set to create a "prod" EDI proxy user. **Solution:** As we want to create an EDI proxy user in "prod" mode by default on a non-neutralized database, we can deactivate "FatturaPA" option during the neutralization to prevent the creation of an EDI proxy user on a neutralized database when saving the settings. opw-4795396 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217866
This update corrects an internal quality check so it no longer overlooks missing database indexes in certain test conditions. It also adds the indexes that were previously missed, improving consistency between developer checks and nightly CI runs.
Original PR description
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria…
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria used to ignore the field for indexing was if it belongs to a `test` model in some test module. The best-effort heuristic used for this is to see if there is some `ir.model. data` associated with the model in question and if all module's names associated with these data entries have `test`, then we can ignore the field for indexing. But due to the semantics of `all` for empty collections: ```py assert all([]) is True ``` models that had *no* `ir.model.data` associated at all, e.g. install `--without-demo` and no master data, the field would be ignored for indexing, leading to a passing test. But on nightly, where the CI is run with demo data also, the field isn't ignored anymore and is caught by the test's assertion for indexing suggestion as expected. This leads to errors that are never addressed by the developer that added the fields in question. This commits corrects the test and add the missing indexes that were raised from the CI's false-positive that were missed. Reference --------- runbot-227546 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#216643
The live chat button will no longer briefly show on pages where chat should not be available. This prevents visitors from seeing or trying to start a chat option that disappears moments later, creating a smoother website experience.
Original PR description
When the live chat is loaded on a page, it receives a value called `isAvailable` from the session. This name is misleading: it indicates availability if either an agent or a bot is present, but it…
When the live chat is loaded on a page, it receives a value called `isAvailable` from the session. This name is misleading: it indicates availability if either an agent or a bot is present, but it doesn’t consider the live chat rules. Since [1], we do not wait for the live chat service to be initialized, so the initial value is used instead of the corrected one.
These rules depend on the URL. Since `get_livechat_info` is called from the website template, we can’t determine which rule applies at that point. The goal is mainly to avoid calling `init_livechat` ("/mail/data") if we already know the live chat won’t be available. However, this check alone isn’t enough to decide whether to show the chat button.
This commit renames `isAvailable` to `can_load_livechat` for clarity. If `can_load_livechat` is set, we can load the live chat and call `init_livechat`, which will then set the `livechat_available` value.
task-4908197
[1]: https://github.com/odoo/odoo/pull/194399
backport-of: https://github.com/odoo/odoo/pull/216595
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#217695This fix ensures custom planning fields added to timesheet views are kept when a user creates and saves a timesheet. It prevents user-entered planning information from being overwritten by the default account distribution logic, improving data reliability for project time tracking.
Original PR description
### Steps to reproduce: - Navigate to a Project > View (Timesheets) - Open studio and add x_plan2_id for example to the view - Try creating a new timesheet and set a value for the field we added using studio - Save and notice the field doesn't keep its value ### Cause: This is mainly happening because when getting the plan_ids for the account we are gonna fill we just get the account in the distribution and ignore if the user is setting another value ### Fix: We check the create vals_list if a plan has value we set it before setting the account in the distribution opw-4716041 Forward-Port-Of: odoo/odoo#217715 Forward-Port-Of: odoo/odoo#214865
The website editor now correctly displays default spacing values, such as 0, when editing a banner. This avoids confusion for users by making the current layout settings visible instead of showing empty fields.
Original PR description
In the [html_builder refactoring] this behavior has been lost. To reproduce the issue: - Open Website and start editing - Add a "Banner" snippet - Click inside => The "spacing" option inputs are empty, but they should display 0. Related to task-4367641 [html_builder refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddb
The website editor now shows the correct icon when choosing vertical alignment for floating block cards on mobile. This avoids confusion for users editing mobile page layouts and helps them select the intended alignment option.
Original PR description
Commit [1] added vertical alignment options for the s_floating_blocks cards on mobile, but the icon src was wrong. [1]: https://github.com/odoo/odoo/commit/35f184680d7cdc8dc7d2e619baf7ad0ec02de31c task-4367641
The website page creation dialog now avoids loading an unnecessary legacy component, making it leaner and easier to maintain. It also corrects how page style information is retrieved, reducing repeated lookups and improving reliability when creating new pages.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an error that could occur when checking the number of ongoing live chat sessions. Users and administrators can now access this count reliably, improving stability in live chat management.
Original PR description
**Current behavior before PR:** - accessing 'ongoing_session_count' caused a traceback. **Desired behavior after PR is merged:** - 'ongoing_session_count' should be accessible without any traceback. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an internal test setup for Malaysia's POS e-invoicing module so it no longer relies on an unavailable enterprise component. It helps ensure community-only test runs complete reliably without affecting customer-facing features.
Original PR description
The test in this module imports a common setup from account_reports which is not a dependency, and is not auto installed when the test runs with community modules only. This fix replaces the setup by the community one AccountTestInvoicingCommon. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217681
This fix ensures important image-related information is kept when forum FAQ content is edited by restricted users. It prevents saved images from losing attachment and format details during content cleanup, helping maintain correct display and behavior.
Original PR description
When adding `html_builder`, some new data attributes were added on images. Those new attributes were not made safe, and might therefore be lost during HTML sanitization. This commit adds the new data attributes to the while list. Steps to reproduce: - Install `website_forum`. - Login as administrator. - Go to "Forum" then "About this forum". - Edit, add an image inside the FAQ and save. - If you inspect the image, it has `data-attachment-id` and `data-format-mimetype` attributes. - Go to Setting. - Setup a "Restricted Editor" user. - In debug mode, go to "Access Rights". - Add write access to `forum.forum` model for "Role / Member" users. - Logout. - Login as the "Restricted Editor" user. - Go to the forum's FAQ page. - Edit, change the text, save. => The attributes `data-attachment-id` and `data-format-mimetype` were lost. task-4367641
Removed outdated dashboard code that referenced information no longer provided by the system. This helps keep spreadsheet dashboards reliable and avoids unnecessary logic without changing expected user behavior.
Original PR description
`params` was removed from the action context by 1b86bd7ecf4d8 So `this.props.action.context.params` no longer makes any sense. It looks like it was useless. Everything seems to work without it. Let's remove it. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The employee payroll tab has been adjusted to render correctly. This helps HR users view payroll-related employee information without layout or display problems.
Original PR description
This fixes some rendering issues with the payroll tab. Task: 4885749
This fixes a duplicated Japan tax number example in the VAT validation data. It keeps the correct company registry example in the right place, reducing confusion when users see tax ID guidance for Japanese companies.
Original PR description
The dict contained 2 different examples for a tax number in Japan. Keeping the one that is correctly positioned in the dict. Forward-Port-Of: odoo/odoo#217710
Fixes an issue where users could see an error when opening the serial number generation dialog for products tracked by lot. This keeps warehouse operations running smoothly when generating serial or lot numbers after a recent data format change.
Original PR description
This commit adapts the `GenerateDialog` component for generating serial numbers, for the change introduced in odoo/odoo#205486, which changes the value of m2o to be an object instead of an array. Previous to this commit, an error was thrown when the dialog is opened for a lot-tracked product because the template tries to access `move.product_uom[1]` --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an issue where website theme fonts with multi-word names, such as Open Sans, were not applied correctly. This ensures selected fonts display as expected, improving visual consistency for websites.
Original PR description
Since `html_builder` was merged, font family selection is not implicitly quoted anymore. This is a problem for font families having names that contain spaces. This commit puts font family names between quotes before calling `customizeWebsiteVariable`. Steps to reproduce: - Go to the Theme tab - Pick "Open Sans" as font family - Inspect page => The used font was not "Open Sans". task-4367641
The website editor now hides the image quality setting when an externally linked image cannot be processed by the browser. This prevents users from selecting an option that could make the image disappear or become corrupted.
Original PR description
When an image is added from a CORS URL, the image data cannot be obtained from the web browser. Because of this, converting the image to another format, adjusting its quality or other manipulations are not possible. Currently the "Quality" option appears for CORS image - but disappear when trying to use it, which also corrupts the image. This commit hides the "Quality" option when converting to another format is anyway unavailable. Steps to reproduce: - drop an image block - replace an image by using "Add URL" and specify a [non-CORS image] - "Quality" option was available and could be used - replace an image by using "Add URL" and specify a [CORS image] => "Quality" option was available, but should not have been. Upon use, image was lost and "Quality" option disappeared. [non-CORS image]: https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Thysanoptera.jpg/420px-Thysanoptera.jpg [CORS image]: https://tinyjpg.com/images/social/website.jpg task-4367641
The test process now verifies that generated electronic invoice XML files use the correct namespace information, not just the visible content. This helps catch compliance issues earlier for localized e-invoicing formats and reduces the risk of invalid documents being released.
Original PR description
At the moment, the `assertXmlTreeEqual` test method doesn't check that the namespaces in the generated XML match the ones in the expected XML. This is a 'feature', but in practice it prevents us from ensuring that our generated XMLs are correct. From now on, we also check namespace equality. Enterprise PR: https://github.com/odoo/enterprise/pull/87950 task-none Forward-Port-Of: odoo/odoo#217182 Forward-Port-Of: odoo/odoo#214764
VoIP now removes parentheses when preparing phone numbers for calls. This helps ensure numbers saved or entered with common formatting, such as area codes in parentheses, are dialed correctly.
Original PR description
Add parentheses to the list of characters that are stripped from phone numbers. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89625 Forward-Port-Of: odoo/enterprise#89551
The Point of Sale appointment screen now correctly shows the empty bookings illustration when no bookings are available. This prevents an error from interrupting users after changing the booking view filters.
Original PR description
Steps to reproduce: ------------------------- - Open pos enabled with bookings. - Open booking tab and in gantt view remove groupby filter. Issue: ------- There will be a traceback. Cause: -------- When there are no bookings available it tries to load no booking svg template, which is not loaded in the assets. Fix --- We have loaded the missing asset file to ensure the SVG displays correctly when there are no bookings. task: 4912389
Swiss payroll-specific employee fields are now only shown for Swiss companies in multi-company setups. This prevents users in companies from other countries from seeing irrelevant Swiss payroll information, reducing confusion and keeping employee screens country-appropriate.
Original PR description
When using odoo in multi company with Swiss installed, we can see the fields from any other company. They should be hidden if the country is not Swiss. Task: 4788657
The signing template view now hides edit icons when users are only previewing a template, reducing visual clutter and preventing confusion. The document menu button display was also corrected, making the template viewing experience more consistent.
Original PR description
Hide the pencil (edit) icons in the sign_template_sidebar view when in template visualization mode. Also fixed the document menu button to ensure it appears correctly. These changes provide a cleaner and more consistent template viewing experience. task-4908825 This fix depends on the related [Enterprise PR #89129](https://github.com/odoo/enterprise/pull/89129), which should be merged first as it contains another part of the task.
This fix prevents an error when a user removes the description from a journal item in Uruguay electronic invoicing. It ensures invoices can still generate the required DGI XML correctly, avoiding disruption from an empty description field.
Original PR description
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description…
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description automatically populates with the product name upon line creation. However, users can intentionally clear this field. If the description field becomes empty, its value is interpreted as `False`. This leads to an `AttributeError: 'bool' object has no attribute 'replace'` traceback when the `_l10n_uy_edi_get_line_nom_and_desc` method attempts to process this boolean value, as it expects a string. This issue specifically affects the generation of the "DscItem" tag in the XML file sent to DGI. ### Solution: To prevent this error, an additional validation has been implemented for the line description. This validation ensures that if the field's value is `False`, it is not processed by the `_l10n_uy_edi_get_line_nom_and_desc` method, thus avoiding the traceback. Forward-Port-Of: odoo/enterprise#89407
The VoIP softphone now uses a minus icon instead of an X to hide the call window. This reduces confusion and hesitation for users who may worry that clicking the button will end their active call.
Original PR description
The "cross icon" (X) is believed to be too "scary"; people don't dare to click it in the middle of a call out of fear of hanging up, even though the softphone window might be in their way. The "minus icon" (-) might deceive one's expectations by hiding the window rather than minimizing it, but we decided that it was still better this way. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89555
This update ensures the Indian GSTR-1 report JSON always includes an expected empty document issue section when there are no entries. It prevents automated validation failures, helping keep tax report generation checks reliable without changing business workflows.
Original PR description
- Assigned doc_issue with empty list to comply with formatting of gstr1 json. - This prevents test failures caused by missing keys during JSON validation. runbot error: 229705 Forward-Port-Of: odoo/enterprise#89711 Forward-Port-Of: odoo/enterprise#89635
Budget reports now handle negative purchase order lines, such as discounts, without creating an extra duplicated budget entry. This keeps budget figures accurate when bills include discount lines tied to a project or analytic account.
Original PR description
Steps to reproduce: - Create a new Budget with budget line having Project [TEST] - Create a purchase order with 2 lines: 1. Product A, analytic [TEST], price unit 100, qty 1 2. Product B, analytic [TEST], price unit -10, qty 1 - Confirm the PO, mark products as received - Create the bill and confirm - Go back in PO, click on Budget smart button, open list view Issue: The budget report will correctly show a line for each invoiced line, but an extra line with double discount amount is present Occurs because we use a SQL code to replicate the qty_invoiced field of a purchase order line, but we adjust the sign based on the aml balance instead of taking into account the move type opw-4775631 Forward-Port-Of: odoo/enterprise#89545
Bank statement line imports now preserve an included statement reference instead of always creating a new bank statement. This prevents duplicated statements and keeps imported reconciliation data aligned with the original records.
Original PR description
…id during import In the override of execute_import of account_bank_statement_import_csv.py a new account.bank.statement was always created even if the import contained statement_id. Steps to reproduce: - Export an account.bank.statement.line in bank rec with the statement_id included. - Import it back. The statement_id of the imported lines is a new one. opw-4753864 Forward-Port-Of: odoo/enterprise#87885 Forward-Port-Of: odoo/enterprise#87165
This fix corrects an internal automated test so it no longer overlooks missing database indexes in certain data setups. It also adds the missed indexes across several Odoo Enterprise modules, helping prevent performance issues from reaching later CI runs or production environments.
Original PR description
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria…
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria used to ignore the field for indexing was if it belongs to a `test` model in some test module. The best-effort heuristic used for this is to see if there is some `ir.model. data` associated with the model in question and if all module's names associated with these data entries have `test`, then we can ignore the field for indexing. But due to the semantics of `all` for empty collections: ```py assert all([]) is True ``` models that had *no* `ir.model.data` associated at all, e.g. install `--without-demo` and no master data, the field would be ignored for indexing, leading to a passing test. But on nightly, where the CI is run with demo data also, the field isn't ignored anymore and is caught by the test's assertion for indexing suggestion as expected. This leads to errors that are never addressed by the developer that added the fields in question. This commits corrects the test and add the missing indexes that were raised from the CI's false-positive that were missed. Reference --------- runbot-227546 Forward-Port-Of: odoo/enterprise#88998
This fix prevents an error when users run reconciliation models without any bank statement lines available to process. Accounting teams can now run internal transfer reconciliation models safely even when there is nothing to reconcile.
Original PR description
SQL syntax error occurs when trying to auto reconcile transactions via reconcile models,it is because there are no statement lines to reconcile. **Steps to reproduce:** * Install `accountant` module (No demo data needed) * Accounting Dashboard> Bank dropdown menu * Under reconciliation>Models>Internal Transfers>Run Now `syntax error at or near ')' LINE 57: WHERE st_line.id IN ()` **Solution:** * Return the function if there are no statement to reconcile. **Sentry-6610155279** Forward-Port-Of: odoo/enterprise#85937
This fixes an issue where the refund reason prompt did not appear in Point of Sale when Spanish TicketBAI and Peruvian electronic invoicing features were both installed. Refund workflows now behave as expected, helping staff capture required refund information reliably.
Original PR description
When both l10n_es_pos_tbai and l10n_pe_edi_pos are installed, the refund reason popup was not showing up because we were not awaiting the super method call in the l10n_pe_edi_pos override. runbot-227630 Forward-Port-Of: odoo/enterprise#89423 Forward-Port-Of: odoo/enterprise#88813
This update fixes issues with the Payroll tab on employee records across multiple country-specific payroll setups. It helps HR and payroll users access the expected employee payroll information consistently, reducing confusion when working in localized payroll configurations.
Original PR description
This fixes the payroll tab in the inherited view of employee for various loca. Task: 4885749
Opening the filters panel in the subscription dashboard no longer fails when some filters do not apply to the current data model. The change skips irrelevant filters when preparing suggestions, improving dashboard editing reliability for users.
Original PR description
Steps to reproduce: 1. Edit the subscription dashboard 2. Open the filters side panel => Boom This is caused by the fact that the suggestions store was trying to match filters that are not matching the current model. Task: 4911733
Fixed an issue that could stop a barcode scanner from being assigned during Point of Sale IoT setup. This helps stores complete device configuration smoothly and avoids a setup error reported in monitoring.
Original PR description
The error occurs because `append()` is used on the Many2many field `iface_scanner_ids` in `pos_config`, which is not allowed. Traceback: `AttributeError: 'iot.device' object has no attribute 'append'` Many2many fields should be updated using `|=` to add records, as the Python list method `append` is not supported for relational fields. [1]- https://github.com/odoo/enterprise/blob/5bff585cfa24940626b14cdeaeae07b50a931e94/pos_iot/wizard/auto_config_pos_iot.py#L55 sentry-6719710908 Forward-Port-Of: odoo/enterprise#89123
The Signed Contract button now opens the correct employee contract version after all required signatures are completed. This prevents confusion for HR users and helps ensure they review the right signed offer information.
Original PR description
- Fixed an issue where clicking the "Signed Contract" smartbutton after full signature opened an incorrect employee version. Task-4873800
When a new employee contract is created through the salary configurator, the previous contract now automatically ends the day before the new one starts. This prevents overlapping contract records and helps keep employee contract timelines accurate without manual correction.
Original PR description
When you create a new contract through the salary configurator flow, it will create automatically a new version with the date encoded in the offer wizard. However, the 'contract_end_date' for the old version is not automatically updated. The logic has been adjusted to end old contract date the day before the new contract's start date.
Updated automated tests now verify XML namespace details for payment and electronic invoicing files. This helps ensure country-specific EDI documents and ISO 20022 payment files match required standards more accurately, reducing the risk of undetected format issues.
Original PR description
Before, we weren't asserting XML namespaces when calling `assertXmlTreeEqual`. As a result, many expected XMLs in EDI tests had incorrect namespaces. Now that we change the test method to check namespaces, we also need to fix the expected XMLs. Community PR: https://github.com/odoo/odoo/pull/214764 task-none Forward-Port-Of: odoo/enterprise#89303 Forward-Port-Of: odoo/enterprise#87950
Website forms now correctly use automatically filled values when deciding which fields to show or hide. This prevents visitors from seeing incomplete form behavior when a field should appear based on prefilled information such as their email address.
Original PR description
When [1] introduced a cached version of the form data to compute visibility, it did not take into account the values that are completed through `prefillValues`. Because of this, input events are required for those to be taken into account. This commit fixes this by re-evaluating the form content after the execution of `prefillValues`. Steps to reproduce: - Drop a "Form" snippet - Make "Your Question" field visible only if "Your Email" is set. - Save page. => Upon display, the email is populated with the user's email, but "Your Question" did not become visible. [1]: https://github.com/odoo/odoo/commit/027ce4e3991c9fefdbbb862a69f73e865a1100c8 task-jke Forward-Port-Of: odoo/odoo#217729
The website editor test for text highlighting has been updated to match the new Website Builder layout. This helps ensure the text highlight feature continues to work reliably after its controls moved to a more convenient overlay.
Original PR description
This PR re-enables the test_website_text_highlights test, which was broken and skipped due to the DOM changes introduced by the new Website Builder. It also adapts the tour selectors accordingly. Previously, the text highlight option was available in the option bar, but in the new Website Builder, it has been moved to the overlay for easier editing.
6 changes
Resolved issues and error corrections
VoIP now removes parentheses when cleaning phone numbers, so numbers entered with formats like (123) 456-7890 are handled correctly. This reduces dialing issues caused by common phone number formatting.
Original PR description
Add parentheses to the list of characters that are stripped from phone numbers. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89625 Forward-Port-Of: odoo/enterprise#89551
Helpdesk tickets created directly in a closed stage are now marked with a close date immediately. This keeps the customer portal's Open filter accurate, so portal users do not see already resolved tickets mixed with active ones.
Original PR description
**Steps to reproduce:** 1. Install the Helpdesk module. 2. Create a ticket directly in a closed stage (e.g., 'Solved') and add the portal user as a customer. 3. Log in as the portal user. 4. Apply the Open filter. **Issue:** - The ticket appears under Open Tickets, even though it was created in a closed stage. **Cause:** - Currently we consider a stage as closed if 'floded in kanban' is True and When a ticket is created directly in a closed stage, the close_date field is not set. Since the portal filter relies on close_date to distinguish open from closed tickets, this shows closed tickets in open filter. https://github.com/odoo/enterprise/blob/c34256932e593ac2774fa65af813d64edb70ec43/helpdesk/controllers/portal.py#L63 **Solution:** - During ticket creation, if the specified stage is a closing stage, set the close_date field to the current time. opw-4847097 Forward-Port-Of: odoo/enterprise#88983 Forward-Port-Of: odoo/enterprise#87293
The VoIP keypad now uses consistent bottom spacing between the in-call and transfer screens. This fixes a small visual mismatch, making the calling interface look more polished and predictable for users.
Original PR description
Prior to this commit, the bottom margin differed between the "In call" and "Transfer" views, creating inconsistency. This commit adjusts the spacing to maintain consistency. | Before | After | |--------|--------| |  |  | task-4908502
This fix prevents Uruguayan electronic invoice generation from failing when a user clears an item description in journal entries. It keeps document submission to DGI working even when optional line descriptions are left empty.
Original PR description
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description…
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description automatically populates with the product name upon line creation. However, users can intentionally clear this field. If the description field becomes empty, its value is interpreted as `False`. This leads to an `AttributeError: 'bool' object has no attribute 'replace'` traceback when the `_l10n_uy_edi_get_line_nom_and_desc` method attempts to process this boolean value, as it expects a string. This issue specifically affects the generation of the "DscItem" tag in the XML file sent to DGI. ### Solution: To prevent this error, an additional validation has been implemented for the line description. This validation ensures that if the field's value is `False`, it is not processed by the `_l10n_uy_edi_get_line_nom_and_desc` method, thus avoiding the traceback. Forward-Port-Of: odoo/enterprise#89407
The Time Off type configuration form now presents payroll and localization options in a clearer two-column layout. This makes settings easier to review and reduces confusion when configuring leave policies for different countries or payroll needs.
Original PR description
* = l10n_in_hr_holidays, l10n_ae_hr_payroll, l10n_be_hr_payroll Steps: - Navigate to Time Off > Configuration > Time Off Types. - Open any time off type form with localization or payroll-related options. Issues: - Configuration fields (including localization modules) appeared misaligned. - The Payroll section was not utilizing space effectively in the layout. Fix: - Aligned all configuration fields in a consistent two-column layout, including localization and payroll-related options., - Repositioned the Payroll section below the Negative Cap section. Task - 4759116
This fix ensures the Indian GST return JSON output always includes the expected document issue section, even when it is empty. This prevents automated validation and test failures, helping keep tax reporting exports consistent and reliable.
Original PR description
- Assigned doc_issue with empty list to comply with formatting of gstr1 json. - This prevents test failures caused by missing keys during JSON validation. runbot error: 229705 Forward-Port-Of: odoo/enterprise#89711 Forward-Port-Of: odoo/enterprise#89635
17 changes
Resolved issues and error corrections
This update prevents translation-related errors that could occur when sharing referral links or working with loan records. The change improves reliability by adjusting how translated text is prepared, without changing user-facing features.
Original PR description
Issue: Prior to this commit, a translation issue occurred due to the use of a list comprehension. The _get_translation_source function attempts to scan the local variables, but in the context of a list comprehension, only variables defined within the comprehension are accessible. As a result, variables like uuid and cursor were not available to the _get_lang function, ultimately leading to an error. Fix: Replaced the list comprehension with a standard for loop to ensure proper access to local variables. runbot-98198 Forward-Port-Of: odoo/enterprise#88632
The intercompany rules settings now use clearer wording for the option related to creating invoices. This reduces confusion for users configuring automated transactions between companies.
Original PR description
This commit: https://github.com/odoo/enterprise/commit/4b57698670a7762bb206ccb24417d63c8edc1a46 change the ux of the intercompany rules, but the naming is confusing for users. task-4907810 Forward-Port-Of: odoo/enterprise#89368
The Time Off Type configuration form now displays localization and payroll-related options in a more consistent two-column layout. This makes the setup screen easier to scan and use, with the Payroll section placed more logically below Negative Cap settings.
Original PR description
* = l10n_in_hr_holidays, l10n_ae_hr_payroll, l10n_be_hr_payroll Steps: - Navigate to Time Off > Configuration > Time Off Types. - Open any time off type form with localization or payroll-related options. Issues: - Configuration fields (including localization modules) appeared misaligned. - The Payroll section was not utilizing space effectively in the layout. Fix: - Aligned all configuration fields in a consistent two-column layout, including localization and payroll-related options., - Repositioned the Payroll section below the Negative Cap section. Task - 4759116
This fix adjusts the payroll expense test setup so it no longer uses a default account that could cause duplicate accounting entries to be selected. It helps keep payroll expense reconciliation checks reliable after recent accounting logic changes.
Original PR description
This commit removes the default account set in the setup of test_payroll_expense. Because of 67b5fc47ca4aa1abb60f198a87d7784ef400f796 the filter in get_all_amls_to_be_reconciled would get multiples amls instead of only one. community pr: https://github.com/odoo/odoo/pull/211443 opw-4751270 Forward-Port-Of: odoo/enterprise#88862 Forward-Port-Of: odoo/enterprise#86987
The update prevents an error when users run automatic reconciliation models without any bank statement lines available. Instead of failing with a database error, the process now exits cleanly, improving reliability for accounting workflows.
Original PR description
SQL syntax error occurs when trying to auto reconcile transactions via reconcile models,it is because there are no statement lines to reconcile. **Steps to reproduce:** * Install `accountant` module (No demo data needed) * Accounting Dashboard> Bank dropdown menu * Under reconciliation>Models>Internal Transfers>Run Now `syntax error at or near ')' LINE 57: WHERE st_line.id IN ()` **Solution:** * Return the function if there are no statement to reconcile. **Sentry-6610155279** Forward-Port-Of: odoo/enterprise#85937
This fix prevents an error when assigning scanner devices during Point of Sale IoT configuration. Businesses can complete scanner setup more reliably without manual troubleshooting.
Original PR description
The error occurs because `append()` is used on the Many2many field `iface_scanner_ids` in `pos_config`, which is not allowed. Traceback: `AttributeError: 'iot.device' object has no attribute 'append'` Many2many fields should be updated using `|=` to add records, as the Python list method `append` is not supported for relational fields. [1]- https://github.com/odoo/enterprise/blob/5bff585cfa24940626b14cdeaeae07b50a931e94/pos_iot/wizard/auto_config_pos_iot.py#L55 sentry-6719710908 Forward-Port-Of: odoo/enterprise#89123
Opening the filters panel while editing the subscription dashboard no longer causes an error. The fix ensures filter suggestions only use filters relevant to the current dashboard data, improving stability for users managing spreadsheet dashboards.
Original PR description
Steps to reproduce: 1. Edit the subscription dashboard 2. Open the filters side panel => Boom This is caused by the fact that the suggestions store was trying to match filters that are not matching the current model. Task: 4911733 Forward-Port-Of: odoo/enterprise#89606
The update corrects test reference files so they now verify XML namespace details for payment and electronic invoicing formats. This helps catch formatting issues earlier and improves confidence that country-specific electronic documents remain compliant.
Original PR description
Before, we weren't asserting XML namespaces when calling `assertXmlTreeEqual`. As a result, many expected XMLs in EDI tests had incorrect namespaces. Now that we change the test method to check namespaces, we also need to fix the expected XMLs. Community PR: https://github.com/odoo/odoo/pull/214764 task-none Forward-Port-Of: odoo/enterprise#89476 Forward-Port-Of: odoo/enterprise#87950
This fix ensures the Indian GSTR-1 report JSON always includes the expected document issue field, even when there are no entries. It prevents automated validation failures and helps keep tax report generation reliable.
Original PR description
- Assigned doc_issue with empty list to comply with formatting of gstr1 json. - This prevents test failures caused by missing keys during JSON validation. runbot error: 229705 Forward-Port-Of: odoo/enterprise#89711 Forward-Port-Of: odoo/enterprise#89635
The VoIP softphone now uses a minus icon instead of an X for hiding the call window. This makes users less likely to worry that clicking the control will end their call, improving confidence during active calls.
Original PR description
The "cross icon" (X) is believed to be too "scary"; people don't dare to click it in the middle of a call out of fear of hanging up, even though the softphone window might be in their way. The "minus icon" (-) might deceive one's expectations by hiding the window rather than minimizing it, but we decided that it was still better this way. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89555
CSV imports for bank statement lines now preserve the statement reference already present in the imported file instead of creating a new bank statement every time. This prevents duplicated or incorrect bank statements when teams export and re-import reconciliation data.
Original PR description
…id during import In the override of execute_import of account_bank_statement_import_csv.py a new account.bank.statement was always created even if the import contained statement_id. Steps to reproduce: - Export an account.bank.statement.line in bank rec with the statement_id included. - Import it back. The statement_id of the imported lines is a new one. opw-4753864 Forward-Port-Of: odoo/enterprise#87885 Forward-Port-Of: odoo/enterprise#87165
The Signed Contract button on salary offers now opens the correct employee contract version after all signatures are complete. This prevents confusion for HR users and ensures they review the right signed employee information.
Original PR description
- Fixed an issue where clicking the "Signed Contract" smartbutton after full signature opened an incorrect employee version. Task-4873800 Forward-Port-Of: odoo/enterprise#89051
This fix makes an internal quality check correctly detect missing database indexes in all test environments, preventing issues from being missed before release. It also adds the missing indexes found by the corrected check across accounting, ESG, payroll localization, and point-of-sale areas, improving consistency and reducing future performance risk.
Original PR description
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria…
Description ----------- The test `.test_enforce_index_on_one2many_inverse` was added to fail upon a missing index, so developers could add them during development, before merging. One of the criteria used to ignore the field for indexing was if it belongs to a `test` model in some test module. The best-effort heuristic used for this is to see if there is some `ir.model. data` associated with the model in question and if all module's names associated with these data entries have `test`, then we can ignore the field for indexing. But due to the semantics of `all` for empty collections: ```py assert all([]) is True ``` models that had *no* `ir.model.data` associated at all, e.g. install `--without-demo` and no master data, the field would be ignored for indexing, leading to a passing test. But on nightly, where the CI is run with demo data also, the field isn't ignored anymore and is caught by the test's assertion for indexing suggestion as expected. This leads to errors that are never addressed by the developer that added the fields in question. This commits corrects the test and add the missing indexes that were raised from the CI's false-positive that were missed. Reference --------- runbot-227546 Forward-Port-Of: odoo/enterprise#89732 Forward-Port-Of: odoo/enterprise#88998
This fixes an error that could block Uruguay electronic invoice XML generation when a user manually removed a journal item description. The system now safely handles empty descriptions, helping invoices continue to be processed and sent to DGI.
Original PR description
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description…
This PR addresses an issue encountered when the product description is removed from an account.move.line within the "Journal items" section. ### Problem: Normally, the `account.move.line` description automatically populates with the product name upon line creation. However, users can intentionally clear this field. If the description field becomes empty, its value is interpreted as `False`. This leads to an `AttributeError: 'bool' object has no attribute 'replace'` traceback when the `_l10n_uy_edi_get_line_nom_and_desc` method attempts to process this boolean value, as it expects a string. This issue specifically affects the generation of the "DscItem" tag in the XML file sent to DGI. ### Solution: To prevent this error, an additional validation has been implemented for the line description. This validation ensures that if the field's value is `False`, it is not processed by the `_l10n_uy_edi_get_line_nom_and_desc` method, thus avoiding the traceback. Forward-Port-Of: odoo/enterprise#89407
Fixed an issue where purchase order discount lines could create an extra budget report entry with the discount counted twice. Budget views now reflect invoiced purchase lines more accurately, helping teams avoid overstated budget impacts.
Original PR description
Steps to reproduce: - Create a new Budget with budget line having Project [TEST] - Create a purchase order with 2 lines: 1. Product A, analytic [TEST], price unit 100, qty 1 2. Product B, analytic [TEST], price unit -10, qty 1 - Confirm the PO, mark products as received - Create the bill and confirm - Go back in PO, click on Budget smart button, open list view Issue: The budget report will correctly show a line for each invoiced line, but an extra line with double discount amount is present Occurs because we use a SQL code to replicate the qty_invoiced field of a purchase order line, but we adjust the sign based on the aml balance instead of taking into account the move type opw-4775631 Forward-Port-Of: odoo/enterprise#89545
This fixes an internal issue in cash basis accounting reports where report filters could fail because the filtering rules were being modified incorrectly. The change helps reports run reliably and avoids runbot errors without changing business workflows.
Original PR description
Domains are immutable, append replaced by the and operator. runbot error 229710
VoIP now removes parentheses when cleaning phone numbers, so numbers copied or entered with common formatting are processed more reliably. This helps avoid call issues caused by formatted phone numbers such as those containing brackets.
Original PR description
Add parentheses to the list of characters that are stripped from phone numbers. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89625 Forward-Port-Of: odoo/enterprise#89551
13 changes
Resolved issues and error corrections
This update adjusts an automated test for the HTML editor's link popover to prevent intermittent failures. It helps keep quality checks stable so fixes and improvements can move through validation more reliably.
Original PR description
The fix at [1] did not fix the issue. This is another attempt. runbot-227759 [1]: https://github.com/odoo/odoo/pull/215168/commits/9a3c9ecca14fb8701e4f934cf5285297cbe26310
A flaky automated check in the Mail discussion area was stabilized by waiting until a reaction is fully removed before reloading the page. This helps reduce false failures in validation systems and supports smoother delivery of future updates.
Original PR description
Before this commit, tour "discuss_channel_public_tour" was failing non-deterministically at the following step: ``` .o-mail-Message:not(:has(.o-mail-MessageReaction)) ``` This happens because prio steps added a new reaction and asserted it was shown. It clicks on reaction to remove it and then page reload to see the reaction is gone. Problem is that it can reload page too fast and the RPC to remove the reaction did not have time to occurs. This commit fixes the issue by awaiting message no longer has reaction before page reload. Fixes runbot-error-227769
This update fixes an unreliable automated test for message reactions selected from the emoji picker. It helps ensure future changes accurately catch reaction behavior issues without false or inconsistent test results.
Original PR description
Before this commit, test "Add the same reaction twice from the emoji picker" may fail non-deterministically in 18.1 on last step: the message reaction is sometimes kept, sometimes removed. The feature works in 18.0 but no longer in 18.1. The test was still passing though very rarely can fail and actually show the feature doesn't work. This happens because the test is clicking on reaction too fast and doesn't assert on UI the 1st message reaction has been added, thus it may flicker and keep showing there's 1 message reaction still. This commit fixes the test in 18.0, in preparation to keep the same test in 18.1 and show the bugged change of behaviour in 18.1 to fix. Fixes runbot error 229340
The HTML editor font size field now uses the correct text color when dark mode is enabled. This improves readability and consistency for users editing content in dark-themed environments.
Original PR description
Purpose of this PR: - Backport a [PR #206008](https://github.com/odoo/odoo/pull/206008), which ensures that the font-size input now changes its color appropriately in dark mode. task-4897771 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes the Discuss channel test wait for a fully saved message before trying to add a reaction. It prevents intermittent automated test failures caused by reacting to a temporary message that is replaced moments later.
Original PR description
Backport of https://github.com/odoo/odoo/pull/217982 [FIX] mail: fix runbot error 222093 (o-mail-Message:contains(cheese)) Before this commit, tour "test_discuss_channel_public_page_as_guest" would…
Backport of https://github.com/odoo/odoo/pull/217982 [FIX] mail: fix runbot error 222093 (o-mail-Message:contains(cheese)) Before this commit, tour "test_discuss_channel_public_page_as_guest" would crash in test after posting a message in which we attempt to add a reaction. This happens because the step is a `hover && click 'Add a reaction'`, so it hovers on selector `o-mail-Message:contains(cheese)` then clicks on the 'Add a reaction' action. In discuss channels, when sending a message, the message is immediately shown on UI before there's a genuine message that is created in DB. This optimistic behavior gives impression the app is fast, but some actions require a genuine message like 'Add a reaction'. The problem of test is that selector `.o-mail-Message:contains(cheese)` passes with temporary / transient message of optimistic behavior, so the `hover` step would be triggered on the temporary / transient message and 'Add a reaction' action is awaited for click. Problem is that when genuine message data is received, implementation detail deletes the temporary / transient message and then shows the genuine message. Because the genuine message is different, component identity is different (it uses message.localId in `t-key`), thus it awaits `Add a reaction` on UI but it's not visible because we need to hover again, this time on genuine message. This commit fixes the issue by awaiting message is shown on UI is the persistent, i.e. non-temporary and non-transient, so that hover and click on the 'Add a reaction' action works without issue. fixes runbot error 181660 fixes runbot error 222093 fixes runbot error 227756 fixes runbot error 227758
Expense posting no longer requires an employee to have a work email address. This prevents valid expense reports from being blocked when partner records can now be created without that email information.
Original PR description
- removed work email constraint while posting the expense as the partner is now created without the need of work email --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Product back-in-stock notification emails no longer display a price that may exclude taxes. This avoids confusing customers when website prices are configured to include taxes and keeps the email focused on product availability.
Original PR description
Versions -------- - 17.0+ Steps ----- 1. Configure website to display prices tax-included; 2. disable selling out-of-stock products; 3. go to an out-of-stock product page; 4. request a reminder email; 5. replenish product stock; 6. run the `_send_availability_email` action; 7. check email that was sent. Issue ----- The price display in the email does not include taxes. Cause ----- The email only checks the `list_price` defined on the product. Solution -------- Don't include the price in the email: - On stable: hide the element to avoid breaking xpaths - On master: remove the price element from the email template opw-4712613 Forward-Port-Of: odoo/odoo#215292
This fix prevents an error when users view reserved packaging quantities for kit products that do not have packaging set. Inventory reporting can now display these reserved quantities reliably instead of failing with a crash.
Original PR description
### Steps to reproduce: - In the settings enable "Product Packagings" - Create a product P with a kit bom: 1 x COMP - Create and confirm a delivery for 1 unit of P - Reserve 1 unit of COMP (put the…
### Steps to reproduce: - In the settings enable "Product Packagings" - Create a product P with a kit bom: 1 x COMP - Create and confirm a delivery for 1 unit of P - Reserve 1 unit of COMP (put the quantity of the move to 1) - Go to Inventory > Reporting > Moves history - Add the field "Reserved Packaging Quantity" in the view (with studio) - remove the "done" filter #### > Traceback: ZeroDivisionError in _compute_product_packaging_qty ### Cause of the issue: The computation of the `product_packaging_qty` can not succeed for a kit move line without `packaging_id` on its move since: `move_line.move_id.product_packaging_id.qty` will be 0: https://github.com/odoo/odoo/blob/b87c896969cc576a799ac63f03501be1e87b0e84/addons/mrp/models/stock_move.py#L107 By contrast since if the packaging is set, there should not be an issue since the field is required and since there is a positive constraint: https://github.com/odoo/odoo/blob/b87c896969cc576a799ac63f03501be1e87b0e84/addons/product/models/product_packaging.py#L21-L27 opw-4781180 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#217877
The media attachment remove icon is now shown correctly in the editor dialog. This fixes a small visual issue that could make it harder for users to remove selected media attachments.
Original PR description
Description of the issue this PR addresses: - The remove icon in the media dialog attachment was not visible due to the use of an invalid `z-index-1` class. This commit c5a98c76ea1cce4acb55faf4768388b94255508f removed custom `z-index` utilities. Replaces `z-index-1` with Bootstrap's default `z-1` class. Before this commit: - The icon used `z-index-1`, which is not a valid Bootstrap class. After this commit: - Replaced with `z-1`, the correct Bootstrap 5 utility class for `z-index: 1`. task-4903381 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix makes an internal mail presence test stable when automated test systems are under heavy load. It reduces false test failures, helping keep releases and updates moving reliably without changing user-facing behavior.
Original PR description
Since [1], https://github.com/odoo/odoo/pull/207974 websocket timeout has been increased during test. Fetching notification only returns the notifications of the last 50 seconds initially. When runbot is under high load, this can lead to non deterministic failures. This commit patches the cursor date to bypass this issue. [1]: https://github.com/odoo/odoo/pull/207974 fixes rubot-223758 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
Phone numbers entered with parentheses are now handled correctly by the VoIP feature. This helps avoid dialing issues when users copy or type numbers in common formats such as area codes in brackets.
Original PR description
Add parentheses to the list of characters that are stripped from phone numbers. Part of task-4891947. Forward-Port-Of: odoo/enterprise#89625 Forward-Port-Of: odoo/enterprise#89551
Italian POS fiscal receipts and invoices no longer add a manual header because the fiscal printer already prints one automatically. This prevents customers from receiving receipts with duplicated header information, making printed documents cleaner and compliant with printer behavior.
Original PR description
The printer is already adding a header by default so we don't need to add one manually. Steps to reproduce: ------------------- * Setup an Italian fiscal printer in the POS * Open the POS and create a new order * Add a product and validate the order > Observation: The printed receipt has 2 headers. Why the fix: ------------ According to the Italian fiscal printer documentation, the header is automatically added by the printer, so we don't need to add it manually. Ticket before and after the fix:  opw-4794322
The empty screen image in Subscriptions now scales with its surrounding space instead of using a fixed size. This makes the image larger and easier to see, improving the first-use experience for users who have no subscription records yet.
Original PR description
Changed the empty screen image size from a fixed value to a dynamic ratio based on its parent element. The image is now larger and clearer for the user. task-4912109