Thursday, September 10, 2026
40 changes · master
Resolved issues and error corrections
Website header link style options now display correctly across vertical layouts such as mobile, hamburger, and sidebar menus. This keeps navigation design consistent and improves the appearance of menu items when background colors are used.
Original PR description
In this 19.0 commit[1] we reintroduced the link style option on every headers while it was previously disabled on mobile, sidebar and hamburger. However since these templates where not styled to support the link style option, the result was not optimal. This commit adapts the current vertical navigation header to support the link styles options. Fixes the color on accordion items with a background color to match what we do in our dropdown items in non-vertical headers. Step to reproduce: - Choose a vertical header (hamburger, sidebar, or mobile viewport) - Change the link style to any value - Design is not adapted to fit vertical header style. task-5900600 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an error that could appear when Odoo sends emails after completing database setup or module installation in translated environments such as French. Emails now use the active environment for translations, preventing unnecessary log errors and improving reliability of automated email delivery.
Original PR description
Currently an exception is generated when the `send_after_commit` tries to send the email as below step: - Create a database without demo data and language `fr_FR` - Install the `appointment` module -…
Currently an exception is generated when the `send_after_commit` tries to send the email as below step: - Create a database without demo data and language `fr_FR` - Install the `appointment` module - Set up outgoing email server - Error appears in the log when loading the demo data Error: `TypeError:'NoneType' object is not subscriptable` This issue occurs after the recent refactoring changes in [1]. The method `send_after_commit` (see[2]) sends the email with a new cursor after committing to the current cursor, and here when `_send()` tries to send the mail, it uses the `_()` method for translation, which accesses `self.env` (self refers to the old closed cursor). However, at this point, the cursor is already closed. As a result, when the code at [3] is reached from `ormcache`, it raises the above error because `model.env.transaction.ormcaches__` is `None` (code ref [4]). This commit fixes the above issue by using `self.env._()` for translation instead of `_()` while sending the mail to ensure the translation accesses the current environment cursor instead of the closed one. [1]: https://github.com/odoo/odoo/commit/13c3adf3a8b5ba6325190d6b9aea45fb8a6a8b2f [2]: https://github.com/odoo/odoo/blob/86d750e777d1adc09f53016a255c7b1158fd309c/addons/mail/models/mail_mail.py#L708-L713 [3]: https://github.com/odoo/odoo/blob/5ef7829895b2e05650da394c1e35dfdc3a23c066/odoo/orm/cache.py#L111 [4]: https://github.com/odoo/odoo/blob/5ef7829895b2e05650da394c1e35dfdc3a23c066/odoo/orm/environments.py#L1012 Sentry-7608119520 Forward-Port-Of: odoo/odoo#287438
The demo payroll setup for Belgium now enables the joint committees used by the sample data. This ensures related salary rules and records are active, making demos and tests behave as expected.
Original PR description
JC 200, 302, and 999 are used in demo data. They should be enabled to activate the salary rules and other related records. task-6563586
This fix makes an automated spreadsheet reporting test more reliable when the server responds slowly. It reduces false failures by allowing more time for the spreadsheet to open and ensuring each step waits for the correct screen before continuing.
Original PR description
Before the tour was undeterministic because if the server was slow, it would fail by: 1: timeout was too short when opening the spreadsheet 2: some steps ran faster than the view could handle and ran on the previous view instead of the new view to be loaded.
This fixes an internal website test so it consistently uses mocked image search services instead of trying to contact external providers. It helps keep automated testing stable and prevents false failures during development and release checks.
Original PR description
test_02_image_upload_progress_unsplash monkeypatches HTML_Editor.media_library_search and Web_Unsplash.fetch_unsplash_images to avoid calling third-party APIs during the tour. But the routing map is cached (the "routing" ormcache) with the controller endpoints baked in: when it was already built with the original methods, the patches above are ignored. The original media_library_search then runs and performs a real HTTP request, which is blocked by the test suite, failing the tour with "Couldn't reach API endpoint". Invalidate the "routing" ormcache after patching so the requests are routed to the patched methods. Same change as done in https://github.com/odoo/odoo/pull/271536. https://runbot.odoo.com/odoo/error/939945 Forward-Port-Of: odoo/odoo#287586
Fixes overly bright borders and low-contrast elements in Discuss when using dark theme. Livechat disconnect banners and poll styling are also adjusted so messages remain easier to read and the interface looks consistent across themes.
Original PR description
Before this commit, Discuss borders in dark theme were very light. This happens because Discuss used border-secondary as this provided the consistent look between white and dark theme, which the…
Before this commit, Discuss borders in dark theme were very light. This happens because Discuss used border-secondary as this provided the consistent look between white and dark theme, which the default border didn't: the default border was too distracting in dark theme, making the UI look bloated. With frost, the default border now look consistent between white and dark themes. A recent PR changed border-secondary to be much more visible in dark theme [1], which goes against the intended look in Discuss. This commit fixes the issue by removing most border-secondary in Discuss UI, relying on default border that gives the intended look. The recent PR [1] also impacted: - the livechat "disconnect" banner bg color, which made it barely readable in dark theme. This is fixed in this commit by using `.alert` like the unread message banner. - the poll secondary color, in both white and dark theme. This commit reduce the opacity so this made secondary compared to o-action and primary colors as intended. [1]: https://github.com/odoo/enterprise/pull/129792
Icon buttons for email, phone, URL, bank tags, and related-record fields now use the same visual style. This makes forms look more consistent and removes an unwanted light border on mobile in dark mode.
Original PR description
The email, url, phone and many2one internal link buttons each hand-rolled their own `btn-*` combination, so the same button looked different from one field to the next. They now share `btn btn-light btn-sm`. The M3 mobile pill drops the border `btn-light` brings along, which showed as a light rim in dark mode. task-6528417 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures barcode picking batches can reliably find their default source location, even when that information was not already loaded. It helps avoid errors or interruptions during warehouse barcode operations.
Original PR description
Previous commit 62c570a4 [1] from odoo/enterprise#117220 introduces a new getter on BarcodePickingBatchModel: `operationSourceLocation`. The issue comes from `default_location_src_id` which is not guaranteed to be in cache. [^1] 62c570a47cc1884cb31c4e1288b86dfab37daadf Forward-Port-Of: odoo/enterprise#130823
Spreadsheet test sessions now avoid cell animations that could freeze in debug mode and show incorrect cell values. This makes internal test results more reliable without changing normal user spreadsheet behavior.
Original PR description
If you try to open a spreadsheet in debug mode in the Hoot tests, you will often end up with cells with wrong displayed data. That's because cell animations don't work in hoot (it patches `requestAnimationFrame`), so we end up with cell animations stuck in the first frame of the animation. We can simply disable the cell animations in the Hoot tests, as animations are not relevant to the tests. Task: [4909027](https://www.odoo.com/odoo/2328/tasks/4909027) Forward-Port-Of: odoo/odoo#216620
This fixes an issue where extra action menus appeared inside pop-up selection dialogs after a visual change made an older hiding rule stop working. Users will no longer see confusing or irrelevant menu options in those dialogs, making the interface cleaner and more consistent.
Original PR description
The cog menu is displayed in the dialogs that keep a control panel: the SelectCreateDialog and act_window actions in target="new" showing a list or a kanban view. Form views in a dialog are spared,…
The cog menu is displayed in the dialogs that keep a control panel: the SelectCreateDialog and act_window actions in target="new" showing a list or a kanban view. Form views in a dialog are spared, as they drop their control panel altogether. It used to be hidden by a CSS rule matching the settings icon of the toggler. a243283b393a restyled that toggler and swapped its icon for `more_vert`, which silently voided the rule for the CogMenu (the ActionMenus, still using the settings icon, stayed hidden). Hide the menus where they are rendered rather than from a stylesheet, so that this no longer depends on the icon of the toggler, and drop the CSS rule, which has nothing left to hide: outside of a dialog, the only other element carrying the `modal` class is the FileViewer, and it renders no action menus (the Documents preview, which does, sets `modal` to false). Steps to reproduce: - open any form view with a many2one field, e.g. Sales > Orders > New - click the Customer field and pick "Search More..." - the dialog shows the cog menu on the left of its control panel Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The payroll dashboard button for opening pay runs now shows the correct payroll runs instead of an empty window. This helps payroll users quickly access the relevant pay run records from the dashboard without extra searching or confusion.
Original PR description
-Previously, upon clicking "Open Pay Run" button in payroll dashboard, it redirects to an empty window. -The domain for the records has been adjusted to show the correct payruns.
Installing the India Payroll module could fail because demo data still referenced a removed health insurance amount field. This update removes that outdated demo data value so the module can be installed successfully.
Original PR description
Steps to reproduce: - try to install l10n_in_hr_payroll Reason: - in this PR total_amount was removed https://github.com/odoo/upgrade/pull/11155 - total_amount field was not removed from the the health insureance record in indian localization Fix: - Remove total_amount from the demo data. task-6563549
Calendar reminder notifications now show line breaks properly instead of displaying raw HTML text. Related tests were updated so reminder notification checks handle the expected message formats more reliably.
Original PR description
This PR fixes 2 bus related to calendar alarm notification messages. The first bug prevented the message to be correctly displayed. The message displayed the <br/> hmtl tag instead of creating new lines. The second bug is related to tests. Some test related to notification messages couldn't handle the various format of messages.
The HTML editor module no longer declares an unnecessary dependency on website routing code. This keeps the module setup cleaner and avoids pulling in unrelated functionality when the editor is installed.
Original PR description
The dependency is wrong. The function `_get_translation_frontend_modules_name` is simply dead code. Issue introduced in #287134 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The editor color picker now displays borders and focus indicators that fit the dark mode interface. This makes choosing and editing colors clearer for users working in dark mode, while preserving the HTML builder’s existing background styling.
Original PR description
[FIX] html_builder, html_editor: adapt color picker to dark mode Steps to reproduce: - Enable dark mode in the backend. - Open a color picker from the editor toolbar. - Check the swatch borders and the focused custom color controls. Before this commit, the color picker relied on fixed light toolbar colors. Its borders and focus rings did not match the dark popover. After this commit, the color picker uses the popover and body colors, while the HTML builder keeps its own background color. task-6259086
Kanban views that include progress bars no longer flicker when opened or refreshed. This improves the visual experience for users working in apps such as Project without changing functionality.
Original PR description
The progressbar in the kanban views (eg. Project) previously relied on a min-height computation. Frost moved the `fs-4` from the `o_column_title` to the `o_kanban_header` which breaks the computation. This creates a visible flicker when the view load, to reproduce just go in a project and click the kanban view button multiple times. task-6558904 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix restores the expected spacing between grouped buttons in the Community edition after a recent design update removed it. It keeps the interface visually consistent and easier to use, while allowing the Enterprise edition to apply its own styling separately.
Original PR description
After frost reskin, `btn-group` spacing has disappeared. We still need it for community design so we restore it here and override it in enterprise. ENT: https://github.com/odoo/enterprise/pull/130287 task-6519485 | Before | After | |--------|--------| | <img width="309" height="49" alt="Screenshot 2026-09-04 at 09 16 14" src="https://github.com/user-attachments/assets/5f5f5151-30a7-4d7b-97f0-dd1fa5ac3b6c" /> | <img width="313" height="47" alt="Screenshot 2026-09-04 at 09 16 50" src="https://github.com/user-attachments/assets/8a8bd76d-3068-4039-8144-54276a1ab0d9" /> | --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Mobile views no longer show each total line inside its own outlined field box in subtotal sections. This keeps invoices, quotations, purchase orders, expenses, PoS orders, and related totals easier to read on small screens while preserving needed spacing for multi-line total blocks.
Original PR description
On small screens, the M3 style wraps every cell of an inner group in an outlined box with a floating label. Applied to the subtotal footers (invoice, quotation, purchase order, PoS order, ...), this framed each amount individually, which is noisy: those groups are already visually delimited by the footer itself and read as a totals block, not as a list of editable fields. Exclude `.oe_subtotal_footer` groups from the field box and floating label rules, so their amounts and labels stay plain on mobile. The box also carried the vertical rhythm (the inner group row gap is 0 below md), so add the spacing back in the few views whose footer stacks several rows. task-6522832 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The time off summary now counts only leave taken in the selected year instead of including leave from other years. This prevents inflated totals and gives managers and employees an accurate yearly view of absences.
Original PR description
**Steps to reproduce:** - Create a sick time off for employee A in 2025 - Create a sick time off for employee B in 2026 **Current** Summary 2026 show all years summary -> 2 day **Expected** Summary 2026 should only show the current year time summary -> 1 day task-6445187
This update adjusts internal tests so they work correctly with recent changes to the test runner in debug mode. It helps keep development and quality checks reliable for the Mail and Spreadsheet areas without changing customer-facing behavior.
Original PR description
Since commit f83282086a412b6560b20186230cfd8daf56e4f9, the hoot `__debug__` helper returns a function that returns the hoot runner rather than the runner itself. Some tests weren't adapted. Task: [6560305](https://www.odoo.com/web#id=6560305&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) 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#287440
Creating a new job position no longer shows the same creation message twice in the chatter log. This keeps recruitment activity history cleaner and avoids confusion for users reviewing job position updates.
Original PR description
When creating a new job position, "Job Position created" was rendered twice in the chatter log. This occurred because the mail subtype definition specified a redundant `description` field with the exact same text as the subtype's name, causing the chatter logic to display both. Removing the explicit `description` field ensures the message is only displayed once upon job creation. Task: 6486002 Forward-Port-Of: odoo/odoo#285018
This change removes an earlier workaround for return deadline date color contrast because a separate update already fixed the underlying issue. It helps keep the accounting reports interface consistent and avoids conflicting visual changes.
Original PR description
This reverts commit d2b55b42c0ffb5515faee4b77486bd4da6c93d58. Reason: the fix conflicted with this other commit https://github.com/odoo/enterprise/commit/64b1482a12605aa460324df904df2c8816fdc616 which solved the root caused of the contrast issue.
The AI website feature now uses the updated shared icon search system after icon information was moved in the platform. This keeps icon selection working correctly and avoids unnecessary searching once a match is found.
Original PR description
[FIX] ai_website: adapt to the moved icon index --- The icon metadata moved to `web/icons.py`, next to the fonts it describes, and its index is now private behind a `search_icons()` generator: `_find_icon_by_keywords` no longer has to reach into an html_editor controller for `MS_ICONS_INDEX`, nor restate what makes an icon match. It also stops scanning the whole set once it has its first hit. + Community PR: odoo/odoo#286248
Button groups in dark mode now show visible separation between secondary buttons instead of appearing merged together. This improves visual clarity and keeps the interface more consistent between light and dark modes.
Original PR description
After the frost reskin, btn-groups in dark mode appeared united, since we were using a background color that is the same as the border color. This commit makes the secondary buttons in dark mode use the same design as in light mode, which fixes the border issue in btn-groups while making the interface more consistent in both color modes. COM: https://github.com/odoo/odoo/pull/286452 task-6519485 | Before | After | |--------|--------| | <img width="353" height="53" alt="Screenshot 2026-09-04 at 09 17 34" src="https://github.com/user-attachments/assets/5529404c-c6dc-4ebb-bee6-2ff418cd9510" /> | <img width="345" height="52" alt="Screenshot 2026-09-04 at 09 17 04" src="https://github.com/user-attachments/assets/8fb1c2d7-e399-4fce-ab34-79fc886547e0" /> |
The time off summary now counts absences only for the relevant year instead of combining records from multiple years. This prevents inflated totals and helps payroll or HR teams review yearly leave balances accurately.
Original PR description
Steps to reproduce: - Create a sick time off for employee A in 2025 - Create a sick time off for employee B in 2026 - In the view form of the time off created, summary 2026 shows 2 days Current Summary 2026 show all years summary -> 2 days Expected Summary 2026 should only show the current year time summary -> 1 day task-6445187
The spreadsheet pivot menu now shows the global filter option only when it applies to pivot header cells. This prevents users from seeing an irrelevant action on regular pivot formula cells, reducing confusion when working with spreadsheet reports.
Original PR description
The context menu (and clickable cell) `use_global_filter` should take the value of the underlying pivot formula, and apply it to the matching global filters. This works, but was supposed to work only for `ODOO.PIVOT.HEADER` formulas, and not simple `ODOO.PIVOT` formulas. This commit fixes the visibility of the `use_global_filter` option in the context menu, so that it is only visible for `ODOO.PIVOT.HEADER`. Also removed/changed tests that were testing that the menu was visible for positional `ODOO.PIVOT` formulas. Task: [3714696](https://www.odoo.com/web#id=3714696&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Indian e-invoicing check now opens a list only when missing e-invoices are actually found, and that list is limited to the specific affected invoices. This prevents users from seeing unrelated or misleading invoice results during compliance checks.
Original PR description
The `missing_einvoice` check passed custom `views` but no explicit `domain`, so its action ignored the `moves` recordset and instead opened all matching `account.move` records — an unfiltered list when no invoices were missing, and every eligible invoice (not just the flagged ones) otherwise.
Guard the action to only build when `moves` is non-empty, and pass `domain=[('id', 'in', moves.ids)]` so it's always scoped to the invoices actually found.
task-6544790
Forward-Port-Of: odoo/enterprise#130483The web code editor now correctly allows protected attributes in self-closing QWeb tags to be overwritten or deleted when appropriate. This prevents unnecessary editing restrictions and makes template editing behave consistently for users.
Original PR description
Currently, when we get readonly attributes to prevent overwriting or deletion, we only ignore them if the selection that is being modified is contained between `<>` tags. To rectify this behavior, we also include the `<\>` self closing tags so that they may also be overwritten/deleted. opw-6325841 Forward-Port-Of: odoo/odoo#287393
The Timesheet Assistant now avoids using partners that do not have an email address when generating sample data. This prevents a crash and lets users continue creating sample timesheet data reliably.
Original PR description
Forward-Port-Of: odoo/enterprise#131002
Codaclean payroll document labels and related settings have been renamed from SODA to CODB to match the correct file type. This reduces confusion for Belgian payroll users and keeps Codaclean terminology distinct from Codabox SODA files.
Original PR description
CODB files are the payroll documents that are used for codaclean, they are the equivalent for SODA files from codabox. This pr should rename the files, functions, etc for codaclean so that it is CODB instead of SODA. task-6543478
Property definition fields no longer show an empty input box on mobile when there is no value to display. This removes a confusing visual artifact and makes the form layout clearer for users on smaller screens.
Original PR description
- Definition widgets already omit PropertyValue, but the leftover value wrapper was still drawn as an input box on mobile. Remove that wrapper and apply the mobile field-box layout only when a value node exists. task-6542816
This change makes an internal web-related test run consistently instead of failing unpredictably. It helps keep automated quality checks stable, reducing false alarms during development without changing customer-facing behavior.
Original PR description
[runbot-947020](https://runbot.odoo.com/odoo/runbot.build.error/947020) 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#287463
This fix makes Odoo's PDF tools expose a shared PDF page component consistently across supported PDF library versions. It helps prevent automated test failures caused by differences between installed PDF libraries, improving reliability for maintenance and upgrades.
Original PR description
Prior to this commit, `PageObject` was not re-exported by `odoo.tools.pdf`, forcing tests 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, this commit re-exports `PageObject` through `odoo.tools.pdf` across all backend wrappers. runbot-946795 Forward-Port-Of: odoo/odoo#287298 Forward-Port-Of: odoo/odoo#285978
The AI agent's “snappy and creative” response style now uses a lighter reasoning setting, making it more distinct from the standard style. This helps align AI behavior with the selected response tone and avoids unnecessary processing for shorter, more creative replies.
Original PR description
Prior to this commit, the response style `snappy_and_creative` configuration for agent has been using the same reasoning level as the `standard` response style. With the response style instructions being dropped in prior commit, we now lower the reasoning from `standard` to `minimal` (`none`) so that it reflects better its category, and so that we have a proper distinction between different response style. Forward-Port-Of: odoo/enterprise#129804
This fix ensures the company's designated project folder cannot be archived by mistake. It protects an important Documents and Projects configuration from being disabled, helping teams avoid disruptions when managing project files.
Original PR description
The company's project folder is supposed to be [impossible](https://github.com/odoo/enterprise/blob/20cc61e69aa3f6a59de1e962b25ce11fa402bf22/documents_project/models/documents_document.py#L44) to archive, by using the `_unlink_except_company_folders` logic. However, the method that adds the company field to the list of fields to check was missing, so it was still possible to archive a folder set as projects folder. Forward-Port-Of: odoo/enterprise#120605
This fixes an internal event portal test that could fail when subscription demo data was installed. The test now assigns the correct salesperson when creating a sales order, preventing unintended access-right conflicts and improving reliability.
Original PR description
Purpose ======= Fix the event "test_portal_access" test where the sales order creation would raise an access error when 'sale_subscription' is installed. Specification ============= The demo data in 'sale_subscription' assigned 'Mitchell Admin' as sales person for 'partner_portal'. As the 'user_id' field wasn't specified when creating the sales order in the test, the '_compute_user_id' method would assign the 'partner_portal' sales person, aka mitchell admin, as 'user_id'. This assignation made the 'sale_order_personal_rule' security rule fail as the user 'user_sales_salesman' isn't the partner 'user_id' anymore and doesn't have the right to create a sales order for that partner. => Fixing that by making sure the 'user_id' of the sales order is correctly set to 'user_sales_salesman' on creation to prevent the compute from messing up the rights. Task-6560355 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents Point of Sale settings from adding a manager's employee record from the wrong company when saving a PoS configuration in a multi-company setup. It helps keep employee access lists accurate for each company and avoids cross-company data being linked by mistake.
Original PR description
Steps to reproduce: - multi-company database, PoS Manager user with an employee in each company - current company set to company A - open the settings of a PoS configuration belonging to company B…
Steps to reproduce: - multi-company database, PoS Manager user with an employee in each company - current company set to company A - open the settings of a PoS configuration belonging to company B and save Issue: The advanced_employee_ids of company B's PoS now also contains the manager's employee of company A, an employee from another company. Cause: res.config.settings.create() appends the PoS managers' employees with `_get_group_pos_manager().user_ids.employee_id`. res.users.employee_id is computed for the current company (self.env.company), not for the company of the pos.config being edited, so the employees of the active company are linked instead of the PoS company's. pos.config.write() already resolves them with `with_company(config.company_id)` since fccccf6cabe5, but the settings path was left unscoped. Fix: Resolve employee_id with `with_company(config.company_id)` in the settings create, as done in pos.config.write(). Single-company databases are unaffected. opw-6544518 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#287182
On mobile devices, opening a full-screen image preview now hides the editor toolbar and dismisses the keyboard. This keeps the preview controls accessible, making image viewing and editing smoother for users.
Original PR description
When displaying the full screen image preview lightbox on mobile, the toolbar remains displayed. Because of this, the toolbar of the lightbox cannot be accessed. This commit hides the toolbar when a lightbox is displayed. task-6370220 Forward-Port-Of: odoo/odoo#287268 Forward-Port-Of: odoo/odoo#274949
Sold-out event tickets are now correctly reported as unavailable instead of being treated as if more tickets could still be ordered. This prevents future checkout or registration flows from showing incorrect purchase limits for fully booked ticket or time-slot combinations.
Original PR description
### Steps to reproduce: event = env['event.event'].create({ 'name': 'Repro Event', 'date_begin': '2026-09-01 08:00:00', 'date_end': '2026-09-01 18:00:00', }) ticket =…
### Steps to reproduce:
event = env['event.event'].create({
'name': 'Repro Event',
'date_begin': '2026-09-01 08:00:00',
'date_end': '2026-09-01 18:00:00',
})
ticket = env['event.event.ticket'].create({
'event_id': event.id,
'name': 'VIP',
'seats_limited': True,
'seats_max': 1,
})
env['event.registration'].create({
'event_id': event.id,
'event_ticket_id': ticket.id,
'name': 'Attendee 1',
'state': 'open',
})
ticket.seats_available -> 0
ticket.is_sold_out -> True
result = ticket._get_current_limit_per_order(event=event) print(result) # {ticket.id: 30} -- expected {ticket.id: 0}
### Issue and Expected
`_get_current_limit_per_order()` used `if not seats_available:` to detect the "no limit" case returned by `_get_seats_availability()`. That check is truthy for both `None` (genuinely no limit) and the integer `0` (fully booked), so a sold-out ticket/slot combination was incorrectly treated as unlimited and returned `limit_max_per_order or EVENT_MAX_TICKETS` (e.g. 30) instead of `0`.
### Fix
`_get_seats_availability()` explicitly documents `None` as the "no limit" sentinel, with `0` meaning "constrained, zero seats left". Use `seats_available is None` to preserve that distinction instead of a falsy check.
No functional regression was found in the current website_event flow: sold-out slots/tickets are filtered or re-derived independently before reaching this value in every existing UI path. This fixes the underlying contract of the method itself, so future or additional callers don't inherit the wrong value.
https://github.com/odoo/odoo/issues/284098
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#284100This fixes a test issue in the mail testing module where large user ID numbers could be displayed differently than expected. The change helps prevent false test failures when running the full test suite, improving reliability without affecting end users.
Original PR description
When calling message_post() with custom tracking_values, the new_value field is rendered verbatim by the QWeb template into the message body. Automatic tracking (mail_track_mixin) already formats integers via formatLang before setting new_value, but the test was passing a raw integer (self.env.uid), causing a mismatch with the formatted value expected by assertTrackingValueInBody. This only manifests when uid >= 1000.
Step to reproduce:
- Create a db with test_mail installed
- run `psql <db_name> -c "SELECT setval('res_users_id_seq', 1234, true);"` (to forcefully increment the sequence)
- launch the test_track_multi_models test
The test will fail due to this sequence increment when the test suite in ran fully (without splits like on runbot).
Forward-Port-Of: odoo/odoo#286256