Wednesday, September 9, 2026
63 changes · master
Enhancements to existing features
Update notifications now include counts for light users, giving businesses a clearer view of user types during update checks. This helps administrators better understand licensing or user composition information alongside existing update details.
Original PR description
This commit add the light users counts to the update notification. Task-Id: 6388209 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update removes an obsolete option from the Bulgarian SAF-T file attachment error wizard. It keeps the tax reporting workflow aligned with recent validation changes and reduces unnecessary internal complexity, with no expected impact on everyday users.
Original PR description
bypass_failing_tests has been removed from the definition of the tax return action_validate since 19.4. Thus the file_attachment_error_wizard no longer needs to hold that value. This commit removes it in master. Related: odoo/upgrade/pull/11272 Related: odoo/enterprise/pull/118326
Timesheets can now record time spent in Google Chat even when no specific chat participant is selected. This helps ensure more complete and accurate time tracking for work done through Google Chat.
Original PR description
This commit's purpose is to add a new rule to be able to record the time spend on google chat when no specific chatter is selected. task - 6455607
Before this commit, ts assistant was didn't have any rules to detect the usage of Zoom After this commit, ts assistant should come with pre-build rule to track Zoom use in both web and application form. task-[6518921](https://www.odoo.com/odoo/project/4105/tasks/6518921)
Original PR description
Before this commit, ts assistant was didn't have any rules to detect the usage of Zoom After this commit, ts assistant should come with pre-build rule to track Zoom use in both web and application form. task-[6518921](https://www.odoo.com/odoo/project/4105/tasks/6518921)
Changes to a stock transfer's effective date will now be recorded in the chatter when the transfer is unlocked. This improves traceability by making date adjustments visible in the transfer history for audits and follow-up.
Original PR description
Effective date is allowed to be changed if transfer is unlocked. But if it is changed, it is not reflected in chatter, which leads to poor tracebility. This commit adds tracking for the field. task-6116292 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
This update strengthens Odoo's internal linting so developers can detect methods that claim to extend parent behavior when no parent method exists. It also removes or relocates unused code across several apps, reducing maintenance risk without introducing major user-facing changes.
Original PR description
Find all methods in the MRO that call `super` but don't exist in the parent class. Check `__override` value on methods. There is a simple default we can use: `__code__.co_names` contains "super" if `super(...)` is used in the function. That may flag manual calls to other methods that the current once, but setting the override flag on the function can whitelist it. task-2922186 https://github.com/odoo/enterprise/pull/130760 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The web interface now separates status bar styling from unrelated switcher styling. This reduces the risk of visual conflicts and helps keep the user interface consistent as different navigation controls evolve.
Original PR description
`.o_switcher` is not related to this component and is now problematic, as we have specific slide styling for the view switcher. The design should be better separated and more clearly split into distinct parts. task-6546246 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update improves the visual clarity of buttons in Odoo forms by keeping borders fully visible when users hover over or focus on them. It also makes the focus indicator in the "More" dropdown more consistent, supporting easier navigation and better usability.
Original PR description
Prior to this commit, the button border could be partially obscured when the button was hovered or focused. This commit ensures that the entire border remains visible in these states. This commit…
Prior to this commit, the button border could be partially obscured when the button was hovered or focused. This commit ensures that the entire border remains visible in these states. This commit also reviews the focus ring for buttons within the "More" dropdown to ensure it remains consistent and clearly visible. task-6528444 Requires: - https://github.com/odoo/enterprise/pull/130674 | Before | After | |--------|--------| | <img width="305" height="120" alt="Screenshot 2026-09-08 at 11 47 42" src="https://github.com/user-attachments/assets/6374fcb1-cf48-46f3-b467-64dbff1b2011" /> | <img width="297" height="113" alt="Screenshot 2026-09-08 at 11 48 05" src="https://github.com/user-attachments/assets/face6b7a-28ab-4308-ae78-3689c45da948" /> | | <img width="443" height="122" alt="Screenshot 2026-09-08 at 11 47 47" src="https://github.com/user-attachments/assets/4db5ac90-226e-44e3-8185-5f14b205476d" /> | <img width="484" height="119" alt="Screenshot 2026-09-08 at 11 48 06" src="https://github.com/user-attachments/assets/8d2a5ff3-ff4a-4947-b5d9-7a4277548b3e" /> | | <img width="268" height="219" alt="Screenshot 2026-09-08 at 11 46 18" src="https://github.com/user-attachments/assets/e5dbbe3d-d0e7-440e-a61e-53574f0d8896" /> | <img width="327" height="235" alt="Screenshot 2026-09-08 at 11 46 11" src="https://github.com/user-attachments/assets/632ceefc-9135-43f9-b404-fc18f9f4187c" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Selection highlights now slide consistently across more switcher controls, not just the main view switcher. This makes navigation feel more polished and avoids distracting overshoot in larger button groups.
Original PR description
The travelling indicator was painted for the view switcher only, which is handed its button count and its active index by the control panel. Paint it for every `.o_switcher`: `:has()` on the group reads both from the buttons themselves, one rule per position, up to three buttons. `@starting-style` stays on the view switcher alone. It is needed where the group is rebuilt between the two states, and everywhere else the group survives the change, so the move starts from the position already painted. Two groups are left out. '.o_statusbar_status' wraps each step in a div and marks the current one with a class of its own, so neither number can be read off the group. '.o-mail-ActionList-group' holds toggles that can all be off, and with no active button the layer would sit on the first one as if it were selected.
Buttons in form statistic areas now use a consistent background color across normal and hover states. Dark mode colors were also adjusted so hover feedback is easier to see, improving visual clarity for users.
Original PR description
This commit ensures that all `oe_stat_button` elements use the same background color in both their default and hover states. This commit also fine-tunes the colors for dark mode to make the hover…
This commit ensures that all `oe_stat_button` elements use the same background color in both their default and hover states. This commit also fine-tunes the colors for dark mode to make the hover state more visible. task-6528444 Requires: - https://github.com/odoo/odoo/pull/286952 | Before | After | |--------|--------| | <img width="239" height="78" alt="Screenshot 2026-09-08 at 14 44 47" src="https://github.com/user-attachments/assets/e9a87f3f-598d-447a-a992-7458fe4baaf8" /> | <img width="199" height="90" alt="Screenshot 2026-09-08 at 14 44 13" src="https://github.com/user-attachments/assets/8de5ab01-08c4-43ac-96a8-5e1fa53e0dc8" /> | | <img width="223" height="71" alt="Screenshot 2026-09-08 at 14 45 01" src="https://github.com/user-attachments/assets/8bf329cb-a73a-425c-a619-d66d2e96ccc3" /> | <img width="247" height="92" alt="Screenshot 2026-09-08 at 14 43 10" src="https://github.com/user-attachments/assets/e55435d9-b54e-479d-8ba1-efccb665e9c1" /> | | <img width="231" height="81" alt="Screenshot 2026-09-08 at 14 44 36" src="https://github.com/user-attachments/assets/024bd44d-4c91-468a-9575-defe97c6dbb8" /> | <img width="228" height="79" alt="Screenshot 2026-09-08 at 14 44 27" src="https://github.com/user-attachments/assets/a0d7c009-5a36-478a-868e-335b1609b8d2" /> | | <img width="234" height="324" alt="Screenshot 2026-09-08 at 14 45 07" src="https://github.com/user-attachments/assets/fb9ef801-78eb-483c-912f-3b51a84c4c6c" /> | <img width="278" height="361" alt="Screenshot 2026-09-08 at 14 43 04" src="https://github.com/user-attachments/assets/9a982250-2b67-40e3-850a-9102ce187f0f" /> |
Odoo now uses the same internal name for the X social media icon across website, email, marketing, forum, sales, and e-learning areas. This small cleanup helps keep branding consistent and reduces confusion when maintaining social sharing and social media templates.
Original PR description
*: iap_mail, marketing_card, mass_mailing, website_forum, website_sale, website_slides This commit homogenizes the name of the X icon.
The Discuss header now uses browser styling instead of background scripts to size its input fields. This simplifies the interface logic and should make the header more reliable and easier to maintain without changing the user workflow.
Original PR description
Currently, the discuss header size is computed in JS. Code is not easy as it has to account for every participing node. This commit replaces this computation by a CSS only solution: - size the input based on an ::after element, containing the text of the input. - remove the inputs from the layour flow as to not impact sizing at all. 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
This update reorganizes how automatic leave approvals are handled in the Time Off app by moving that logic into its own dedicated method. The change should make future maintenance and enhancements easier without changing the day-to-day experience for employees or managers.
Original PR description
task-6384703 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
Accounting entries now expose the fiscal position from their related invoice or journal entry. This makes it possible to analyze fiscal position information directly in pivot reports, improving reporting flexibility for finance teams.
Original PR description
We add the relation fiscal_position_id from move_id inside account_move_line. This is used so that we can use it inside a pivot view. task-6508687
Italian electronic invoices now handle cash rounding lines more safely when generating XML. This keeps the required tax information in the invoice output without changing a shared tax calculation process used elsewhere, reducing the risk of side effects.
Original PR description
Remove the override of `_prepare_product_base_line_for_taxes_computation` since it's a low level method used by a lot of flows. Instead, we just add the 0% exempt tax on the line on-the-fly at the generation of the xml. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287016
The breadcrumb trail in Odoo’s web interface has been visually softened by removing bold styling and making separators less prominent. This creates a lighter, cleaner navigation experience without changing functionality.
Original PR description
ENT: https://github.com/odoo/enterprise/pull/130516 task-6527644 | Before | After | |--------|--------| | <img width="750" height="437" alt="Screenshot 2026-09-04 at 16 49 38" src="https://github.com/user-attachments/assets/428ed1f6-52fc-43c7-8ad7-aa87124f988b" /> | <img width="754" height="436" alt="Screenshot 2026-09-04 at 16 48 35" src="https://github.com/user-attachments/assets/c9eb44dd-1d5c-4c79-b0bb-43c41122b3f6" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Payslips created through payroll runs now record which pay run created them and which user started the batch, making audit trails easier to understand. Companies can also disable these automatic creation messages for large payroll batches when performance is a priority.
Original PR description
Payslips log "Pay Slip created" in their chatter without naming the pay run that generated the payslip or the user who ran that batch. `hr.payslip._creation_message()` now names the origin in the log the record already gets: - from a pay run: `Payslip created from the pay run <run> by <user>` - created directly: `Payslip created by <user>` No second message, no extra query per payslip. For batches where even that log costs too much, the `hr_payroll.payslip_run_creation_no_message` system parameter skips it. Off by default. With it on, pay-run payslips get no creation message at all, including the generic one from task 6253290. Task 6530900
The notebook tab styling in Odoo Enterprise has been adjusted so tab labels no longer appear bold. This creates a lighter, more consistent interface and improves visual alignment with the wider application design.
Original PR description
COM: https://github.com/odoo/odoo/pull/286774 task-6527644
Reconciled bank statement lines now show the account name when the original move name is just a placeholder slash. This makes accounting records easier to read and reduces confusion during reconciliation review.
Original PR description
This commit will treat move with "/" as their name as empty, and put the name of the account in the reconciled line name task-6424612 Forward-Port-Of: odoo/enterprise#127842
Moving a document from a folder to My Drive now creates the same activity log entry as moving it to any other folder. This gives users a consistent record of where files have been moved, improving traceability across Documents.
Original PR description
This PR ensures that moving a file from a folder to My Drive creates the same chatter log as other folder move operations. This keeps file movement tracking consistent across all destinations. Task-6391383
Knowledge and Appointment website search options are now declared in a shared central place instead of separate page builder templates. This makes search configuration easier to maintain and keeps these modules aligned with the broader website search improvements.
Original PR description
The community counterpart of this commit moves the declaration of the website search scopes out of each module's builder template and into `website._get_search_scopes()`, so that a scope's label, its results page and its models are declared in one place. This commit follows that change for the knowledge and appointment scopes and removes their builder templates. Related: https://github.com/odoo/odoo/pull/279774 task-6422203
This update re-enables a test setting for continuous production scenarios in shop floor work orders. It helps ensure users can complete work orders reliably across more production use cases after a prior limitation was fixed.
Original PR description
During the continuous production cleaning, a limitation was introduced that blocked users from marking a WO as done in shopfloor. This limitation was addressed and fixed in: odoo/enterprise#125787 , so we can safely uncomment the continuous flag to ensure we are covering different usecases in the tests. Forward-Port-Of: odoo/enterprise#128911
Payroll rule parameter lookups now handle elevated access internally instead of requiring each caller to request it. This makes payroll-related calculations and reports more consistent across countries while reducing the risk of access-related errors for HR teams.
Original PR description
Move sudo inside the _get_parameter_from_code instead of calling the method with sudo. task-6518823
The web client’s underlying interface library was updated to the latest Owl release. This helps keep Odoo’s web experience current and maintainable, with limited direct impact expected for day-to-day users.
Original PR description
Release notes: https://github.com/odoo/owl/releases/tag/v3.0.0-alpha.49 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#287202
Resolved issues and error corrections
The Indian GSTR POS report tests were updated to reflect that point-of-sale session closing entries now use a dedicated closing journal. This keeps report validation aligned with the current accounting flow and helps prevent false test failures.
Original PR description
Following the introduction of a dedicated closing journal in point_of_sale, session closing entries are posted in the POSC journal rather than sharing the Orders/Invoicing journal sequence. task-id: 6446274
Features or functions removed from Odoo
Code cleanup and technical improvements
This update simplifies how Odoo's messaging features react to data changes, making chat, live chat, and discussion views more reliable and easier to maintain. It also fixes cleanup and counter-loading issues that could affect guest chat sessions and messaging menu behavior.
Original PR description
Before this commit, a field reacts to its own updates through the onUpdate option of its declaration. There is no need for that option, as the record now offers record.onChange(dependencies,…
Before this commit, a field reacts to its own updates through the onUpdate option of its declaration. There is no need for that option, as the record now offers record.onChange(dependencies, callback) for the same thing. This commit declares those reactions in setup() and removes the option with its machinery: the callbacks the model keeps per field, the observer each record registers for them, and the queue that holds the calls until the end of the update cycle. They run synchronously, once the write that changed a dependency is applied, so a callback reads a complete record and the first run of a new record sees its inserted values. A callback that would act on the default of a field before its compute or its payload lands skips its initial run. The discuss sidebar now picks its tab in setAsDiscussThread(), where the tabs of the thread are settled, rather than in a reaction to the thread. This also fixes the guest token cleanup, which deleted the channel of the new token rather than the one it had added, and stops a tab that left the menu from fetching its counters. https://github.com/odoo/enterprise/pull/130797
The Stock Delivery module will once again install automatically when both Sales Stock and Delivery are installed. This prevents businesses from missing delivery-related stock functionality after recent dependency changes.
Original PR description
The `printer` module was added to dependencies of the `stock_delivery` module. Due to that, now if `sale_stock` and `delivery` are installed, this module is not being installed automatically. This commit makes sure this module is installed if these two modules are present. task-6469674 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
Secondary badges are now easier to read in both light and dark display modes. This improves visual clarity for users by ensuring badge text and backgrounds have enough contrast.
Original PR description
Before this PR:- ========================== Secondary badges are barely visible in light and dark modes. <img width="500" height="200" alt="image" src="https://github.com/user-attachments/assets/552dd924-4ab4-4fd5-b0fe-b103697a0bb9" /> <img width="500" height="200" alt="image" src="https://github.com/user-attachments/assets/a199ad73-bd94-42dd-aa46-1fc7fb2f9436" /> After this PR:- ========================== Make the badge text and background clearly visible in both modes. <img width="1232" height="672" alt="image" src="https://github.com/user-attachments/assets/cbff2756-f2e4-42fa-97c6-669409fd4efb" />
Status indicators in kanban cards now keep a consistent size across Event, Maintenance, and Project views. This prevents cards from subtly changing height when their status changes and makes warning indicators clearer.
Original PR description
*: event, maintenance, project, web __Problem__ In kanban views, the status bubble has two issues: - The exclamation mark of `error` is too slim. - An icon and an `o_status` bullet don't take the same room: `font-size` alone doesn't constrain the glyph height exactly, so a kanban card grew or shrank slightly depending on which state it was in. __Fix__ Render the state as an `o_status` circle carrying a `priority_high` icon, scaled down to fit inside the bullet, and cap the icon with `max-height` so every state occupies the same height. Moved some SCSS rules in `web` so `event` to remove duplicate code in the other modules. task-6377407
Delivery carrier rate checks are now handled more reliably when the shipping selection window opens. This prevents DHL, FedEx, and Envia delivery workflows from failing during automated checks, helping keep shipping cost selection stable for users.
Original PR description
* - delivery_fedex_rest The delivery rate calculation now happens when `choose.delivery.carrier` wizard gets opened (see https://github.com/odoo/odoo/pull/269131). Due to that, some tests fail upon rate calculation. This commit makes sure that delivery rate is not being calculated when wizard is created. task-6276527
This fixes an issue where a measure defined by a report could disappear from the Measures menu after users deselected it and refreshed or filtered the pivot view. Business users can now reliably adjust filters and still find the original reporting options when they need them again.
Original PR description
TL;DR - we lose the measures from arch after a reload, if removed from activeMeasures Step to reproduce: - install pos, create few orders - go to reporting> orders> switch to pivot view - click the…
TL;DR - we lose the measures from arch after a reload, if removed from activeMeasures Step to reproduce: - install pos, create few orders - go to reporting> orders> switch to pivot view - click the `Measures` dropdown, `Order` is already selected - untick it, then apply some filter so that view reloads (ex order date) - reopen `Measures` dropdown, notice `Order` is missing form measures Cause: - view `view_report_pos_order_pivot` has `<field name="order_id" type="measure"/>` in its pivot view https://github.com/odoo/odoo/blob/f5c68cf0eb2ce6ec96dd4006b28466044af10e33/addons/point_of_sale/views/pos_order_report_view.xml#L10 - `order_id` is M2O field - Measure is compute from present `activeMeasure` and fields of type `["integer", "float", "monetary"]` https://github.com/odoo/odoo/blob/f5c68cf0eb2ce6ec96dd4006b28466044af10e33/addons/web/static/src/views/utils.js#L89-L120 - when the view is first loaded, `activeMeasure` all the fields with `type="measure"` which is directly passed to pivot's model as a metadata https://github.com/odoo/odoo/blob/f5c68cf0eb2ce6ec96dd4006b28466044af10e33/addons/web/static/src/views/pivot/pivot_arch_parser.js#L59-L60 https://github.com/odoo/odoo/blob/f5c68cf0eb2ce6ec96dd4006b28466044af10e33/addons/web/static/src/views/pivot/pivot_view.js#L41 - when we toggled the `order_id` from measure and reloaded, `order_id` is popped from `activeMeasure` and as it's field type is `many2one` it is not considered for `measures` in `computeReportMeasures` Fix: - maintain the measures from arch separately and feed it to `computeReportMeasures` opw-6416196 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286013 Forward-Port-Of: odoo/odoo#278850
This update makes Odoo's PDF handling work consistently with the PDF library version shipped on Ubuntu Jammy, the main supported platform for Odoo 17. It also keeps compatibility with newer library versions, reducing the risk of PDF-related errors across deployments.
Original PR description
Align pypdf usage with the PyPDF2 1.26 API used on Ubuntu Jammy, Odoo 17.0's main supported Ubuntu version, and add the missing compatibility mapping for newer pypdf versions. Forward-Port-Of: odoo/enterprise#130971
This fix makes the Sign module's automated tests work consistently with different supported PDF library versions. It helps prevent false test failures during upgrades or deployments, improving release reliability without changing user-facing signing features.
Original PR description
Prior to this commit, `PageObject` was not re-exported by `odoo.tools.pdf`, forcing tests (such as `test_origin_offset_translation` in `sign`) to patch internal module paths like `PyPDF2._page.PageObject`. This resulted in test failures depending on the installed PDF library version: - `pypdf` (>= 3.0.0): `PyPDF2` submodules no longer exist. - `PyPDF2` 1.x: `PageObject` resides in `PyPDF2.pdf` rather than `PyPDF2._page`. To resolve this: - `PageObject` has been re-exported through `odoo.tools.pdf`. - Update `test_origin_offset_translation` to import `PageObject` via `odoo.tools.pdf` and use `patch.object` with standard attribute names (`cropbox`, `add_transformation`). runbot-946795 Forward-Port-Of: odoo/enterprise#130878 Forward-Port-Of: odoo/enterprise#130017
This fixes the layout of quick create forms in kanban views so field labels appear above their fields again on desktop screens. The change improves readability and restores the expected form appearance when users quickly add new records, such as tasks in Project.
Original PR description
Since odoo/odoo@9fa0bae3d8de3e129836e73623f7112a41ac1a98, the single column layout of form views is driven only by a `media-breakpoint-down(md)` rule. The kanban quick create is a narrow container…
Since odoo/odoo@9fa0bae3d8de3e129836e73623f7112a41ac1a98, the single column layout of form views is driven only by a `media-breakpoint-down(md)` rule. The kanban quick create is a narrow container whatever the viewport, so from `md` up it fell back to the desktop two columns layout and rendered each label on the left of its field instead of above it. Scope the broken table layout to `o_kanban_quick_create_form` itself instead of to the viewport, so the quick create gets the whole `form-break-table` mixin (single column, cell max-width, field widths, input dropdown width) and not only the column count. This mirrors the `:not(.o_kanban_quick_create_form)` exclusion already used a few rules above. The quick create instantiates the form renderer directly, so `o_form_editable` lands on the same element as `o_form_view`, hence the `&.o_form_editable` compound selector. Steps to reproduce: * Go to "Project" * Select any project * Click on "New" => Bug the label is not above the field task-6501365 Code made by Claude Supervised by Romeo Fragomeli (rfr) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Corrected formatting in the Mail and Taiwan EDI ECPay app descriptions so they display properly on the Apps page. This prevents rendering errors and avoids showing raw technical text to users.
Original PR description
Two module manifests hold a `description` whose reStructuredText does not parse. Both are rendered by `ir.module.module._get_desc` (these modules have no `static/description/index.html`, so the RST…
Two module manifests hold a `description` whose reStructuredText does not parse. Both are rendered by `ir.module.module._get_desc` (these modules have no `static/description/index.html`, so the RST path is the one used on the Apps page). ### `mail` The line introducing the list of email-enabled documents is followed by a row of dashes. In reStructuredText an underline directly below a line of text makes it a section title, so docutils treats a 102-character sentence as a heading, then fails on the indented list that follows without a blank line: ``` <string>:38: (ERROR/3) Unexpected indentation. <string>:43: (WARNING/2) Block quote ends without a blank line; unexpected unindent. ``` These are logged every time the description is rendered, and the bullet list ends up rendered as a block quote instead of a list. The dashes are dropped, since the line is a regular sentence and not a section title, and the list is surrounded by blank lines. ### `l10n_tw_edi_ecpay` The whole description is indented, which makes reStructuredText read it as a block quote. A section title is not allowed inside a block quote: ``` <string>:3: (SEVERE/4) Unexpected section title. ``` At SEVERE level this reaches the default `halt_level`, so rendering raises instead of returning a document and `_get_desc` falls back to showing the raw description in a `<pre>` block. The indentation is removed. --- Checked by rendering the `description` of every manifest under `addons/` and `odoo/addons/` with the same docutils settings `_get_desc` uses: these were the only two that reported anything, and both are clean after the change. Forward-Port-Of: odoo/odoo#285323 Forward-Port-Of: odoo/odoo#284360
Preparation receipts in Point of Sale now display whole-number item quantities without unnecessary decimal places when printed through self-ordering devices. This makes kitchen and preparation tickets clearer and reduces potential confusion for staff.
Original PR description
Fix issue where integer qty were displayed as float in preparation receipt when printed through obox (self order). task-id: 6545678 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287201
This fix ensures the editor's color picker can correctly identify the solid color tab regardless of the user's language. It prevents translated labels from causing incorrect behavior, making color selection more reliable for multilingual users.
Original PR description
### Purpose of this PR: - The color picker tabs are registered with a translated name (`_t(Solid)`), and the tab button renders that name as its only content. ColorUIPlugin read the active button's `innerHTML` and compared it to the literal string Solid to know whether the solid tab was the one in use. - Rely on the `solid-tab` class instead, which is built from the untranslated tab id. task-6441654 Forward-Port-Of: odoo/odoo#279941
This update corrects how Romanian electronic invoice attachments are read, preventing errors caused by treating stored file data as text. It helps ensure Romanian EDI invoice processing continues reliably and includes test updates to confirm the behavior.
Original PR description
A previous commit (https://github.com/odoo/odoo/commit/41fe2ebdb9cc37341362d7af829c087a5f72f9f1) added an `encode` call to a line fetching the raw attachment. This assumes the attachment value is a `str`. However, the raw attachment values are actually `bytes` objects. This PR removes the `encode` call and adjusts the tests to reflect the change. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#286480
This update fixes a spelling error in the Helpdesk Auto Assignment group name. It improves clarity for users and administrators without changing functionality.
Original PR description
This commit fixes the typo in the "Auto Assignment" group. task-6542450 Forward-Port-Of: odoo/enterprise#130880 Forward-Port-Of: odoo/enterprise#130841
This fixes an issue where quickly typing and pressing Enter while creating a subtask could cause the page to show an error. The change makes the input handling more resilient when the field disappears during a save, improving reliability for users working quickly.
Original PR description
Fast Enter+type could unmount the input mid-await, leaving getEl() null while onChange still read .value directly, throwing a TypeError. Add the same null-check pattern already used in commitChanges. Steps to reproduce: 1. Go to a project and open a task in form view. 2. Create a subtask, type quickly, and press Enter immediately. 3. Repeat until the error occurs. Task-6428344 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The point-of-sale self-order experience now includes a missing compatibility fix needed during carousel transitions. This prevents an error that could occur when a carousel is closed mid-transition, improving reliability for customers using self-ordering.
Original PR description
Due to the `executeAfterTransition` fix not being included in the self order assets, a traceback would occur when the carousel component was disposed during a transition. This commit fixes the issue by including the fix file in the manifest, however some guards needed to be added due to self order not including some of the bootstrap assets. runbot-946931 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Dialog windows no longer show view switching or embedded action controls that cannot work correctly in that context. This prevents users from clicking options that appear available but do nothing or affect the background screen instead of the dialog.
Original PR description
Two elements of the control panel navigate in the current action, which isn't the action of the dialog when the action is displayed in one (target="new"), so they can't work there: - The view…
Two elements of the control panel navigate in the current action, which isn't the action of the dialog when the action is displayed in one (target="new"), so they can't work there: - The view switcher: switchView ignores all calls as soon as a dialog is open. This was done in commit [1] to fix a crash, but the switcher itself kept being displayed, so an action in target="new" with several multi record views (e.g. voip.cloud_storage_error_apps_action) displayed a view switcher that did nothing. - The embedded actions panel (added in [2]): selecting an embedded action calls doActionButton with stackPosition="replaceCurrentAction", which would replace the action in background while the dialog stays open. No action in the standard code is in that situation, so this one was only latent. The view switcher entries and the embedded actions are now both left empty for an action in target="new", which removes the switcher buttons, their small screen dropdown, the corresponding commands of the command palette and the embedded actions panel at once. [1]: https://github.com/odoo/odoo/commit/a40cbf9f040338cae31eb048002e33d10ee610f0 [2]: https://github.com/odoo/odoo/commit/f983703dfa3c5102fa818523ae419a70cc4b5230
A missing view update was added so the partner autocomplete screen correctly matches a recent script change. This prevents the feature from referencing outdated interface elements and helps keep partner lookup working as expected.
Original PR description
This commit : 66889d7c42d0247d6d7b72e742c5687c65009587 changed the JS import but not the XML tag in the view. no-task
Spreadsheet global filter labels are now easier to see. This helps users quickly identify active filters and reduces confusion when working with spreadsheets.
Original PR description
Before this commit: The global filter's pill was not visible enough for the user. Added back the "bg-primary" class that was applied in anterior versions. Task: 6535214
The accounting logo is now displayed correctly in tax return activities. This makes these activities easier to recognize and keeps the accounting experience visually consistent for users.
Original PR description
Before PR: - Accounting logo was not visible in Tax return activities. After PR: - Accounting logo is visible in Tax return activities. task-6463584 Forward-Port-Of: odoo/enterprise#130721 Forward-Port-Of: odoo/enterprise#129501
This fix prevents Point of Sale from trying to reload register data after a session has already been closed. It avoids an error that could interrupt synchronization and helps keep end-of-day register closing more reliable.
Original PR description
When the client dispatches a synchronisation right after closing the register, `_notify_synchronisation` still calls `load_data` on `current_session_id`, which is then empty. The empty session leads to an empty `pos.config`, and `product.template._load_pos_metadata` raises an IndexError while accessing `data['pos.config']['records'][0]`. Skip the loading in that case and only send the notification, as there is nothing to load without an open session. Runbot Error-[946591](https://runbot.odoo.com/odoo/error/946591) Task-[6522054](https://www.odoo.com/odoo/project/1737/tasks/6522054)
The messaging menu now presents empty tab content with better spacing and more balanced text, making it easier to read. It also clears the search field when users switch tabs, avoiding confusing filtered results from a previous tab.
Original PR description
See details in each commit. Summary: - less bloated in "channels" empty tab, with more spacing - more balanced text of all empty tabs - clear search term on tab change <img width="727" height="1142" alt="Screenshot 2026-09-09 at 00 30 13" src="https://github.com/user-attachments/assets/46acff39-ee92-4cf6-8504-c915dcc3db27" />
The Discuss app header now correctly sizes itself when a private chat shows both a short contact name and local time information. This prevents text from being cut off or overflowing, making chat headers clearer for users in different time zones.
Original PR description
Before this commit, when making a private chat conversation with someone with a short name and with different timezone, the header of the Discuss app was narrower than its text content. This happens because the computation of header size was not taking into account the subtitle part, which this commit fixes. Before / After <img width="172" height="60" alt="Screenshot 2026-09-07 at 21 47 21" src="https://github.com/user-attachments/assets/2644d712-4a50-4e0e-bd08-538ecc366eb9" /> <img width="189" height="62" alt="Screenshot 2026-09-07 at 21 47 07" src="https://github.com/user-attachments/assets/f0ef502c-431b-4a12-8c9a-5407460e5690" />
The GST token refresh process no longer overwrites the stored token with an empty or unrelated response value. This helps prevent avoidable GST reporting authentication issues while keeping the existing token valid for longer as intended.
Original PR description
Previously, `_cron_refresh_gst_token` updated the value of `l10n_in_gstr_gst_token` when refreshing the GST token using `response.get('txn')`.
However, the response received during a token refresh is: `{'status_cd': '1', 'status_desc': 'If previous Auth Token is found'}`
The GST token itself remains unchanged during a refresh; only its validity is extended. Therefore, writing `l10n_in_gstr_gst_token` with `response.get('txn')` is unnecessary and incorrect.
This commit removes that write operation.
Forward-Port-Of: odoo/enterprise#130726
Forward-Port-Of: odoo/enterprise#130313French invoices now show the “VAT due on debits” wording only when it is relevant for service taxes with a non-zero amount. This prevents misleading or unnecessary wording on export and international invoices with 0% VAT, improving invoice accuracy for French accounting compliance.
Original PR description
**Purpose** Follow-up to fix two issues reported in #277109 regarding the "TVA exigible d'après les débits" mention on French invoices. **Fixes Applied** 1. **Tax Scope Mismatch:** Changed `t.tax_scope == 'consu'` to `t.tax_scope == 'service'`. To trigger the exigibility mention on a service product, the user will configure a proper "service" scoped tax, not a goods tax. 2. **International/Export Invoices:** Added a check for `amount != 0`. Previously, the mention would print on international export invoices if the applied 0% tax had exigibility set to `on_invoice`. This hides the redundant mention for 0% exports. Forward-Port-Of: odoo/odoo#277468
This update removes an unnecessary warning that appeared when generating manufacturing accounting reports with demo data. It keeps the report behavior unchanged while making automated checks cleaner and reducing noise for maintainers.
Original PR description
Runbot was showing warnings when running the test_reports test with the mrp_account and project_timesheet_forecast modules installed with demo data.
```
Unknown directives or unused attributes: {'data-oe-demo'} from <t t-out="', '.join(docs.account_id.mapped('name'))" data-oe-demo="Acme Corp."/>
```
**Root cause:**
Since data-oe-demo is an html attribute usage of it within `<t>` tag raises a warning after this [commit](
https://github.com/odoo/odoo/commit/ae4824640665fc639e03a13c341f18e73060349e) in saas-19.1.
**Solution:**
Usage of span tag instead of <t> tag ensures the same behaviour without the warning.
[runbot-939604](https://runbot.odoo.com/odoo/error/939604)
Forward-Port-Of: odoo/odoo#285666This fixes an internal test issue where a shell-based test could hang when a database environment setting was present. It helps keep Odoo's automated test suite reliable and reduces delays for developers validating changes.
Original PR description
TestCommand.test_shell spawns a subprocess running `odoo-bin shell` with stdin/stdout piped through a pty. When PGDATABASE is set in the environment, that subprocess inherits it and resolves the same db_name as the parent test process, then calls Registry(dbname) to open a shell console against it. Steps to reproduce: - export PGDATABASE=db_name - ./odoo-bin -i test_core --test-tags .test_shell Forward-Port-Of: odoo/odoo#287137
The Hong Kong payroll payment report now handles employees who do not have an identification or passport number recorded. This prevents the report from failing and allows payroll teams to generate payment reports reliably even when optional ID details are missing.
Original PR description
When both identification_id and passport_id are empty (False), re.sub() receives a bool and raises: TypeError: expected string or bytes-like object, got 'bool'. Fall back to an empty string and normalize the passport fallback the same way as the HKID. Task-6536846
This change removes obsolete internal code across several business applications and tightens development checks around method overrides. It should make future maintenance safer without changing day-to-day user workflows.
Original PR description
https://github.com/odoo/odoo/pull/287134
This update simplifies how AI and VoIP components react to internal data changes. It supports cleaner, more consistent code with no expected impact on day-to-day user workflows.
Original PR description
Enterprise counterpart of "[REF] mail, *: drop the onUpdate option for onChange", which explains the why and the shape. https://github.com/odoo/odoo/pull/287153
This update simplifies how Odoo's web code accesses browser features, making the codebase more consistent and easier to maintain. It also improves test reliability when browser storage is unavailable, with no expected change for everyday users.
Original PR description
- enterprise: https://github.com/odoo/enterprise/pull/127791 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update simplifies how several Odoo apps access browser navigation information, replacing an older internal shortcut with a clearer approach. It should not change day-to-day user workflows, but it makes the codebase easier to maintain and test over time.
Original PR description
- community: https://github.com/odoo/odoo/pull/282230 See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update modernizes internal Web Studio components to align with the latest interface framework standards. It helps keep Studio reliable and easier to maintain, with no expected change to everyday user workflows.
Original PR description
See commit messages for details. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The website editor's row-building component was updated to use the newer supported framework behavior, reducing future maintenance risk. A related automated test was added to help ensure the collapse animation continues to work as expected.
Original PR description
Replaced `useLayoutEffect` with native OWL3 `useEffect` because `useLayoutEffect` is deprecated in OWL3. When commenting out the useLayoutEffect there was no error, the code we refactored had NO TEST coverage (see: https://runbot.odoo.com/runbot/batch/2596770/build/114856026) A HOOT test covering the collapse height animation was added to existing test (which I felt was better then adding new hoot tests).
The Knowledge app’s chatter integration was updated to use the newer framework lifecycle approach required by OWL3. This is an internal maintenance change that helps preserve existing access-rights behavior and reduces future upgrade risk, with no intended functional change for users.
Original PR description
Replaced `useLayoutEffect` with `onMounted`/`onPatched` because `useLayoutEffect` is deprecated in OWL3. Access rights are mail-store record fields mutated in place (not signals), so we keep the threadId reset and rights resolve in a single onMounted/onPatched pass to track them and avoid a race. When commenting out the useLayoutEffect there was no error, the code we refactored had NO TEST coverage (see: https://runbot.odoo.com/runbot/batch/2603405/build/115293984) NOTE: - I tried writing a hoot for this untested feature but the setup is too complex and not worth it.
This update keeps WhatsApp conversation controls working correctly by replacing an outdated internal mechanism with the current framework approach. Users should see no change in day-to-day behavior, while blocked and revived WhatsApp conversation states remain properly handled.
Original PR description
Replaced `useLayoutEffect` with native OWL3 `useEffect` because `useLayoutEffect` is deprecated in OWL3. The useLayoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - @whatsapp/composer_patch/Composer is disabled for blocked whatsapp conversations - @whatsapp/composer_patch/Disabled composer should be enabled after message from whatsapp user - @whatsapp/composer_patch/'Revive WhatsApp Conversation' button is hidden for active or blocked whatsapp channels see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2748318/build/124302613
This update modernizes an internal payroll screen component to stay compatible with the next version of Odoo's web framework. Existing payroll interactions, including payrun chatter controls and payslip list actions, are preserved and covered by tests.
Original PR description
Replaced `useLayoutEffect` with `onMounted` + `useBus` because `useLayoutEffect` is deprecated in OWL3. The use layoutEffect refactored in this PR had test coverage — below are some tests that failed when the effect was commented out, and are now passing: - @hr_payroll/payrun_chatter/PayRunControlPanel - chatter toggle button - @hr_payroll/payslip_list_view_filtered_payrun/Test context of PayRunCard - @hr_payroll/payslip_list_view_filtered_payrun/Test header buttons of payslip list view filtered by payrun see commented-out runbot build: https://runbot.odoo.com/runbot/batch/2748319/build/124302621
The web tour functionality has been reorganized internally so it works through the newer plugin structure while keeping existing integrations compatible. This should make future maintenance and enhancements easier without changing the day-to-day user experience.
Original PR description
Converts TourService into an owl3 Plugin (TourPlugin), keeping the legacy tour_service registration as a compatibility bridge. Extracts the tour recorder overlay/command-provider logic into their own TourRecorderPlugin and the debug-menu OnboardingItem widget. 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