Wednesday, September 9, 2026
28 changes · master
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
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