Saturday, August 29, 2026
24 changes · master
Enhancements to existing features
This change speeds up internal database column lookups by replacing a slower generic system view with a leaner query that fetches only the needed details. It can reduce time spent on these checks during operations such as upgrades, improving overall performance without changing user-facing features.
Original PR description
Using the view `information_schema.columns` is slow compared to a simplified query using PG catalog tables. Here we propose to cherry pick the parts of the view that we actually use. Below we show…
Using the view `information_schema.columns` is slow compared to a simplified query using PG catalog tables. Here we propose to cherry pick the parts of the view that we actually use.
Below we show the timings of both queries as reported by the system on an upgrade 18->master with a runbot DB (many modules installed). All values are in milliseconds.
```
Original:
min: 0.931
max: 16.786
mean: 1.8790601284296555
sum: 25750.64
len: 13704
New:
min: 0.224
max: 11.832
mean: 0.8649024372446001
sum: 11852.623
len: 13704
```
Total time spent in queries was halved as seen in the `sum` statistic above.
Technically, the new queries are base on the original information schema view definition as returned by `\d+ information_schema.columns`. With all unused info removed.
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#285419
Forward-Port-Of: odoo/odoo#216309French B2G invoices can now be identified and routed through Chorus Pro via the approved platform instead of Peppol. This improves compliance for invoices sent to French public sector customers, with added status tracking for sent, suspended, and completed cases.
Original PR description
B2G invoices are not sent via Peppol but to Chorus Pro (via the approved platform). Chorus Pro is the platform with ID 9999 on the annuaire. Any invoice to partner associated with that platform on…
B2G invoices are not sent via Peppol but to Chorus Pro (via the approved platform). Chorus Pro is the platform with ID 9999 on the annuaire. Any invoice to partner associated with that platform on the annuaire is considered B2G (business to government). From a user point of view nothing much changes, except that they have to set some additional fields for which we rely on the existing module `l10n_fr_facturx_chorus_pro`. From a technical PoV we store the information whether a partner is behind Chorus Pro in the `peppol_supported_documents` field. (By putting the special document identifier for Chorus Pro invoices there.) We retrieve the information whether a partner is behind Chorus Pro / B2G from the annuaire lookup. The following new lifecycle statuses have been added. They are required for the functional tests for the Chorus Pro connection. - Sent (sent by the platform) - Suspended - Completed (to "resume" the "Suspended" state) See the related IAP PR: https://github.com/odoo/iap-apps/pull/1804 task-6278159 Forward-Port-Of: odoo/odoo#284677
The cohort view now loads subscription data much faster by reducing unnecessary database work. This cuts wait times dramatically for users viewing cohort reports, improving day-to-day reporting performance.
Original PR description
`get_web_cohort` used to do N+1 queries (2N+1 for 'backward' mode). Now, it's one a single query (N+1 for 'backward' mode) On our odoo instance, going to the Subscription's cohort view: | | Time | SQL queries | |--------|--------|--------| | Before | 45s | 207 | | After | 1.3s | 27 | (speedscopes attached to the task) ## Before <img width="2516" height="735" alt="image" src="https://github.com/user-attachments/assets/fdd598d1-7c11-4c13-a480-a7bf07fc2b6f" /> ## After <img width="2516" height="1350" alt="image" src="https://github.com/user-attachments/assets/7a3f1b86-ab91-4966-84d7-e9b7b69506e0" /> task-6485857
Accounting now uses a more targeted database lookup when finding recent journal entries by date. This can dramatically reduce wait times in affected cases, improving responsiveness for users working with accounting records.
Original PR description
This commit adds an index on `(journal_id, date)` to speed up `_get_last_sequence_domain`. The slow part is `.search(domain, order='date [desc|asc]', limit=1)` Because of the order by date,…
This commit adds an index on `(journal_id, date)` to speed up `_get_last_sequence_domain`. The slow part is `.search(domain, order='date [desc|asc]', limit=1)` Because of the order by date, postgresql scans the index on `date`, assuming a row will be quickly matched. If this assumption is wrong though, it'll scan a large part of the index or all of it, which is slow. This is the case with account move 17102258 on odoo.com at the time of writing this. - before - 1st query https://explain.dalibo.com/plan/6b8ff62b1572ah1a - 2nd query https://explain.dalibo.com/plan/41243cgccg5798gb - after - 1st query https://explain.dalibo.com/plan/4fd2c7ed28g7b138 - 2nd query https://explain.dalibo.com/plan/2heh6c6965c88h71 - ~~1st query https://explain.dalibo.com/plan/f874a31f4b07hdeb~~ - ~~2nd query https://explain.dalibo.com/plan/e8h09725gfh4c2e9~~ full `web_read` - before ~1min 10s - after ~650ms task-6481393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#283159
Self-billing bills now keep separate numbering per partner, improving traceability and reducing confusion in accounting records. Self-billing invoices can also be imported into a dedicated sales journal, preventing regular sales invoices from accidentally using self-billing numbering patterns.
Original PR description
This PR handles 2 cases : ===== PART 1 ===== Self-billing bill sequences should be unique per partner, as implemented in v19+. This PR backports that behavior to 17.0. ===== PART 2 ===== Previously, the `is_self_billing` option on `account.journal` was available only for purchase journals. This caused an issue when importing a self-billing invoice into a regular sales journal with quick edit mode (accounting firm) enabled. In such cases, the newly created invoices would use the self-billing sequence pattern, leading to traceability issues. This PR allows the creation of self-billing sales journals to prevent this issue. task-6103142 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282642 Forward-Port-Of: odoo/odoo#259935
Companies in the same Odoo database that share the same French SIREN can now benefit from an already successful PDP registration verification. This reduces repeated manual KYC work when many branches or related companies need to be registered.
Original PR description
We have some clients that have several hundreds of companies/branches on the same db, with the same SIREN (incubateur or the like). They will need to do the kyc (that will be identical, as it's the same SIREN) for all the companies. It's especially cumbersome if it needs manual intervention So, if one company on that database, with the same SIREN, managed to register, then it means it has succeded the kyc. Meaning we can bypass the kyc for the other identifiers as well. task-6515315 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#285236
Odoo now uses a dedicated backend icon font and standard icon codes from Google, reducing unnecessary file changes when icons are updated. This makes maintenance simpler and slightly reduces font sizes loaded by browsers, while preserving backend rendering for reports and emails.
Original PR description
[IMP] web, html_editor, mail: add backend-only Material Symbols font --- __Before commit__ Every time a new icon was added, a large part of `material_symbols_pua_codepoints.py` was overwritten. This…
[IMP] web, html_editor, mail: add backend-only Material Symbols font --- __Before commit__ Every time a new icon was added, a large part of `material_symbols_pua_codepoints.py` was overwritten. This happened because `generate_icons.py` assigned new PUA codepoints to every icon each time it ran. Google already assigns predefined codepoints to these icons, which are included in `material_symbols_outlined_subset.woff2` but were previously unused. __After commit__ The font `material_symbols_backend.woff` is introduced for backend-only usage, such as report generation and backend mail icon rendering. It replaces the per-style WOFF1 files and the PUA-only font. The standard codepoints from Google are now used for the icons. We still need to assign custom codepoints to filled icon variants because they are separate icons in the optimized version. We do this by adding an offset of 0x100000 (using a bitwise AND of 0xFFFF for edge cases to remain within the standard Plane-16 Private Use Area). __Benefits__ - Adding a new icon produces a significantly smaller diff. - A single WOFF1 replaces the two per-style ones, and is the only format both backend consumers can read: wkhtmltopdf cannot parse WOFF2, and Pillow needs the codepoints in the cmap. - Existing codepoints are removed from WOFF2 files, making fonts fetched by browsers a few kB lighter.
Batch transfer functionality is now built directly into Inventory instead of requiring a separate add-on and several connector modules. This simplifies setup and maintenance for businesses that use warehouse batching, while keeping the feature controlled by a setting.
Original PR description
This main PR's purpose is to move the `stock.picking.batch` model from `stock_picking_batch` to `stock` module, which let us remove the `stock_picking_batch` and a bunch of bridge modules, and replace them by a setting. Other changes: - Move `StockPickingType` code from `stock_picking.py` file into its own file (`stock_picking_type.py`); - Remove `show_operations` field because this field is unused and we forgot to remove it in master. See commits' message for more information. **Enterprise PR**: odoo/enterprise#128175 **Upgrade PR**: odoo/upgrade#11054 task-6154300
The Automatic Check-Out settings in Attendance are easier to understand and configure. Time-based options now look and appear closer to their related choices, reducing confusion when setting employee check-out rules.
Original PR description
The Specific Time option was introduced for Automatic Check-Out, but its field visually resembles a duration field rather than a specific time. This updates the Specific Time field to match the UI used for similar fields in Time Off, positions the Tolerance and Specific Time fields next to their corresponding radio options, and displays the fields of unselected options in light grey. Task-6476495 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The time off dashboard now shows the number of pending allocation requests, rather than adding up the days or hours in those requests. This makes it easier for managers and employees to understand how many items need attention.
Original PR description
change the number of pending allocation to represent how many pending allocation instead of the number of the days or the hours in the pending allocations Task Id: 6482732
The website countdown block now offers a clearer set of layout choices, combining previous layout and template settings into one simpler option. Editors also get more focused text formatting controls and a warning when a countdown may be outdated, helping prevent display issues on published pages.
Original PR description
[IMP] website: merge countdown snippet layout and template options Following [commit](https://github.com//odoo/odoo/commit/74a9e5bb734708497456ed2bc91465f95505b2d7), we'd like to improve the…
[IMP] website: merge countdown snippet layout and template options Following [commit](https://github.com//odoo/odoo/commit/74a9e5bb734708497456ed2bc91465f95505b2d7), we'd like to improve the countdown snippet. Key changes: 1. Merge Layout and Template into a single layout option with the following layouts: - Circle - Text Inline - Dominoes (replaces Boxes) - Wrapped Numbers - Text - Big Numbers (replaces Clean) 2. Enable toolbar for both metrics and indicators 3. Remove Edge Spacing 4. Convert Circle layout to Text Inline format: display the countdown on the left with reduced size. 6. Retain Circle-specific options plus all Text Inline options when possible. task-5242156 --- [IMP] website, html_builder: show notification if countdown is outdated We would like to show the notification to user saying that the countdown is outdated if it should be updated. This commit also changes wording in that notification to indicate that it may cause problems. task-5242156 --- [IMP] website, html_editor: add countdown toolbar namespace For metrics in countdown, we don't want to show all toolbar groups, but rather just font and decoration groups buttons. This commit adds a new namespace for that, and adds that namespace to buttons we want to display. task-5242156
Customers can now use sales order payment links to pay any amount, including partial payments or amounts above the order total. Sales orders are confirmed as soon as the first successful payment is received, making the buying process faster and more flexible.
Original PR description
This PR removes payment amount restrictions on Sales Order payment links, allowing customers to pay any amount, including amounts greater than the order total. Sales Orders are now confirmed on the first successful payment, regardless of the amount paid. For Enterprise PR see : https://github.com/odoo/enterprise/pull/124636 For Upgrade PR see : https://github.com/odoo/upgrade/pull/10818
Odoo now stores attachment file names directly with the uploaded file instead of in separate fields. This reduces duplicate data behind the scenes while keeping document uploads and downloads working as expected for users.
Original PR description
```py bin = fields.Binary() bin_filename = fields.Char() # removed ``` File name is now defined in side the `bin` field. Remove most of these fields as the filename is part of the binary field now. https://github.com/odoo/enterprise/pull/129066 https://github.com/odoo/upgrade/pull/11124 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adds missing automated checks for timesheet reporting, billing, attendance comparisons, printable reports, and employee deletion safeguards. It helps ensure existing timesheet features continue to work correctly and reduces the risk of regressions in payroll, billing, and project reporting workflows.
Original PR description
* = hr_timesheet_attendance, sale_timesheet Add tests for timesheet features introduced by previous tasks and left uncovered: - measures of the timesheets analysis report: billable and non-billable time, revenues and margin (task-2783955), and the revenues of each type of service (task-3368808) - timesheets of a project billed manually, without any sales order item (task-3565762) - timesheets, attendance and difference costs of the timesheets/attendance analysis report (task-2782768) - 'Timesheets' printable report of a selection of timesheets, of a task, of a project, of a sales order and of an invoice (task-2826265) - employee delete wizard, which refuses to delete an employee having timesheets and offers to archive them instead (task-2938632)
The view switcher now uses a visible light grey hover effect instead of a barely noticeable white overlay. This makes it easier for users to see which view option they are pointing at, improving everyday navigation clarity.
Original PR description
This PR updates the `:hover` state for the view switcher component, which was previously using white with an opacity, which was not visible. Instead, reuse the same approach as dark mode and use a lighter shade of grey. task-6512176
Hong Kong payroll now combines severance pay, long service payment, and payment in lieu of notice into one termination payslip. This reduces HR administration and makes final employee payments clearer and simpler to process.
Original PR description
Up until now, we have been maintaining separate structures for all termination pays (severance pay, long service payment, payment in lieu of notice). While this is one way of doing this, it is not necessarily the best. It asks the HR team to issue up to three payslip on the last month of an employee to cover all statutory payments; and it also makes paying the employee more complex. According to feedbacks, it is actually preferable to issue a single merged payslip that includes all payments, both for clarity and simplicity, which is what we will now do. task-6174257
A new warning is shown in the Belgian payroll holiday attest form to remind users that changes are only saved when the main employee form is saved. This helps prevent users from accidentally losing holiday attest information entered in the sub-form.
Original PR description
Since the holiday attest dialog is a sub-form, it will only save if the main employee form is saved. To alert users, we created a new warning that appears next to the constraints in the holiday attest form. Task Id: 6482500
Inventory batch picking support has been moved into the main stock-related apps, removing several separate bridge modules. This simplifies maintenance while keeping barcode, quality control, and fleet workflows aligned with the updated inventory structure.
Original PR description
*: quality_control_picking_batch, stock_barcode, stock_barcode_picking_batch, stock_barcode_quality_control, stock_barcode_quality_control_picking_batch, stock_fleet_enterprise The `stock.picking.batch` model were moved from `stock_picking_batch` to `stock`, and the module `stock_picking_batch` doesn't exist anymore. This commit adapts the code to this change in the enterprise modules. Since we had some brigde modules, some modules are merged: - `quality_control_picking_batch` is merged into `quality` and `quality_control`; - `stock_barcode_picking_batch` is merged into `stock_barcode`; - `stock_barcode_quality_control_picking_batch` is merged into `stock_barcode_quality_control`. In summary, removed modules are: - `quality_control_picking_batch`; - `stock_barcode_picking_batch`; - `stock_barcode_quality_control_picking_batch`. **Community PR**: odoo/odoo#282884 **Upgrade PR**: odoo/upgrade#11054 [task-6154300](https://www.odoo.com/odoo/966/tasks/6154300)
The app switcher background has been adjusted to look more consistent across light and dark modes, Studio views, and custom image backgrounds. This improves readability and visual polish for users while preserving compatibility with other areas that reuse the same background component.
Original PR description
* web_studio This commit applied general adaptions related to the background app switcher. - Align the design across all cases: light/dark mode, Studio open/ closed, and custom image backgrounds - Optimize contrast with app icons - Improve rendering when Studio is enabled - Adapt the background implementation to restore compatibility with other apps where o_home_menu_background is used (e.g. event registration). task-6511279
The Belgian payroll Dimona flow is clearer and safer for HR users. Dimona statuses are now read-only, manual declaration screens show the correct action and guidance, and certificate setup explains how it supports automated submissions.
Original PR description
Feedback from the Dimona UX review: - The Dimona badge on the employee form sat before the review state pill and was a dropdown, so the state could be set by hand. That state reflects what was…
Feedback from the Dimona UX review: - The Dimona badge on the employee form sat before the review state pill and was a dropdown, so the state could be set by hand. That state reflects what was declared to the ONSS, not a user choice: it becomes a read-only badge, placed after the review pill, and "Send Dimona" stays the only way to act on it. dropdown_selection_badge honors a readonly attribute on the field node for this; props.readonly could not be used, as list and kanban records are never in edition, which would freeze the review state badge as well. - The manual declaration wizard always showed "Dimona IN" with the text of an entrance declaration, whatever had to be declared. Its title and description now follow the next action (in, out, update, cancel or issue), and the ONSS link points to the Dimona portal instead of the DmfA instructions. - The ONSS certificate setting only said "Configure ONSS certificate". It now states what the certificate is for, automating Dimona, DMFA and DRS submissions via the API, and links to the ONSS page explaining how to obtain the credentials. - The Dimona declaration fields on the employee offered to create a declaration from the autocomplete, which would record a declaration that was never sent to the ONSS. task-6470879
Sales Order payment links no longer track a maximum payment amount, aligning subscriptions with the updated payment behavior. This removes an unnecessary warning path and keeps related tests in sync, with minimal impact for users.
Original PR description
Removed the `amount_max` field from the payment link feature as it is no longer needed after removing payment amount restrictions on Sales Order payment links. The field was previously only used to display an alert when the payment amount exceeded the allowed maximum. Updated the tests accordingly. Task-6238148 For Community PR see : https://github.com/odoo/odoo/pull/268214 For Upgrade PR see : https://github.com/odoo/upgrade/pull/10818
This update adds missing automated checks for several timesheet workflows, including grid behavior, validation views, helpdesk ticket reports, and planning profitability measures. It helps ensure existing timesheet features remain reliable while also removing unused legacy code that no longer supports active workflows.
Original PR description
* = helpdesk_timesheet, project_timesheet_forecast_sale Add tests for timesheet features introduced by previous tasks and left uncovered: - filters of the timesheets search view: My Team, My Department, My Projects, My Tasks, Draft and Validated - rows of the grid view sorted alphabetically (task-3610476) - empty lines added in the grid view for the entries of the previous period (task-3077292) - redirection to the form view when a grid row holds too little data to create a timesheet (task-3602605) - 'To Validate' grid view opening on the previous period (task-3893907) - measures of the planning & timesheets analysis report: planned and effective costs, revenues, margins and billable time (task-2849291) - 'Timesheets' printable report of a helpdesk ticket (task-2826265)
Checkout now more reliably requires Chilean and Mexican invoicing information before customers proceed to payment. This prevents shoppers from accidentally bypassing required billing details and avoids checkout steps being incorrectly shown or hidden based on another visitor's session.
Original PR description
Commit odoo/odoo@1facbc0646bd made the checkout validate every `website.checkout.step` through a single flow, but the localization invoicing steps were left out. These steps are shown or hidden by…
Commit odoo/odoo@1facbc0646bd made the checkout validate every `website.checkout.step` through a single flow, but the localization invoicing steps were left out. These steps are shown or hidden by publishing or unpublishing a shared step record on each checkout. This is unreliable: the cart and payment pages don't refresh it, so the step can be left in the state set by another visitor. The step is also only validated when the visitor goes through it, so opening `/shop/payment` directly skips it. An override also forces `try_skip_step` off so the checkout page cannot jump past the step. This commit filters the Chilean and Mexican step out of the breadcrumb steps domain per request when it is not needed, instead of toggling the shared record, and checks it in the validation flow so opening `/shop/payment` redirects back to it while incomplete. Forcing `try_skip_step` off is no longer needed. Chile stores the taxpayer type on the invoicing customer so the check also works when the billing contact is not the ordering one. Mexico uses a best-effort check, since a customer who wants no invoice looks the same as one who skipped it. task-6045788 See also: - https://github.com/odoo/odoo/pull/276844 - https://github.com/odoo/upgrade/pull/10806
Grouped list views now automatically hide sections that no longer contain records when those empty sections are not intentionally preserved. This reduces clutter and helps users focus on relevant information after actions change the contents of a group.
Original PR description
Having empty groups in list view can add unnecessary info for the user, especially when an action empties a group without triggering a full rendering (see Accountant > Journal Audit Review). This commit add a new filtering step to the `RelationalModel` group reading post process which filters out empty groups when the view is not grouped by a default groupBy nor the grouping field has the `group_expand` property. task-6465612