Friday, April 24, 2026
26 changes · 19.0
New functionality added to Odoo
This update adds a user profile signature command to the Odoo editor, allowing users to easily include their signature in documents. This change simplifies the process of adding professional signatures and aligns with user preferences. The update refactors the signature plugin to improve modularity and reduce dependencies.
Original PR description
*=[accountant_knowledge, knowledge, sign] Purpose of this PR: - Add a new Signature command to insert the user's profile signature defined in user preferences. This is handled by UserSignaturePlugin and and is part of the main editor plugins. - Keep the existing Signature plugin restricted to Email Marketing & Knowledge. task-6127297
Resolved issues and error corrections
This fixes an internal testing issue where retrying certain cross-module tests could lose the information about what needed to be tested. It helps keep automated test results reliable and prevents valid tests from being skipped or rerun incorrectly.
Original PR description
Regenerating the test instance on retry works in most cases but fails when the test instance contains relevant data about what to test, which is the case for cross module tests and test params. Combined with an error while disabling autoretry this caused the hoot test to retry with an empty list. Fixing the issue by setting the relevant flags. This is a quick fix to reenable the test but a more robust solution would be to make sure ALL test instance existing attributes are properly copied before starting the test, or forbidding to set them on the instance before running them.
Website editors can now keep using the Round Corners setting even when a block has no visible border. This fixes an editor usability issue and lets users apply rounded styling independently from border width.
Original PR description
Steps to reproduce: - Open the website editor. - Select a block with the border configurator and round corners enabled. - Set the border width to 0 px. => The Round Corners option is hidden. Before this commit, the change introduced by [1] hid the option when no border was set. This restriction was not needed because a block can use a border radius without a visible border. After this commit, the option remains visible when round corners are supported, even without a border. [1]: 97e8cc8d664e66ba62e8282a67f069805682ae41 task-6089515
Point of Sale Z reports generated for a date range now avoid showing a single closed session name when the report also includes orders from open sessions. This prevents misleading report headers and helps users understand that the figures cover multiple sessions.
Original PR description
Before this commit: - When generating a Z report via date range (config_ids, no session_ids), the header's session name was derived from the closed-session if there was exactly one, which excludes open sessions (stop_at IS NULL). - If an open session had completed orders (state='done') within the date range, those orders were included in the report body while the session itself was absent from the sessions list. - This caused the header to display the closed session's name and title the report as a single-session Z report, even though it contained data from multiple sessions. opw-6123054 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The leave management error shown when a contract schedule change affects existing leave durations now includes more diagnostic detail. This helps support teams understand why the employee may no longer have enough allocated leave and resolve the issue faster.
Original PR description
A validation error is raised if changing employee's contract with a new working schedule on a period with leaves and the new working schedule changes the duration of these leaves in such a way that the employee no longer has the required allocation for them. This adds to the error message the original error traceback for debuggig purposes. Task: 6105516
This fix ensures that when users cancel a confirmation prompt in spreadsheets, the related cancel action is properly carried out. It prevents workflows from continuing as if no cancellation happened, making spreadsheet interactions more predictable.
Original PR description
The `cancel` callback of the `env.askConfirmation` method was not called when the user clicked on the cancel button. task-6074948 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#260061
Odoo now checks custom related fields against the actual field behavior used by the system, rather than relying on a narrower storage-based rule. This prevents valid custom fields from being incorrectly blocked while still keeping invalid field paths from being used, and avoids disrupting upgrades while the system is still loading.
Original PR description
Following up on #259309. A field must be searchable to be used in the related path. To know it, we must go into the instantiated field on the model to read that property, as being stored is not necessary. This mixes two different levels of abstraction but is necessary to have more consistent behaviour and not to block valid related field going through searchable fields. We also do this check only when the registry is ready to avoid blocking upgrades. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260585
This update adjusts the Mail attachment thumbnail layout so icon placement can be corrected consistently in related views. It helps prepare a visual fix that improves how attachment previews appear to users.
Original PR description
We modify the base layout to allow a fix of the icon position in an override. Task-5152517
This commit adds missing Arabic translation to the term "Simplified Tax Invoice". opw-6031861
Original PR description
This commit adds missing Arabic translation to the term "Simplified Tax Invoice". opw-6031861
When an employee's department is changed, Odoo now correctly adds their user account to any Discuss channels that automatically subscribe that department. This prevents employees from missing department-related communications after their HR record is updated.
Original PR description
**Steps to reproduce:** navigate to 'Discuss' > 'Channels' create a new channel and set 'Auto Subscribe Departments' to 'Administration' create a new user and a corresponding employee record go to 'Employees' > locate the employee set the employee's department to 'Administration' **Current behavior before PR:** The user is not automatically added to the channel. This occurs because the auto-subscription logic is triggered before the department change is committed to the database. **Desired behavior after PR is merged:** The user is correctly auto-subscribed to the channel once the department update is saved. task-5448649 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#241617
The recruitment refusal wizard now shows the rendered email body for a single applicant, so users can preview the same personalized content that will be sent. For multi-applicant refusals, placeholders remain because each applicant may receive different values.
Original PR description
Issue: ---------------------------------------- The `applicant.get.refuse.reason` wizard displays the mail body with the placeholders, not the values actually sent. Steps to reproduce: ---------------------------------------- - Open Recruitments and go to an applicant form view - Click "Refuse" - Select the template "Job already fulfilled" - The subject and the mail body have placeholder values Cause: ---------------------------------------- We don't render the body for the wizard, only when we send the mails. Solution: ---------------------------------------- Render the body when we get it from the template. This only works if `applicant_ids` have one value. Otherwise, we display the placeholders because the values can be different from an applicant to another. opw-6082883 Forward-Port-Of: odoo/odoo#258874
This fix ensures that when users select multiple images in the media dialog, eligible images are correctly optimized to WebP format even after a protected external image is selected. This helps keep website pages lighter and faster without requiring extra user action.
Original PR description
Since [1], when users select multiple images through the media dialog, subsequent images of a CORS protected image are not converted to webp. This commit fixes that issue. Related to task-5405262 [1]: https://github.com/odoo/odoo/commit/422b073bcc6406c76339a1ccaa0c40dc3f42801c Forward-Port-Of: odoo/odoo#261055
Fixes a problem in Recruitment where assigning a recruiter from the kanban view could fail for job positions without a recruiter. The avatar shown in the short-lived dropdown no longer uses unavailable cache data, so users can assign recruiters normally.
Original PR description
**Steps to Reproduce:** 1. Open Recruitments 2. Find a job position without a recruiter in the kanban view. 3. Clicking on the assign recruiter widget produces a traceback. **Bug Cause:** The…
**Steps to Reproduce:** 1. Open Recruitments 2. Find a job position without a recruiter in the kanban view. 3. Clicking on the assign recruiter widget produces a traceback. **Bug Cause:** The ?unique= cache related parameter was added to the avatar image URL in the autoCompleteItem slot of KanbanMany2OneAvatarEmployeeField. This parameter relies on write_date being available on the autocomplete suggestion record. However, web_name_search only returns id and display_name, so write_date is undefined on autocomplete suggestion records, causing a crash when accessing autoCompleteItemScope.record.data.write_date.ts. **Bug Solution:** Remove the ?unique= parameter from the avatar image URL in the autoCompleteItem slot, reverting it to its original form. Cache is unnecessary for autocomplete suggestion avatars as they are only visible for the duration of the dropdown interaction. **Task:** 6092768 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an Events issue where opening a ticket link from an email could show an error if the related attendee had already been deleted. The system now handles the missing attendee gracefully instead of crashing, improving reliability for event communications.
Original PR description
Currently, an error occurs when accessing the ticket link after the related attendee has been deleted. **Steps to Reproduce:** - Install the **Events** module. - Create a new event. - Create an attendee with a valid email ID. - Make sure the email is sent successfully. - Delete the attendee for the event. - From the received email, try to click on the **"View Tickets"** link. **Error:** `IndexError - tuple index out of range` **Cause:** The controller filters registrations using the provided `registration_ids`, but when the attendee is deleted, the resulting recordset becomes empty. It raises an error when trying to access the first element of an empty recordset. **Fix:** This commit handles empty recordsets by returning early when no registrations are found. sentry-7357927405 Forward-Port-Of: odoo/odoo#256310
Replacing a styled image with an icon in the HTML editor now removes image-only styling such as rounded corners, shadows, or thumbnails. This prevents icons from inheriting inappropriate image effects, keeping edited content visually consistent.
Original PR description
### Steps to Reproduce: - Go to the To-do app and create a new task. - Upload an image. - Apply shape styling to the image (e.g., rounded, shadow, img-thumbnail). - Replace the image with an icon. ### Description of the issue/feature this PR addresses: - When an image had shape applied (such as rounded, rounded-circle, shadow, or img-thumbnail) and was replaced with an icon, those classes were carried over to the icon. ### Desired behavior after PR is merged: - Since these classes are specific to image shape styling, they are now removed when an image is replaced with an icon. task-6007631 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#259459 Forward-Port-Of: odoo/odoo#258060
This fix prevents two tooltip popups from appearing at the same time when users hover over certain read-only linked fields in lists. It makes the interface cleaner and avoids confusion in areas such as event communication reminders.
Original PR description
…oltip How to reproduce: go on an event in communication tab. You will see two tooltips on communication reminders (see task for more details and picture). When hovering a readonly many2one/reference field in a list, two tooltips appeared simultaneously: a native browser tooltip from the `title` attribute on the inner `<span>` (set by `web.Many2One`), and the Odoo custom tooltip from the `data-tooltip` attribute on the parent `<td>` (set by the list renderer for many2one/reference/char fields). Issue come from Odoo management of nested titles, especially when having both data-tooltips and title. For stable, a local solution is to limit usage of title and use better-managed tooltips for many2one. Task-6147434
This fix updates how Odoo determines whether an invoice was sent through Peppol after new Peppol response statuses were introduced. It helps prevent incorrect sending decisions now and makes the process more reliable as additional Peppol response types are supported later.
Original PR description
With the addition of new peppol_move_state for the Application Responses in Peppol, some checks to know wether the move was sent through Peppol were not updated. This commit does that by adding a common field for it. This is usefull as we might add some extra peppol_move_state values in the near future (Peppol supports more response types than we currently offer to our users). Forward-Port-Of: odoo/odoo#258598
Fixed an issue where website menu items with spaces and no starting slash could keep sending visitors to a 404 page after creating the intended page. This makes page creation from broken menu links more reliable and helps site editors avoid unresolved navigation links.
Original PR description
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a…
When a menu item URL contains a space and has no leading slash (e.g., "some url"), creating a page from its 404 screen does not link the menu to the newly created page. The menu keeps pointing to a 404. **Steps to reproduce:** 1. Create a menu item with a URL containing spaces and no leading slash (e.g., "some url") 2. Click the menu item -> a 404 page is displayed (expected) 3. Click "Create Page" 5. Choose any template -> the page is created and saved 4. Click the menu item again -> it still returns a 404 (unexpected) **Issue:** During page creation, the path is slugified (e.g., "some url" -> "/some-url"). The controller then tries to link the menu to the new page by setting `page_id`. However, `pagenew()` only searches for menu URLs with a leading slash, so a menu saved as "some url" is not found when searching for "/some url". As a result, `page_id` is never set, and `_clean_url()` keeps resolving the menu to "/some url" instead of the page's actual URL "/some-url". Menus without spaces (e.g., "mypage") have the same issue where `page_id` is not set, but since `_clean_url()` prepends "/" and renders "/mypage", which matches the new page URL, the menu still resolves correctly. **Fix:** Match both URL formats (with and without leading slash) when linking a menu to a newly created page. task-[5095646](https://www.odoo.com/odoo/project/974/tasks/5095646) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#260726 Forward-Port-Of: odoo/odoo#248967
This fix stops website video placeholders without a saved video link from causing page errors. Existing videos with valid links continue to work as before, while empty placeholders remain visible instead of breaking the page.
Original PR description
Commit[^1] reworked the `s_video` snippet placeholder into a plain SVG, dropping the inner `<iframe>` and the `data-oe-expression` attribute that carried the video URL. The `.media_iframe_video` class was kept, so the `MediaVideo` interaction still binds to the placeholder and calls `generateVideoIframe`, which then reads `dataset.oeExpression || dataset.src` (undefined) and crashes on `.match()`. The same crash hits the `DOMContentLoaded` fallback on the frontend for any saved page that ends up with a `src-less` placeholder. To prevent the issue, we exit the interaction early if no `src` is saved and leave the existing children in place. Nothing changes if the video has a valid URL already. [^1]: https://github.com/odoo/odoo/commit/db91ddd861b13694fe0e0b8d9cce23e02f487a6a task-6158263 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where the namespace for DIAN credit notes was incorrectly configured, causing errors when submitting to the DIAN tax authority. The fix ensures the correct namespace is applied to the top-level node of the credit note, resolving compatibility problems and streamlining the process for Colombian companies. This was a recurring issue addressed with updated testing.
Original PR description
Issue: Incorrect `sts` namespace raises several issues when sent to dian Steps to reproduce: - On a Colombian company - Create a credit note - Send to DIAN Current Behavior: - Credit note have `sts` namespace defined to `dian:gov:co:facturaelectronica:Structures-2-1` while their Extension node has another `sts` namespace to `http://www.dian.gov.co/contratos/facturaelectronica/v1/Structures` Expected Behavior: - Only the top level Node should have `sts` namespace defined to `dian:gov:co:facturaelectronica:Structures-2-1`. It was forgotten that Credit Note were part of the Invoices in the last refactor. As it's the second time(odoo/enterprise#68619 3rd commit) it happens, I updated the test. opw-6077050 Forward-Port-Of: odoo/enterprise#114003 Forward-Port-Of: odoo/enterprise#113643
This update ensures that Odoo's accounting reports for Ecuador accurately reflect the latest withholding tax regulations (Resolución N.º NAC-DGERCGC26-00000009) as outlined by TRESCLOUD. The changes involve updating test cases to align with the new 2026 withholding percentages, guaranteeing accurate reporting.
Original PR description
In accordance with the implementation of the new withholding tax percentages according to "Resolución N.º NAC-DGERCGC26-00000009" for Ecuador, following internal implementation guidelines by TRESCLOUD. Unit tests are updated to be based on the new withholding percentages. BP #110343 Forward-Port-Of: odoo/enterprise#112899 Forward-Port-Of: odoo/enterprise#110712
This update ensures that the VIES summary reports generated for Czech companies include only the numeric VAT number, as required by official regulations. Previously, the reports incorrectly included the country code ('CZ'), which could cause issues with data processing. This change ensures accurate reporting and compliance.
Original PR description
**Steps to reproduce:** - Install the `l10n_cz_reports` module and switch to a `CZ Company` - Create an invoice for a customer with a VAT number, add a product, and set the Transaction Code (enable…
**Steps to reproduce:** - Install the `l10n_cz_reports` module and switch to a `CZ Company` - Create an invoice for a customer with a VAT number, add a product, and set the Transaction Code (enable it from the optional columns if needed). - Navigate to Reporting > VIES Summary Report. - Observe the value in the `VAT Number` column (includes country code). - From the dropdown, export the report as XML. **Observation:** In the generated XML file, the `c_vat` field contains the VAT number including the country code (e.g., `CZ12345679`) instead of only the numeric part (`12345679`). **Root cause:** At [1], the VAT number is directly taken from the report lines without removing the country code. **Fix:** This commit ensures that the `c_vat` field contains only the VAT number without the country code, complying with the official VIES XML format requirements. Ref: https://adisspr.mfcr.cz/dpr/adis/idpr_pub/epo2_info/popis_struktury_detail.faces?zkratka=DPHSHV#:~:text=Tax%20identification%20number%20of%20the%20purchaser%20(only%20the%20numeric%20part) [1]: https://github.com/odoo/enterprise/blob/c4f2c3442f30f5ac972dd136a3642acc5bcc6da2/l10n_cz_reports_2025/models/l10n_cz_vies_summary_handler.py#L29-L62 opw-6093259 Forward-Port-Of: odoo/enterprise#114730 Forward-Port-Of: odoo/enterprise#113083
This update resolves an issue where the 'cancel' button within the spreadsheet functionality didn't properly trigger the cancellation process. The fix ensures that clicking the cancel button now correctly removes the user's changes and returns them to the previous state. This improves the user experience and data integrity.
Original PR description
The `cancel` callback of the `env.askConfirmation` method was not called when the user clicked on the cancel button. task-6074948 Forward-Port-Of: odoo/enterprise#112987 Forward-Port-Of: odoo/enterprise#112304
This pull request addresses several minor bugs in the Documents module, enhancing the user experience. Specifically, it fixes issues with scrolling after file uploads, the placement of the trash icon in thumbnails, and a layout problem with the 'You' badge when user names are long. These changes ensure consistent and reliable functionality for users.
Original PR description
[FIX] documents: scroll to uploaded record How to reproduce: - install documents - open the "All" folder and ensure there is enough folder to not see any file - open the detail panel - drag&drop file…
[FIX] documents: scroll to uploaded record How to reproduce: - install documents - open the "All" folder and ensure there is enough folder to not see any file - open the detail panel - drag&drop file in that folder The file is uploaded, but you have to scroll to it to see it. Moreover, despite the file being selected, it's not shown the detail panel. We solve the problem here by waiting the record to be rendered before scrolling to it and notify the detail panel. [FIX] documents: fix icon position in thumbnail How to reproduce: - install documents - open the chatter of a document - click on log a note, and upload a file The "trash" icon/button in the thumbnail is weirdly positioned (neither centered, neither on a border). We fix here the position the icon/button. [FIX] documents: fix "you" badge layout How to reproduce: - install documents - change the name of Mitchell Admin to a very long name - open the share panel owned by Mitchell Admin The "You" badge is not correctly displayed (the badge appears as "Y..." instead of "You" and the shape is not correct). We fix here the layout of the badge in such configuration. Task-5152517
The company logo on the journal report PDF was appearing too large, obscuring the report content. This fix adjusts the logo's maximum height specifically for the journal report PDF, ensuring a properly formatted and readable report. This improves the user experience for generating and viewing financial reports.
Original PR description
Steps to reproduce: ------------------- 1. Upload a logo on the company (Settings > Companies) 2. Go to Accounting > Review > Control > Journal Audit 3. Select a period having journal entries 4.…
Steps to reproduce:
-------------------
1. Upload a logo on the company (Settings > Companies)
2. Go to Accounting > Review > Control > Journal Audit
3. Select a period having journal entries
4. Export the PDF
-> The company logo appears huge, taking almost the entire cover page, which shrinks the report content and makes it hard to read.
Why the bug
-----------
In e8d2084369d the logo was added to the `company_information` template with a global css rule `.o_company_logo { max-height: 4rem }`, so the size was correct on every pdf using this template, including the journal report pdf.
Later, 684f741120e scoped that rule under `.o_content`. From that point, the rule only applies when the pdf wrapper has the `o_content` class, which is not the case for the journal report, which wraps its content with `journal_report_pdf` instead.
The fix
-------
Add the same max-height rule directly under `.journal_report_pdf`. That way, we keep the changes minimal and well targeted for the journal report, to not risk breaking any other styles.
opw-6102598This update fixes an issue where the 'Total' line was missing from printed Trial Balance reports when 'Hide lines at 0' was enabled. The change ensures that all report-level totals, including the root total, are consistently printed, improving report accuracy and usability.
Original PR description
When "Hide lines at 0" is enabled, printing e.g. the Trial Balance will drop the report-level "Total" line when printing. This commit fixes that. The issue was introduced in this commit[^1], which didn't consider total lines without a parent (i.e. root total lines). [^1]: https://github.com/odoo/enterprise/commit/7fec18b99eb2aa5ebc357dcad5f95f234db5b7d8 Forward-Port-Of: odoo/enterprise#114084