Daily updates from Odoo
Wednesday, June 25, 2025
17 changes
4 changes
Resolved issues and error corrections
Several spreadsheet dashboards have been updated so their date filters work correctly after a recent platform change. This restores reliable dashboard views across accounting, CRM, helpdesk, payroll, recruitment, marketing, manufacturing, and purchasing areas.
This fix makes automated website editor checks wait for the page editor to be fully ready before saving. It reduces timing-related failures in appointment and knowledge website test flows, helping maintain release stability without changing end-user features.
Original PR description
*website_knowledge The related commit on community codebase [1] changed the behaviour of `InteractionService.shouldStop()` such that it returns true also when `el` contains `interaction.el`. This means that in edit mode interactions will restart more often: to prevent timing problems in tours, the step `waitIframeIsReady()` is now included in `clickOnSave()`. task-4367641 [1] https://github.com/odoo/odoo/commit/76a1c09c699c220b3f6f31c121b3defb776b3cc6
The subscription portal now safely handles missing resume invoice dates instead of crashing during payment. This prevents affected customers from seeing an error when paying quotations for subscriptions that cannot be paused by the user.
Original PR description
When `next_invoice_date_at_resume` is falsy (None), the template tried to call `format_date(None)`, which resulted in a `'NoneType' object is not callable` error. This commit adds a safe check both in the controller and the template to ensure the value exists before formatting.
Internal users without Planning app access can once again open the shift calendar to view their own shifts and open shifts. The change hides a resource filter that required higher Planning permissions, preventing unnecessary access errors.
Original PR description
Before this commit, the internal user without any access to planning app can no longer access to the calendar view of planning.slot model to see his shifts and the open shifts. The reason is because the new filter added is only accessible to planning user. This commit hides the new filter on resources when the user has no access to planning app. Steps to reproduce: ================== 0. install Planning app 1. Create an internal user without any access to planning app (or remove planning access to Marc demo) 2. Log as Marc demo (or new user created in step 2) 3. Go to planning app and switch to calendar view Expected Behavior: ----------------- The user should be able to access to the calendar view without any issue. Current Behavior: ---------------- An access error is raised because the current user cannot access to `planning.calendar.resource` model which is only accessible to users with planning access rights. runbot-error-227622
3 changes
Resolved issues and error corrections
Assigned users can now open worksheets linked to their tasks, even when another user created the worksheet. This removes an access blocker in Field Service and related worksheet flows, helping teams collaborate without needing elevated permissions.
Original PR description
Steps to Reproduce
-----------
- Install field service
- Open project, create a task with worksheet enabled on project
- Assign two user A and B on the task
- Create the worksheet
- Login using user B
Issue
--------
- User B doesn't have access to the worksheet
- Similar issue in the quality app
Cause
----------
- User B not able to edit the existing worksheet because it triggers an SQL constraint making sure that 1 worksheet is related to only 1 task.
Fix
----------
- We remove this [('create_uid', '=', user.id)] record rule.
task-3891011This fix updates several business modules to use the current file conversion setting after an older option was deprecated. It helps keep appraisal, marketing automation, CRM marketing, and product classification features compatible with platform changes and reduces the risk of future errors.
The spreadsheet edition test coverage was adjusted to reflect the corrected handling of empty labels in global filters. This helps ensure future updates preserve the expected spreadsheet behavior and reduces the risk of regressions.
Original PR description
Task: 4876003
10 changes
Resolved issues and error corrections
This fix prevents email style content from being incorrectly removed when it contains more than one embedded data image. It helps outgoing emails keep their intended formatting and appearance while maintaining the existing cleanup safeguards.
Original PR description
In lxml from 4.6.0 to 5.2.0: [1] introduces an issue where "style" tags will always be cleaned if there is more than one data url inside it (the regex is too greedy) in 4.6.0 [2] fixes the issue in the lxml_html_clean module version 0.1.1 which is the dependency that replaces lxml.html.clean from lxml 5.2.0 and up We apply the fix from [2] in odoo directly. With many checks to ensure we don't override any potential deviation from the original regex. The issue only appear from 18.0 onwards, as that's when "email_outgoing" sanitation started being applied [3] [1]: https://github.com/lxml/lxml/commit/73778681f14359fe6d16644e69aaca276eba525a [2]: https://github.com/fedora-python/lxml_html_clean/commit/97402b5f6e94583c8f1c3f6070ef19ce1df90da8 [3]: https://github.com/odoo/odoo/commit/24731938f75358fd3c72b91465b72ab80d62d208 runbot-105525
This update makes the automated product comparison test wait until the comparison popover is visible before continuing. It helps prevent false test failures and supports a more stable shopping comparison experience.
Original PR description
In this commit, we add a step to ensure that the popover comparator is visible in the DOM before moving on to the next check step. 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
Cyprus sales to EU customers now use 0% tax for goods and services, aligning invoices with cross-border EU VAT rules. EU purchases now apply and immediately deduct 19% VAT, keeping the net effect at zero while recording the tax correctly.
Original PR description
This PR changes the sales and purchase taxes for Cyprus when selling/purchasing within the EU. - All sales taxes changed to 0% when selling to country within the EU. - All purchase taxes changed to…
This PR changes the sales and purchase taxes for Cyprus when selling/purchasing within the EU. - All sales taxes changed to 0% when selling to country within the EU. - All purchase taxes changed to 19% when buying from country within the EU. However, a second tax repartition line is added at -100% of the tax. The tax is effectively applied and deducted at the same time. - Redundant taxes were removed like zero rate taxes and taxes with reverse charge. task-4488340 Current behavior before PR: - When selling to other EU countries, a 19% sales tax is added to goods and services. - When buying with other EU countries, a 0% VAT tax is added to goods and a 19% VAT tax is added to services. Desired behavior after PR is merged: - When selling to other EU countries, a 0% sales tax is added to goods and services. - When buying with other EU countries, a 19% VAT tax is added to goods and services, and a second tax repartition line is added at -100% of the tax effectively making it 0. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website numbers-and-charts block now shows progress bars with the correct value when first added. It also prevents a website editor crash when users change label visibility, making page editing more reliable.
Original PR description
The `s_numbers_charts` snippet had two main issues: - The progress bar within `s_numbers_charts` visually appeared as 45% on initial rendering, despite its actual configured value being 25%. This was…
The `s_numbers_charts` snippet had two main issues: - The progress bar within `s_numbers_charts` visually appeared as 45% on initial rendering, despite its actual configured value being 25%. This was due to a mismatch between its `aria-valuenow` attribute and its style `width` property. The display would correct itself when the user manually changed the value. - A crash would occur when attempting to select the "Label" option after dropping the `s_numbers_charts` snippet. This happened because `s_progress_bar_text` was forgotten during the initial implementation of `s_numbers_charts` [1]. This commit addresses these problems by: - Adding the missing `s_progress_bar_text` to the `s_numbers_charts` template. - Including `s_progress_bar_text` in `_computeSnippetTemplates` to ensure that existing databases also receive this fix, as snippets are stored in the database. - Adding a check in the `progress` option to prevent the aforementioned crash. Steps to reproduce the crash: - Drop the `s_numbers_charts` snippet. - Click on a progress bar within the snippet. - Select the option `Label`. - Hover over "Hide" without any other prior interactions. - A crash will occur. [1]: https://github.com/odoo/odoo/commit/6c94fd66c1db75d74588ce670fb6cf1e960cf8bd
This update strengthens automated checks to ensure the tax disclaimer remains visible for combo products in the online shop. It helps prevent future regressions in price and tax messaging, reducing the risk of customer confusion.
Original PR description
Modifies a test to check the tax disclaimer added by 4ec8d2198a1a0 (and fixed by 3d4027b6ab115) to prevent regression. opw-4454112
This fixes a website form editing issue where some custom property fields could disappear or become unavailable after form settings changed. Business users can keep configuring website forms with all relevant custom fields visible, reducing setup errors and missing form data.
Original PR description
To fix an issue in opw-4794903 where default value may not editable, we are intending to remove data-for values of forms when editing them. This will breaks the possibility to add property fields that was given by 5c08ac23bd4e14cdf12ed67bdd170419bcbb7582 based on the data-for data. In this commit, we are modifying ir.model().get_authorized_fields so it returns all property fields instead of only the one of the current records. opw-4794903 __PR NOTE:__ pull request put back in draft, see comment: https://github.com/odoo/odoo/pull/211083#pullrequestreview-2899441967
Large email marketing campaigns now report progress while processing recipient batches, so the scheduled job is not incorrectly delayed after repeated timeouts. This helps campaigns continue sending at the expected pace instead of being postponed for a day despite normal processing.
Original PR description
# Context : By design the CRON “Mail Marketing: Process queue” handling the email marketing campaigns is expected to time out for large mailing list. By default it tries to generate and commit…
# Context : By design the CRON “Mail Marketing: Process queue” handling the email marketing campaigns is expected to time out for large mailing list. By default it tries to generate and commit batches (default 50) of `mail.mail` records while working through the total list of remaining recipients. See `_action_send_mail_mass_mail` method https://github.com/odoo/odoo/blob/8ff5079b1f5c4df23d56b7f170151408fa7f6f8c/addons/mail/wizard/mail_compose_message.py#L752 In practice, for large mailing lists this will take longer than 15 mins (the default real time limit for CRON jobs) and thus implicitly we expect the worker to time out, re-initiate and continue where it left off. But since Odoo 18, the new refactor of `ir.cron` tries to penalize jobs that time out too often (>3) and don’t report at least a partial progress (`_notify_progress()`). See https://github.com/odoo/odoo/blob/8ff5079b1f5c4df23d56b7f170151408fa7f6f8c/odoo/addons/base/models/ir_cron.py#L361C1-L367C39 While `_process_mass_mailing_queue` does use the notify progress method (https://github.com/odoo/odoo/blob/8ff5079b1f5c4df23d56b7f170151408fa7f6f8c/addons/mass_mailing/models/mailing.py#L1167), it does so at a higher level or granularity (the `mailing.mailing` records in queue). But it will never called as long as the CRON keeps timing out while processing the mails for the remaining recipients (that get committed by batches). Which leads to the CRON being flagged as timing out to many times, and the `nextcall` date of the job being incremented by it’s default value of 1 day. So in practice: - mail marketing starts processing - will time out 3 times after 15 mins (default real time) - new system kicks in and increments the next execution date + 1 day - cron does not run until next day (so no new mail batches created) → artificially low sending rate of the campaign even-though everything is in order # Proposed solution: One could argue that the real unit of work is the committed mail records done in `_action_send_mail_mass_mail`. So we count the processed recipients/mails and call _notify_progress()` before the auto commit (which will be active when the method is called during the CRON). This should ensure that the CRON will not be penalized for timing out too often as long as the recipients are defacto being processed by batches. opw-4633353 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Emails with attachments sent to accounting journal aliases now work correctly when each company uses its own email alias domain and Documents folder. This prevents multi-company errors and ensures attached documents are parsed and linked to the expected accounting entry.
Original PR description
Before this commit ------------------ if a user had a multi-company setup with a different alias domain set for each company, a multi-company error could happen. It happens when sending a mail with…
Before this commit ------------------ if a user had a multi-company setup with a different alias domain set for each company, a multi-company error could happen. It happens when sending a mail with attachment to an accounting journal alias. The exact conditions required to enable the option to centralise all attachments in Documents for the journal in question. steps to reproduce: 1. clean DB with documents_account installed 2. create a 2nd company "company 2" 3. create an alias domain for company 1 "alias.company1.com" and another alias domain for company 2 "alias.company2.com" 4. in documents, create a "finance" folder for company 1 (i.e. set the company_id field on the folder) and another folder for company 2 5. configure the settings for both companies so that all attachments are centralized in documents for accounting, in the respective folder for that company 6. create an alias for some journals in company 2 (e.g. vendor-bills@alias.company2.com) 7. send an email with attachment to that alias -> you will get a multi-company error After this commit ------------------ Sending a mail with attachment to an accounting journal alias creates the account_move as expected. The attachment is parsed as expected. opw-4727873 opw-4655559 opw-4746321 opw-4766895
A new automated check verifies that website rental periods are calculated correctly from selected dates. This helps prevent customers from seeing or being charged for the wrong rental duration, such as a two-day rental being counted incorrectly.
Original PR description
Adds a tour that ensure date-based rental durations are set correctly, i.e. renting from 2025-01-01 to 2025-01-02 should result in a rental period of 2 days. This should prevent commits like 574e111 (reverted by 5982e11) from introducing faulty logic.
This fix makes the Web Studio report editor test flow wait until the page is ready before checking results. It reduces random test failures, helping keep development and release validation more stable.
Original PR description
when clicking the next button in the pager of the tour, it was causing issues with the report editor not being ready yet with the updated page. so added a delay after clicking n next button in the pager of the tour to avoid issues with the report editor not being ready with the updated page. build_error-163405