Friday, August 28, 2026
40 changes · master
Enhancements to existing features
Priority fields in list views now show only the selected stars by default, reducing visual clutter for records with low or no priority. Users can still see the full priority scale by hovering over the field, keeping the interface cleaner without removing context.
Original PR description
Before this change, priorities in list views always displayed all stars, including empty ones. Records with low or no priority showed multiple empty stars, creating unnecessary visual clutter. After this change, only filled stars are displayed by default. Records with no priority show a single empty star, and hovering over the priority field reveals the complete set of stars. task-6365816 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Accounting dashboard KPI cards now display at consistent sizes on tablet and desktop screens. This makes the dashboard easier to read and prevents cards from stretching awkwardly when the layout wraps.
Original PR description
Currently, the KPIs wrap around for tablets and don't render correctly This commit makes them render with the same size. It also stops cards from growing when they wrap on desktop screens. No task ID
The mail test helper now re-checks pending conditions every 500 milliseconds instead of waiting until a long timeout when certain screen changes are not detected. This reduces avoidable waiting in the mail test suite and helps developers get faster validation without changing customer-facing behavior.
Original PR description
Before this commit, a contains that does not match right away runs again only when its MutationObserver fires, and once more at the 10 seconds timeout. The problem is that the observer reports neither a text node updated in place nor an input value or checked property, so a check waiting for one of those sleeps 10 seconds and then passes: "Delete starred message decrements starred counter once" spends 10.2s of the 183s @mail suite waiting for a counter to go from "Starred3" to "Starred2". This commit turns that single timeout into a 500ms tick up to the same deadline, so that such a check costs 500ms. The tick uses the unmocked timer to stay out of the timer graph a test drives with runAllTimers, and only 32 of the suite's 4239 contains calls stay pending long enough to tick once. Forward-Port-Of: odoo/odoo#285129 Forward-Port-Of: odoo/odoo#284944
Two Belgian payroll rules now use the correct employer detail category for social security reporting. This helps keep payroll declarations aligned with expected reporting structure without changing payroll calculation logic.
Original PR description
The following rules (code): - ONSSELDERLY - ONSSEMPLOYER_ARTIST_REDUCTION must have ONSSEMPLOYERDETAIL as a category. Updated the category_ids field of those rules to implement it. task: 6510619
Deleting accounts in the German reports module should now complete more quickly in cases with large amounts of related accounting data. The change adds supporting database indexes so the system can verify account usage more efficiently before deletion.
Original PR description
Without these indexes, the foreign key check when deleting an account can take a long time. Forward-Port-Of: odoo/enterprise#129403
Duration values are now formatted consistently across planning, Gantt, and grid views. This improves readability for users reviewing scheduled time and reduces inconsistencies in how time spans appear.
Original PR description
Replace formatFloatTime by formatDuration.
Website editors can now preview the AI live chat fallback button by hovering over the option before enabling it. This makes it easier to understand how the button will appear on the website and choose the right configuration with confidence.
Original PR description
Before this commit, there was no preview available of the ai livechat's fallback button. After this commit, a user will be able to hover over "Fallback Button" and see a preview of what the button would look like before enabling it. task-5248712
Belgian accounting tax data now marks additional 0% taxes with the non-deductible fiscal position where it was missing. This helps companies using Belgian localization apply tax treatment more consistently and reduces manual correction in accounting setup.
Original PR description
Adding non-deductible fiscal position to taxes that were missing it in the data. task-6389423 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284869 Forward-Port-Of: odoo/odoo#278020
The HR module now makes its clean number display component available for reuse in other Odoo editions. This helps Enterprise extend HR screens to show decimal values with custom unit labels, such as days, while keeping formatting consistent.
Original PR description
Export `FloatWithoutTrailingZeros` and `floatWithoutTrailingZeros` from the `hr` module so they can be imported and extended in Enterprise to support float fields with custom unit suffixes (e.g., "Days"). Task: 6222665 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update simplifies the data used by the Manufacturing Order Overview by removing an unnecessary currency field. It helps keep the report data cleaner and reduces the chance of redundant information being handled behind the scenes.
Original PR description
Remove 'currency_id' from dict task: 5225952
Resolved issues and error corrections
This fixes a spacing issue where date picker popups could lose their normal padding because of a calendar side panel adjustment. The padding change is now limited to the calendar side panel, keeping popups visually consistent elsewhere.
Original PR description
- requires https://github.com/odoo/odoo/pull/284964 The template override forced `pb-2` on every picker so it would sit flush in the calendar side panel, stripping the padding from popovers too. Set `--DateTimePicker-padding` on the panel instead. task-6512183
Features or functions removed from Odoo
This removes outdated checks and references for old module setup file options that no longer worked in regular modules. The change reduces confusion for maintainers and keeps Odoo's module handling aligned with current supported behavior, with no expected impact for everyday users.
Original PR description
- forgot I already did a pass back in #215533 so just remove the mentions of `init_xml`, it was deprecated for 19.0 and was just a notice as it had not worked for more than a decade before then - also remove the check on `demo_xml` which hasn't worked or done anything useful since dfb9d317f269810c8e857a7bc898389242ac9fa7 either (same as all the other `_xml` keys as that uwittingly broke them all) Note that the `init_xml` = csv(noupdate) works in data modules (`base_import_module`), because when fme implemented that he missed that it had stopped working (for only a few months at that time) in normal modules. It was not deprecated in #215533 either since it worked fine and there was no easy way to feed that information back to data module, and we don't know whether this is ever used by anyone.
Code cleanup and technical improvements
This update reorganizes how helpdesk live chat ticket links and display names are calculated behind the scenes. It improves consistency with the broader messaging system and helps keep the related code easier to maintain without changing the user experience.
Original PR description
Counterpart of "[REF] mail, *: declare a computed on a record", which explains the why. `href` is computed from the record, and nothing stores it.
This fix restores the expected horizontal spacing around date pickers shown in popovers, making them easier to read and use. Calendar side panels can still keep their tighter layout without affecting date pickers elsewhere.
Original PR description
- requires https://github.com/odoo/enterprise/pull/129503 | //////// | Calendar C.E (identical) | Calendar E.E (preserve top alignment) | Datepicker (restore padding) | Frontend datepicker |…
- requires https://github.com/odoo/enterprise/pull/129503 | //////// | Calendar C.E (identical) | Calendar E.E (preserve top alignment) | Datepicker (restore padding) | Frontend datepicker | |--------|--------|--------|--------|--------| | Master | <img width="466" height="497" alt="image" src="https://github.com/user-attachments/assets/148943b7-c89d-4aec-8b9a-fdf8e58016e2" /> | <img width="487" height="536" alt="image" src="https://github.com/user-attachments/assets/5d09bcd4-a3d4-475b-b97f-02a2254398da" /> | <img width="453" height="418" alt="image" src="https://github.com/user-attachments/assets/fa815751-50de-4257-8b25-81801042c4ce" /> | <img width="616" height="451" alt="image" src="https://github.com/user-attachments/assets/9c4a646c-d1be-4431-afd6-552ab3e84e62" /> | | This PR | <img width="455" height="488" alt="image" src="https://github.com/user-attachments/assets/2957ae2e-32c2-40b1-906a-bf643f1c6028" /> | <img width="488" height="498" alt="image" src="https://github.com/user-attachments/assets/09f66532-45e0-4a73-9133-94ba9561f3d9" /> | <img width="574" height="407" alt="image" src="https://github.com/user-attachments/assets/1bd5cb86-0adc-46ed-8f52-421e103261f1" /> | <img width="602" height="437" alt="image" src="https://github.com/user-attachments/assets/2c06d43c-81db-4b78-bc77-20e3d39cc2f6" />| The calendar refresh narrowed the picker's padding globally (`p-2` -> `py-2`) so it would sit flush in the calendar side panel. A later commit moved that side panel restyling to Enterprise but left the narrowed padding behind, leaving every popover picker without its horizontal spacing. Expose the padding as `--DateTimePicker-padding`, defaulting to the original spacing, and let the side panel opt out. A variable rather than a utility class also removes the `!important` the bottom sheet needed to beat `p-2`. task-6512183 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a small internal cleanup issue in the bus messaging system by removing empty database tracking entries when they are no longer needed. It does not change user-facing behavior, but keeps background bookkeeping tidier and avoids stale internal records.
Original PR description
`_drop_topic_if_empty` discards a topic from its dbname's set but never removes the dbname key once the set becomes empty, leaving a stale empty set if no notify is ever received for this DB. No impact on the dispatch code, just a bookkeeping cleaning.
This fix updates an internal social CRM test so it no longer depends on a generic customer name that can appear in other sample data. It helps keep automated checks stable and reduces false failures during development and release validation.
Original PR description
The social CRM conversion test creates a partner named "John Doe" and expects the post-to-lead wizard to automatically match it. This relies on "John Doe" being unique in the database. Since `pos_restaurant.customer_1` is also named "John Doe", the wizard's `name_search()` can return multiple partners depending on the modules already installed when the test is run. In that case, the wizard correctly considers the match ambiguous and leaves `partner_id` empty, causing the test to fail. This commit uses a test-specific author name instead, ensuring that the test actually provides the single matching partner described by its docstring and does not depend on unrelated demo data or module installation order. [error-243065](https://runbot.odoo.com/odoo/error/243065) Forward-Port-Of: odoo/enterprise#128119
Customers can no longer set optional products on sales orders to negative quantities through the portal. This keeps customer-facing order changes consistent and prevents invalid quantities that should only be handled by sales staff when needed.
Original PR description
Since the fusion of `sale.order.option` model into `sale.order.line` model, the optional products (editable from portal) lines are not deleted when reaching a quantity of 0 or below. This could allow some customers to set negative quantities, which makes no sense as it's only something that should be set by the salesman if necessary. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#284493
Planning notification emails now show action buttons with a visible colored background, so employees can clearly read and click options like viewing their planning. This prevents confusion when shifts or schedules are published and helps employees respond from email more reliably.
Original PR description
Before this change: When publishing a shift or schedule, the buttons "Assign me this shift", "I am unavailable", and "View your planning" inside the notification email sent to the employee appears invisible. The button text is rendered in white on a white background, making the link unreadable and difficult to click. To reproduce: 1. Open the Planning app and create a shift with today's date in the time range. 2. Click "Publish". 3. Go to Settings > Technical > Email > Emails. 4. Open the email that was just sent. 5. Inspect the email body and observe that the "View your planning" button text is not visible. After this change: A default purple background is applied to the button, ensuring the white text is properly visible and legible across email clients. opw-6483147 Forward-Port-Of: odoo/enterprise#128662
This change makes automated checks for the HTML editor behave consistently across different Odoo editions. It reduces false test failures, helping development and release validation proceed more reliably without changing end-user features.
Original PR description
This PR aims to fix the failing contrast tests in the community version. The failures occur because `this.defaultBg` in contrast_plugin.js has different values in community and enterprise versions, resulting in different color contrast values. This PR fixes the tests by patching `--o-control-panel-background-color` css variable with a hardcoded value. runbot: 946513 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Scrolling or zooming within the image cropper now keeps the user’s selected crop area instead of resetting it. This prevents accidental loss of cropping adjustments and makes image editing more predictable in the HTML editor.
Original PR description
Problem: When scrolling on an image inside the image cropper (which triggers a zoom event), the selected cropping area is reset back to default instead of preserving the existing crop selection. Cause: The `t-on-zoom` event listener called `onCropZoom()`, which executed `resetCropBox()`. This called `cropper.clear()` and `cropper.crop()`, clearing and resetting the crop box whenever a zoom/scroll event occurred. Solution: Remove `onCropZoom` and `resetCropBox` so zooming or scrolling on the image does not reset the active crop box selection. Steps to reproduce: - Insert a large image in the editor. - Crop it. - Reopen the image cropper on the image. - Scroll on the image. - Observe that the selected cropping area is reset instead of preserved. task-6488910 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Invalid VAT warnings now preserve and display the exact VAT number entered by the user, such as Swiss values like CHE-115.391.649. This avoids confusing truncated messages and helps users identify and correct the original input more easily.
Original PR description
Before this change: When entering or importing a VAT number (e.g., CHE-115.391.649), an invalid VAT warning displays a string missing its country_id (e.g., E-115.391.649). This confuses users and masks the actual input string that triggered the validation failure. To reproduce: 1. Open any contact record and set the Country to Switzerland. 2. Enter an invalid or manually formatted Swiss VAT number like `CHE-115.391.649`. 3. Save or trigger the VAT validation check. 4. Observe the warning banner showing `E-115.391.649` instead of `CHE-115.391.649`. After this change: The validation warning logic preserves the original user input when constructing the alert message, ensuring error notifications accurately display VAT number. Issue introduced by: * https://github.com/odoo/odoo/commit/ac95d2d6d80a368dfb190d0ac21da2af479a8488 * https://github.com/odoo/odoo/commit/a2afe3292e1cd0a4f339dc47707e469653d13ea0 opw-6474217 Forward-Port-Of: odoo/odoo#284305
This fix prevents duplicate emails from being sent when expenses are submitted across multiple companies. It helps keep expense notifications accurate and avoids confusing employees or approvers with repeated messages.
Original PR description
Fix a small issue resulting in mail duplication when submitting expenses from multiple companies that appeared in the infamous 704a5a19 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#284861 Forward-Port-Of: odoo/odoo#283013
Belgian payroll now correctly validates temporary economic unemployment leave that lasts one day. This prevents affected HR users from being blocked when recording short unemployment periods around public holiday handling.
Original PR description
Steps: - Create a 'temporary economic employment for employee' timeoff type for an employee for 1 day only - Attempt validating the leave type Cause: Due to the splitting of economic unemployment period by public holidays, economic unemployment durations for 1 day durations are not returned from the splitting method correctly Solution: Returned economic unemployments with durations <= 1 correctly Task: 6511201
This fixes an internal HR Appraisal test that could fail when it ran across midnight. The change helps keep automated checks stable so future updates can be validated reliably without false failures.
Original PR description
### Explanation When `test_hr_appraisal` is run at, for example, 23:59:59, the line `self.hr_employee2.next_appraisal_date = date.today()` is executed after midnight, on the following day. As a result, a validation error is raised: `odoo.exceptions.ValidationError: You cannot set 'Next Appraisal Date' in the past.` Forward-Port-Of: odoo/enterprise#127699
This fix ensures Sendcloud shipping labels are returned in the format requested, such as ZPL or PDF. It prevents partner information sent with the request from accidentally replacing the label format setting, avoiding incorrect PDF-only label downloads.
Original PR description
We send the label type we want to get (zpl, pdf, ...) in the request headers. However, since odoo/enterprise#115999, we also send the partner ID in the headers. This was overriding the headers passed to the method, making Sendcloud always return a PDF label. Forward-Port-Of: odoo/enterprise#129542
Delivery charge lines are no longer shown in the Invoiced not Delivered report because they are not physical items that need delivery. This prevents accounting teams from seeing misleading outstanding delivery entries and improves the accuracy of revenue review reports.
Original PR description
Issue: --- Delivery lines are included in `invoiced not delivered` report, which is wrong as delivery lines are not deliverable. Steps: 1- Create a SO with a good product and add a delivery line. Set the product line as delivered and create an invoice. 2- Open accounting, and from review tab, open `Invoiced not Delivered`. As you see, delivery lines are included in the report. Fix: --- On stable we could fix it inside `_get_accrual_domain` by checking if `delivery` is installed. On master we need to implement a solution to be able to differentiate the lines that won't be delivered. opw-6360894 Forward-Port-Of: odoo/enterprise#123517
Copying an image that is already attached to another record now reuses the existing file instead of leaving an unnecessary duplicate. This helps keep stored media cleaner and avoids redundant attachment clutter for users editing website or HTML content.
Original PR description
Copying an image attachment already linked to another record could leave a redundant duplicate behind instead of reusing the existing one. opw-6463012 Forward-Port-Of: odoo/odoo#284610 Forward-Port-Of: odoo/odoo#282287
This update fixes incorrect and unclear naming for Japanese fiscal positions. It corrects a wrong Japanese translation for domestic partners, fixes an English spelling issue, and removes unnecessary wording so users see clearer accounting labels.
Original PR description
Japanese translation "海外取引先" for domestic was clearly wrong.
Also fixed the misspelling ("Oversea" -> "Overseas") and removed the unnecessary "Customer" context from the name.
@qrtl
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#284608The PDP registration wizard no longer shows a redundant “Production” mention when the system is already in production mode. This avoids confusing users during registration and makes the displayed information clearer.
Original PR description
It makes no sense to mention (Production) on pdp registration wizard when you are in prod mode Forward-Port-Of: odoo/odoo#280501 Forward-Port-Of: odoo/odoo#280360
This fix prevents the barcode manufacturing scrap process from losing the quantity entered during automated checks. It helps ensure scrap operations are validated with the intended positive quantity instead of being incorrectly rejected as zero.
Original PR description
Selecting the product in the scrap form triggers a `stock.move` onchange. The quantity step only waited for the input to exist, not for that onchange to be applied, so the value could be written while it was still in flight and be reset to 0 by its response. It was also assigned directly on the input, without any event, so the field was never flagged as dirty. The scrap was then recorded with a quantity of 0 and `action_scrap` rejected it with "You can only enter positive quantities.". Wait for the quantity input to hold its post-onchange value before typing, and dispatch an input event, like the other scrap tours already do. error-238911 Forward-Port-Of: odoo/enterprise#129410 Forward-Port-Of: odoo/enterprise#128931
Appointment invitation emails now generate public calendar links without permission errors. This ensures invitees receive usable links and reduces failed email rendering during appointment scheduling.
Original PR description
Since calendar attendee access tokens are restricted to system users, appointment mail templates must sudo token reads when generating public calendar links. This follows the same pattern as the calendar mail templates and avoids an AccessError when rendering attendee invitation emails. ref: https://github.com/odoo/enterprise/commit/88a3cca752a5f726cd0260b485fc93f65a268cf8 Task-4711415 Forward-Port-Of: odoo/enterprise#129511
The Studio search view has been updated to match the newer interface used elsewhere. This provides a more consistent experience for users configuring and customizing views in Odoo Studio.
Original PR description
Before this commit, the search view in studio was still the old one After this commit, the search view in studio is like the new one
This fixes an issue where turning a block of content into a list could create an invalid structure and make the list behave incorrectly. Users editing website content can now convert block elements into lists more reliably.
Original PR description
Before this commit, create a list from a div put the div inside of the list element and then doesn't work the proper way After this commit, when creating a list from a div (block element) the a inline element is put inside the list instead. 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
Opening an action that cannot be edited in Studio from the command palette no longer causes a crash. Instead, users see a clear error notification, reducing disruption and making the limitation easier to understand.
Original PR description
Before this commit: 1. Open studio on Home Page 2. Open an action that cannot be editable with studio through command palette 3. Traceback occurs After this commit, the NotEditableActionError is catch and show an error notification.
The Sign app's guided tour was updated so its drag-and-drop step works correctly with the newer tour system. This helps keep automated checks reliable and reduces the risk of unnoticed issues in the signing experience.
Original PR description
Fix the drag_and_drop run of sign_tour to fit in the new tour system.
Spreadsheet documents are now stored and identified using the standard JSON format instead of a custom spreadsheet file type. This makes the file handling more accurate and consistent while keeping the spreadsheet experience unchanged for users.
Original PR description
This commit removes the application/o-spreadsheet mimetype in favor of application/json for spreadsheet documents. New mimetype is more correct as spreadsheets are stored as JSON data. Task: 5416850
This update modernizes internal record observation code by replacing a deprecated mechanism with the newer framework approach. It helps keep the platform easier to maintain and ready for future framework changes, with no expected direct change for end users.
Original PR description
- enterprise: https://github.com/odoo/enterprise/pull/127637 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The mail module now separates the creation of completed activity messages from the rest of the activity completion process. This makes it easier for customizations to change or skip the standard 'Activity Done' message without affecting permissions, attachments, or archiving.
Original PR description
The `_action_done` method in `mail.activity` currently handles multiple responsibilities simultaneously, including permissions, attachments, message posting, and archiving. This commit extracts the chatter message generation logic into a dedicated `_generate_done_message` method. This allows inheriting models to easily override, customize, or completely bypass the generic 'Activity Done' message without duplicating or interfering with the core completion and archiving logic. Task: 6127862 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
The Point of Sale app’s internal data and ticket printing services were reorganized into a plugin-based structure. This should make the system easier to maintain and extend across related POS features without changing the day-to-day cashier experience.
Original PR description
Convert the following services to plugins: - pos_data_service - pos_ticket_printer_service
This update reorganizes some point of sale printing and data handling components into a newer plugin structure. It should make future maintenance and country-specific extensions easier without changing day-to-day user workflows.
Original PR description
Convert the following services to plugins: - pos_ticket_printer_service - pos_data_service