Monday, September 15, 2025
26 changes · 19.0
Resolved issues and error corrections
The wishlist and product comparison features are now installed automatically when needed, helping ensure they are available on the online store without extra setup. This fixes availability issues on the storefront while reducing manual configuration steps.
Original PR description
Enable auto-install for `website_sale_wishlist` and `website_sale_comparison` These modules are now set to auto-install to ensure their proper availability on the frontend. This change removes the need for explicit fields while still preventing the unintended limitations observed after [task](https://www.odoo.com/odoo/action-4043/4819667). **Affected Version**:19.0~master opw-5078748
Test code was updated to use the shared web test helpers instead of reaching into internal framework folders. This is an internal cleanup that makes tests easier to maintain and reduces the risk of future test breakage, with no expected impact on end users.
Original PR description
This commit reduces imports to the 'tests/_framework/' subfolder, which is meant to be accessed through the 'web_test_helpers' module as to reduce the amount of imports, as well as centralizing all web helpers to have a quick overview of the available helpers. Community: https://github.com/odoo/odoo/pull/225865 Forward-Port-Of: odoo/enterprise#94131 Forward-Port-Of: odoo/enterprise#94074
This update improves Odoo's internal unit testing tools so automated checks run faster, display failures more clearly, and clean up test data more reliably. The changes are limited to the testing ecosystem, reducing risk to normal business workflows while helping developers catch issues sooner.
Original PR description
## Pull Request HOOT (PRHOOT) 36 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Enterprise: https://github.com/odoo/enterprise/pull/93167 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226406 Forward-Port-Of: odoo/odoo#221367
This update makes the website snippet selection modal clearer and more consistent. It removes misleading parallax preview behavior, refreshes an outdated product preview image, and labels product-related dynamic snippets so users can better distinguish them from static content blocks.
Original PR description
This pr address minor UX issues for the snippets modal. - Disable the parallax effect for both `s_banner_product` and `s_floating_blocks` snippets: despite these make technically use of the parallax…
This pr address minor UX issues for the snippets modal. - Disable the parallax effect for both `s_banner_product` and `s_floating_blocks` snippets: despite these make technically use of the parallax feature, the effect is really subtle and not as strong as the one used by the preview. - Update one old `s_dynamic_snippet_products` preview image - Add the "Dynamic Content" label for both the `s_dynamic_snippet_products` and `s_dynamic_snippet_category_list` snippets. The goal is to differentiate the two from the static ones in the same category. A similar solution should be used for other dynamic snippets, like blog and events... but since everything in those categories is dynamic, the use of the same label would have been noisy and unnecessary. task-5088157 | 19.0 | this pr | |--------|--------| | <img width="445" height="243" alt="image" src="https://github.com/user-attachments/assets/98cadb04-f8cb-4b44-ad3f-6a8ff18ea05b" /> | <img width="444" height="243" alt="image" src="https://github.com/user-attachments/assets/7f7f471a-a11d-4131-9bd6-f8d7954eb1ca" /> | | <img width="441" height="260" alt="image" src="https://github.com/user-attachments/assets/c31a36d7-3c57-434a-b999-1bdb00430b63" /> | <img width="438" height="259" alt="image" src="https://github.com/user-attachments/assets/a124d022-0763-47c4-a72c-a9a992b83a8c" /> | | <img width="444" height="208" alt="image" src="https://github.com/user-attachments/assets/076c3b8e-ee89-470e-a780-93c657979273" /> | <img width="458" height="215" alt="image" src="https://github.com/user-attachments/assets/eca7e514-c947-4ce7-bb37-feae0377b229" />| | <img width="445" height="241" alt="image" src="https://github.com/user-attachments/assets/967c7093-7c20-4912-ab80-072059fa2124" /> | <img width="445" height="246" alt="image" src="https://github.com/user-attachments/assets/d6522f0d-c36e-4627-9d2e-145e1ecb61ff" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix updates the translation configuration to match a recently renamed disallowed expenses module. It helps ensure translations continue to be tracked and maintained correctly after the rename, with no expected impact on everyday users.
Original PR description
The modules have been renamed in https://github.com/odoo/enterprise/commit/31b5e33b0035c37d53f011f362bab739440e0271 but the weblate hasn't been changed.
This update keeps Odoo's email server checks aligned with a newer message returned by the underlying email testing tool. It helps prevent false test failures during maintenance without changing day-to-day user behavior.
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 Forward-Port-Of: odoo/odoo#226489
This fixes an issue where the Point of Sale could show an error if no user was available for the cashier lookup. The system now safely returns no cashier instead of failing, helping avoid interruptions during POS use.
Original PR description
When there is no user, you get a traceback when it tries to access user.id. As the code that call getCashierUserId handles the fact that a falsy value is returned, we return undefiened when there is no user. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226821
Appointment quick creation now correctly calculates the end time even when the duration field is not shown. This prevents incomplete or incorrect appointment times when users create calendar events from the streamlined appointment view.
Original PR description
In [1] we remove the field "duration" from the calendar quick create view in appointment. `default_get` relies on "duration" being in the default values to compute the "stop" based on it. Since the field is not in the view this does not work anymore. Now always ask for that field in `default_get` and just remove it if it was not requested. [1]: c8eb4fe4ba9938b1c7e07034e6ca7c08a0d6f215 task-5081903
This fix ensures Uruguayan electronic documents correctly read document numbers that start with more than one letter. This helps avoid incorrect processing or validation issues for affected invoices, credit notes, and debit notes.
Original PR description
If UY EDI document has latam document number with more than one letter at the beggining, it is needed to take in consideration all the letters and not only the first one. Task Latam side: 1352 Task Adhoc side: 53173 Forward-Port-Of: odoo/enterprise#90696
A Turkish payroll employee field is now only visible to HR users. This prevents non-HR staff from encountering an access error when employee records are read, improving reliability for internal users.
Original PR description
The test `test_employee_fields_groups` crashed with: `AccessError: The fields “l10n_tr_is_net_to_gross”, which you are trying to read, are not available for employee public profiles.` This field exist without HR group restriction as a result, a non-HR internal user calling .read([]) triggered the AccessError. This commit adds `groups="hr.group_hr_user"` to this field so it is only accessible to HR users, resolving the error. [RB-231736](https://runbot.odoo.com/odoo/error/231736)
On small screens, selecting an item from the user menu now closes the main menu before opening the chosen action. This prevents dialogs such as Preferences from appearing hidden behind the menu, making mobile navigation clearer and less confusing.
Original PR description
This commit ensures the BurgerMenu is closed when clicking on one of its items, and specifically on one of the BurgerUserMenu items. Steps to reproduce (on small screen): - on a "base" database (no app installed) - click on the BurgerMenu (top right) - click on "Preferences" => the user's preference dialog opens behind the BurgerMenu Forward-Port-Of: odoo/odoo#226739 Forward-Port-Of: odoo/odoo#225696
Planning calendar files now keep the correct start and end times when a planning slot has no assigned employee. This prevents calendar invitations from showing shifted hours in setups without demo data or employee-specific time zones.
Original PR description
The test `test_planning_ics_file_without_assigned_employee` failed when running without demo data because the slot timezone was `Europe/Brussels` while the employee timezone was `UTC`.
The previous code in the method `ics_datetime()` converted to the slot timezone and then relabeled it as the employee timezone with `.replace(tzinfo=...)`, which shifted the actual instant.
This change ensures that ICS datetimes are always converted using astimezone to a single target tz:
- employee tz if the slot is assigned,
- otherwise the current user tz or `UTC` as fallback.
The test was also updated to assert the correct fallback `UTC` values:
`DTSTART:20230602T080000Z`
`DTEND:20230602T170000Z`
[runbot-231213](https://runbot.odoo.com/odoo/error/231213)
Forward-Port-Of: odoo/enterprise#93692Event searches now include descriptions consistently, so events shown as suggestions also appear after pressing Enter. This prevents users from losing relevant event results when the search term appears only in the event description.
Original PR description
Purpose ======= Making sure that, when typing a search term, all the results displayed in the search bar dropdown are visible on the page when clicking Enter. Specification ============= Previously, the search bar dropdown was displaying all the events where the name or description matched the search term. However, when clicking Enter, only the events where the name matched were displayed on the page (the ones where only the description matched were ignored). Fixing the issue by considering the description in the event search options. Task-5039221 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#224414
The bank reconciliation screen no longer shows an extra line above its action buttons. This makes the button area clearer and easier to read for accounting users.
Original PR description
During this commit: https://github.com/odoo/enterprise/commit/f9725d7b01cbd1235f022821a6861adb2955e49e we added a line above the buttons, but we lost some clarity, so this commit will remove it task-5082695
The color picker now shows the selected color more clearly when using dark mode. This makes the interface easier to read and avoids confusion when choosing colors across light and dark themes.
Original PR description
This PR fixes an issue related to Commit[^1], which used `#fff` to style the active color within the color picker. While this works fine in light mode as we do not tweak the `$o-colors` map that much, it does not provide good results in dark mode as the colors are drastically adjusted. | 19.0 and above | This PR | |--------|--------| | <img width="192" height="89" alt="image" src="https://github.com/user-attachments/assets/c4eadd42-fbe4-4b34-85ad-2010103850a7" /> | <img width="153" height="102" alt="image" src="https://github.com/user-attachments/assets/0dcba0fa-69bc-48de-9c96-bcdf69ea7f1f" /> | With this PR, we use a dynamic value instead of a static one, ensuring it will provide good results in both light and dark mode. task-5089121 related to task-5049476 [^1]: 1aa9b957afdd1413f6241ce2e408b96f9e934242 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The spreadsheet interface is now kept in light mode because it does not yet support dark mode consistently. This prevents mixed light and dark styling, giving users a clearer and more consistent spreadsheet experience.
Original PR description
Spreadsheet doesn't support dark theme. This fixes some style where dark and light themes are mixed. Task: 5082593 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#226798
The Swiss payroll process has been corrected so payrun actions work as expected. This prevents interruptions when payroll teams manage pay runs for Switzerland.
Original PR description
Parameter was not added to the overriden method in switzerland
Primary buttons now show a clearer visual difference when users hover over them versus actively press them. This reduces confusion and makes button interactions feel more consistent across Odoo.
Original PR description
This PR introduces a clear visual distinction between the `:hover` and `:active` state of our primary buttons. | 19.0 and below | This PR | |--------|--------| | <img width="129" height="45" alt="image" src="https://github.com/user-attachments/assets/204b0c4e-622c-467e-8394-750cc79ee6e4" /> | <img width="135" height="52" alt="image" src="https://github.com/user-attachments/assets/096a5c34-56b2-41d8-9d9e-d6b9195b17d5" /> | Prior to this PR, the active state was using a `darken()`, which was similar to the approach in use for the `:hover` effect, which could result in a confusing behaviour for users. With this PR, we now align the behaviour of our buttons `:active` state across all the bundles. task-5087169 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Malaysia localization tests now specify the expected tax when creating invoices for XML file generation and submissions. This helps prevent unreliable test results and improves confidence that Malaysian electronic invoicing outputs remain correct.
Original PR description
Improve reliability of both malaysian modules which work with xml files and invoices by ensuring that we precise the tax we expect to see in the file when creating the invoice. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update repairs an automated website shop checkout test after recent checkout page changes. It helps ensure the online purchasing flow continues to be tested reliably, reducing the chance of future checkout regressions reaching users.
Event emails now use embedded images instead of website icon classes for location icons. This ensures recipients see the intended event location information in emails and avoids issues when editing the email template.
Original PR description
Font awesome classes must no be inserted into email as external servers do not use them so icons are not displayed and also because some issues occur with the email editor. This commit replaces i tags with font awesome classes in mail by images. Task-5082165 Forward-Port-Of: odoo/odoo#226332
German DATEV exports now correctly identify the required main account when a point-of-sale session contains both sales and refunds with different tax rates. This prevents missing accounting information in affected journal entries and helps keep German reporting exports complete.
Original PR description
In _get_datev_account, the l10n_de_datev_main_account_id is determined by identifying a singular debit or credit account used in the journal entry. If there’s no unique account, it falls back to…
In _get_datev_account, the l10n_de_datev_main_account_id is determined by identifying a singular debit or credit account used in the journal entry. If there’s no unique account, it falls back to searching for a unique non-tax line among debit or credit lines. In POS, however, there is the possibility of generating journal entries that break this flow: - In a single POS session, add product A with tax 19% and product B with tax 7%. - In the same session, refund product A. - Close the session to generate the entries. In the resulting entry, since both sale and refund are present, it is not possible to discriminate using debit and credit amounts alone, and as a result, the field l10n_de_datev_main_account_id is not populated. Since account 1411 is always the one to be used for l10n_de_datev_main_account_id in this specific case, this commit adds a final fallback filter to select the correct line and ensure the field is populated. Ticket [link](https://www.odoo.com/odoo/project/967/tasks/4915272) opw-4915272 Forward-Port-Of: odoo/enterprise#92664
The Discuss app no longer shows the compact chat hub when there are no separate chat conversations to display. This removes a redundant interface element and keeps the messaging screen cleaner for users.
Original PR description
Before this commit, chat hub compact was visible in disucss app. This happens because while chat windows and bubbles are conditioned to not be shown in discuss app (with exceptions), the compact mode…
Before this commit, chat hub compact was visible in disucss app. This happens because while chat windows and bubbles are conditioned to not be shown in discuss app (with exceptions), the compact mode of chat hub was solely relying on compact mode on/off, ignoring the overall condition for whether some conversations are shown in chat hub (note: conversations in compact are still considered as "shown"). This commit adds extra condition on showing compact button to take into account chat hub showing some conversations. If no conversations are shown, then the compact mode should not be shown at all. Discuss app prevents showing of conversations in chat hub (with exceptions), as this is redundant with discuss app itself. Task-5058838 Before <img width="470" height="195" alt="Screenshot 2025-09-15 at 12 13 40" src="https://github.com/user-attachments/assets/f6e8ea32-7def-4654-858f-5d39fbcc97c1" /> After <img width="490" height="232" alt="Screenshot 2025-09-15 at 12 13 20" src="https://github.com/user-attachments/assets/bc9feb62-6d84-4d73-8e10-674ab4260032" />
The Mail app now shows or hides the model field more appropriately when configuring activity types, especially from app settings. It also removes an unnecessary warning, making setup clearer for administrators without affecting existing activities.
Original PR description
Simplify model usage in form view: do not display it if a default value is given in context (aka in apps settings). Generic view, available for admins, correctly display the model field without having to use the technical group. Remove the warning about model change since * plans are protected through a constraint * you cannot change generic types model (Meeting, ...) * changing the model of other types does not break already-created activities (just that it is not available for new activities in the old model); Task-5088991
Opening a spreadsheet step on the shop floor now works without displaying an unexpected error. This prevents confusion for manufacturing operators while keeping the spreadsheet step behavior unchanged.
Original PR description
To reproduce: - Make a new BOM for new product P, with 1 operation on assembly line 1 - Add a spreadsheet step to the operation - Make a MO for 1x P - Open shop floor, assembly line 1, click on the spreadsheet step Current behaviour: - The spreadsheet step opens correctly, but we get a traceback Expected behaviour: - The spreadsheet step opens correctly, no traceback task-4965313 Forward-Port-Of: odoo/enterprise#91505
Opening and saving the Optimize SEO dialog no longer accidentally removes image descriptions that were added in the editor. This protects accessibility text and avoids users having to re-enter image descriptions after routine SEO checks.
Original PR description
Steps to reproduce: 1. Open Optimize SEO. 2. Mark an image as decorative. 3. Save it. 3. Give a description(ALT) to that image from editor. 4. Open Optimize SEO again and save without doing anything. Issue: The description(ALT) on the image being set is lost. Cause: When reopening the **Optimize SEO** dialog, `seoContext.updatedAlts` still contained entries from previous edits. As a result, saving without making any change triggered an call to `update_alt_images` which reset the `alt` attribute to empty, eventually discarding the description. This PR ensures `seoContext.updatedAlts` is reset when opening the dialog. Forward-Port-Of: odoo/odoo#226913