Monday, September 7, 2026
40 changes · master
Resolved issues and error corrections
The messaging menu now explicitly opens on the intended Chats tab instead of relying on fallback behavior. This prevents future tab-order changes from accidentally opening the wrong section and makes the user experience more predictable.
Original PR description
Before this commit, the systray state is inserted with `activeTab: MENU_TABS.CHATS`, a name no module defines, so the value is undefined and the state links no tab at all. This happens because each module names its own tabs, and the discuss one declares `MENU_TABS.CHAT`. The eager compute of `activeTab` hides the mistake: with no tab to keep, it falls back to the first visible tab, which is Chats whenever it is shown, as its sequence is the lowest. This commit inserts `MENU_TABS.CHAT`, so the state says which tab it opens on rather than depending on the sequences around it.
The Time Off Gantt view no longer displays an unnecessary “Undefined Employee” row when grouped by employee. This removes visual clutter and makes employee time off planning clearer for HR users.
Original PR description
Since web_gantt creates a placeholder group for optional fields, an "Undefined Employee" row was displayed when grouping by employee in the Time Off Gantt view. Add `required=True` to `employee_id` on `hr.leave.report.calendar` to prevent rendering this empty row. Task: 6537247
Certificate records can now be created or updated from the user interface without errors when uploading certificate files. This prevents a traceback caused by the newer upload format and keeps certificate management working smoothly for users.
Original PR description
Description of the issue this commit addresses: Since https://github.com/odoo/odoo/commit/23a7d8cc5b1d, binary values uploaded from the UI are dictionaries containing the filename and base64 content. Certificate creation parses the value before ORM normalization and calls bytes() on the dictionary, causing a traceback. --- Desired behavior after this commit is merged: This commit normalizes certificate content through the binary field converter before parsing it, allowing certificates to be created or updated from the UI. --- task-6538863 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Intrastat report lines now appear in a consistent order across different database environments. This prevents environment-specific test failures and reduces the risk of confusing report differences caused only by internal currency IDs.
Original PR description
`_intrastat_groupby_label_builder` calls `sorted(grouping_keys)` on JSON strings to determine the order of intrastat report lines. Those strings contain `"invoice_currency_id": <int>`, an…
`_intrastat_groupby_label_builder` calls `sorted(grouping_keys)` on JSON
strings to determine the order of intrastat report lines. Those strings
contain `"invoice_currency_id": <int>`, an environment-dependent integer.
When two groups share all other dimensions but differ only in currency,
the sort compares the serialised integers lexicographically, so the group
order depends on the specific integer values of each currency in the DB.
The values differ between environments because `odoo/modules/db.py` reads
the `ODOO_RUNBOT` / `ODOO_TEST` environment variables at import time
(`RANDOM_SERIAL`). When set, it runs `base/data/base_data_test.sql` after
the normal bootstrap, which executes
`select setval('res_currency_id_seq', 97)`, advancing the sequence by 96
before any currency is loaded from `res_currency_data.xml`. This shifts
every currency ID up by 96: SEK becomes 114, EUR becomes 222. As strings,
"114" < "222" (first character), so SEK sorts before EUR, breaking the
test. On a standard local install the sequence is not advanced: SEK=18,
EUR=126. As strings "18" > "126" (second character, '8' > '2'), so EUR
sorts first, matching what the test expected.
Steps to reproduce the failure (before this fix):
Local (EUR sorts first, test passes):
./odoo-bin -d test_local -i account_intrastat --stop-after-init
> SEK=18, EUR=126 → "18" > "126" as strings → EUR first
Runbot-like (SEK sorts first, test fails):
ODOO_RUNBOT=1 ./odoo-bin -d test_runbot -i account_intrastat --stop-after-init
> base_data_test.sql pre-advances res_currency_id_seq to 97
> SEK=114, EUR=222 → "114" < "222" as strings → SEK first
> Alternative: restore any master-all runbot DB dumpThe help message shown when no records exist is now tailored separately for tax returns and working files. This avoids confusing users by referring to tax returns when they are viewing working files.
Original PR description
Before this commit: - There is a common empty list help for tax returns & working files. This is confusing in the case of working files, as the help states Tax Return in it. After this commit: - There are now separate empty list helps for both actions. Task-6475771
This update fixes small visual inconsistencies in Odoo forms on mobile screens, including extra spacing, oversized tag delete buttons, and a misaligned CRM probability icon. The result is a cleaner and more consistent experience when viewing or editing records on smaller devices.
Original PR description
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 Add Font dialog now uses the standard switch control, so the “Serve font from Odoo server” option shows its checked state correctly and can be toggled with the keyboard. This improves usability and accessibility while removing obsolete duplicate styling.
Original PR description
[FIX] html_editor, website: generalize Switch component --- __Problem__ In the "Add font" dialog, the "Serve font from Odoo server" switch never shows its check mark, and cannot be toggled with…
[FIX] html_editor, website: generalize Switch component --- __Problem__ In the "Add font" dialog, the "Serve font from Odoo server" switch never shows its check mark, and cannot be toggled with Enter. __Reason__ The dialog reimplements the switch markup by hand instead of using the `Switch` component. Two things the component does were lost in the copy: - the knob glyph is a `::before` ligature, so it only renders if the span carries the `oi oi-filled` classes. The copy has a bare `<span/>` and stays blank once checked. - `Switch` supports toggling with `Enter`, which the copy does not handle at all. `Switch` itself was not directly usable here: it had no way to set an `id` (needed by the external `<label for=...>`). __Fix__ Make `extraClasses` optional, add an `id` prop, and use the component in the dialog. Toggling with `Enter` also failed to call `onChange` in `Switch`, leaving the owner state out of sync with the displayed value; this is fixed too. `labelIcon`/`labelIconClass` props are added for the `ai_website` counterpart of this fix. Finally, `website.editor.ui.scss` still carried a copy of the `.o_switch` rules, dead since the styles moved next to the component in `html_editor`. It is removed. + Enterprise PR: odoo/enterprise#130453 task-6377407
The member panel now positions the owner or admin crown icon next to the member's name instead of centering it across the full member entry. This makes the member list look cleaner and easier to read when extra status text appears below a name.
Original PR description
Before this commit, crown icon of a member in member panel was dead center to the member item as a whole. This means that if the member had name + another row of text (e.g. Back on X), then the crown would not be aligned with the member name. Before / After <img width="257" height="277" alt="Screenshot 2026-09-07 at 14 58 09" src="https://github.com/user-attachments/assets/289a5aa5-519e-4f0c-b226-5ed8b5b70ded" /> <img width="257" height="279" alt="Screenshot 2026-09-07 at 15 10 44" src="https://github.com/user-attachments/assets/4c29cf64-f759-476a-8663-efa8ab689d26" />
Fixed an issue where uninstalling certain modules could fail if they were linked to AI composer rules. Related model-specific AI rules are now removed automatically during uninstall, preventing conflicts and keeping module removal reliable.
Original PR description
## Issue When uninstalling a module that defines a model referenced by an `ai.composer` configuration, the corresponding `ir.model` is deleted. Deleting the `ir.model` sets the `focused_model_id` of…
## Issue
When uninstalling a module that defines a model referenced by an `ai.composer` configuration, the corresponding `ir.model` is deleted.
Deleting the `ir.model` sets the `focused_model_id` of the related `ai.composer` record to `NULL`.
The unique index on `ai.composer` uses `NULLS NOT DISTINCT`:
```python
_unique_agent_interface_model = models.UniqueIndex(
"(ai_agent_id, interface_key, focused_model_id) NULLS NOT DISTINCT",
)
```
As a result, `NULL` values are considered equal by the unique index.
If both a generic rule and a model-specific rule exist:
* `(agent, media_dialog, NULL)`
* `(agent, media_dialog, product.image)`
uninstalling the module that provides `product.image` deletes its `ir.model`, which sets `focused_model_id` to `NULL` on the model-specific rule.
This results in two identical `(agent, media_dialog, NULL)` entries and raises a `UniqueViolation`, preventing the module from being uninstalled.
## Fix
Set `focused_model_id` to `ondelete='cascade'`.
When the `ir.model` is deleted during module uninstallation, the corresponding model-specific `ai.composer` record is deleted instead of setting `focused_model_id` to `NULL`.
runbot-945683Rental products now show zero availability when no matching rental window exists, instead of triggering an error. This helps customers and staff complete searches or bookings without unexpected interruptions.
Original PR description
`_get_free_qty` computes the free quantity for a rental period by taking the minimum `quantity_available` across the availabilities returned by `_get_availabilities`. When that method returns an empty list (e.g. no availability windows overlap the requested period), `min()` raises a `ValueError` instead of returning a quantity. This commit passes `default=0` to `min()` so `_get_free_qty` returns 0 when there are no availabilities, instead of crashing. task-6026756 See also: - https://github.com/odoo/odoo/pull/254869
The AI website Add Page dialog now shows the Generate text switch correctly and lets users toggle it with the keyboard. This improves accessibility and makes the dialog behave consistently with the rest of the interface.
Original PR description
[FIX] ai_website: broken switch in the "Add page" dialog --- __Problem__ In the AI "Add page" dialog, the "Generate text" switch never shows its check mark, and cannot be toggled with Enter. <img width="439" height="326" alt="image" src="https://github.com/user-attachments/assets/0dc38547-679f-4fe1-9fda-a93213adc3d4" /> __Reason__ The dialog reimplements the switch markup by hand instead of using the `Switch` component: its `switch-slider` span misses the `oi oi-filled` classes the knob ligature needs to render, and nothing handles `Enter`. The hand-written markup is also why the icon is the hardcoded `/ai/static/description/icon.png` with inline sizing rather than the `o_ai_icon` font icon used everywhere else. __Fix__ Use `Switch`, now that it takes a label icon. <img width="400" height="322" alt="image" src="https://github.com/user-attachments/assets/d71580e2-68c2-473e-8819-ed532ff2f1d8" /> + Community PR: odoo/odoo#286700 task-286528
The Belgian payroll interface now correctly shows the Working Time Reorganisation field on fixed calendars when credit time attendance requires it. This helps payroll users see and manage the relevant information without affecting the intended behavior for variable calendars.
Original PR description
A recent change incorrectly hid the Working Time Reorganisation (MRT) field on fixed calendars, even when a credit time attendance triggered its computation. This commit restores the dynamic visibility of the MRT field for fixed calendars, while preserving the intended behavior for variable calendars. Task: 6538351
This fix ensures Belgian payroll correctly includes canteen cost codes when calculating payslips. It closes a gap from a previous correction, helping payroll results and related validation tests reflect the right employee cost treatment.
Original PR description
Previous fix 9c4acee2d324a454d12dd21388ae083f99c40416 was missing a change in the list of code to read. Forward-Port-Of: odoo/enterprise#130522 Forward-Port-Of: odoo/enterprise#130481
The Sign app now correctly opens the file picker when users tap "Add Document" from a mobile template view. This prevents an error screen and lets users upload PDFs from mobile devices as expected.
Original PR description
Version: - saas-19.5 Steps to reproduce: - Open a Sign template on a mobile. - Go to the Documents tab in the sidebar. - Click "Add Document" to upload a new PDF. Issue: - clicking on "Add Document" button raise a traceback. Cause: - The button called `this.requestFile(...)`, but that method lives on `this.signButtons`, not on the component itself. Solution: - Fix the button to call `this.signButtons.requestFile(...)` so it opens the file picker correctly. task-6535275
This fixes small icon display issues in the Stock Barcode and Planning Field Service areas. Package and planning-related icons now show as intended, reducing visual confusion for users.
Original PR description
[FIX] stock_barcode: fix `oi_dropbox` typo --- `stock_barcode` uses the `oi_dropbox` icon to represent packages. odoo/enterprise@86659741 made a typo, this commit fixes it. task-6377407 [FIX] planning_field_service: fix some remainings fa icons --- task-6377407
The update adjusts an internal test expectation for France-specific employee leave management so it aligns with newly added DRS automation. This helps keep automated checks reliable without changing day-to-day user functionality.
Original PR description
Related to odoo/enterprise#129851 This commit adapts a query counter in order to fit with the newly integrated DRS automation task-5915160
This update corrects several records and tests that used values longer than allowed by their configured field limits. It helps avoid validation errors and keeps accounting, payroll, localization, and point-of-sale data consistent with system rules.
Original PR description
https://github.com/odoo/odoo/pull/286488
The AI agent panel has been adjusted to follow the same visual style as the Discuss panel. This creates a more consistent experience for users and reduces confusion when moving between collaboration tools.
Original PR description
<img width="2058" height="521" alt="Screenshot 2026-09-07 at 12 26 42" src="https://github.com/user-attachments/assets/c12ba5ec-5dc8-43b0-af10-97b95a24212c" />
A bug in the web interface prevented repeated card reloads from taking effect after the first refresh. This fix ensures cards are recreated properly on every reload, improving reliability for users working with card-based views.
Original PR description
`this.key` is the signal function, so `this.key + 1` concatenates its source and `set` stores that same string on every reload: the first reload changes the key and re-creates the Record, the next ones are no-ops.
This fixes an issue where helpdesk tickets could crash when starting a repair after the product on a return operation was changed. The repair flow now handles unmatched products safely, helping support teams continue processing tickets without interruption.
Original PR description
## Steps to Reproduce: - Install the `helpdesk_repair` module. (with demo data) - Open the ticket titled **"Cabinet Colour and Lock aren't proper"**. - Go to Returns and change the product in Operations. - Click the "**Repair**" button on the ticket. ## Error: `IndexError - tuple index out of range` ## Cause: When the product on the picking does not match the ticket's product, the filtered picking recordset is empty. Accessing `[-1]` on an empty recordset raises an _IndexError_. ## Fix: Use `[-1:]` instead of `[-1]` when retrieving the matching picking, so an empty recordset is handled. sentry-7692929099 Forward-Port-Of: odoo/enterprise#130165 Forward-Port-Of: odoo/enterprise#129526
The payment provider list now shows already installed providers before other available options. This makes the payment setup screen easier to scan and helps users find active providers more quickly.
Original PR description
# How to reproduce - Go to the payment provider Kanban view # The issue The installed providers are listed last, instead of first # Cause This PR changed the way the ordering on Selection fields is processed : https://github.com/odoo/odoo/commit/f0e68e342fb0b1722279cbce4f84161d3f312ac3 It is now based on the index of the current selection in the selection array opw-6537788
Payroll users can now access contract templates and employee type settings as soon as the Payroll app is installed. This fixes a menu visibility issue that previously required an additional salary contract app, making payroll setup clearer and more consistent.
Original PR description
Previously, the contracts configuration menus (Templates and Employee Types) appeared in the payroll configuration menu only if hr_contract_salary was installed. Now, they appear when installing payroll. task-6530076
The messaging menu dropdown no longer shows extra rounded borders that were not intended in this view. This keeps the interface visually consistent and avoids a distracting layout issue for users.
Original PR description
In [1], discuss styling was adapted to frost, adding border radius to the messaging menu. However, borders/radius shouldn't be applied to messaging menu in dropdown. [1]: https://github.com/odoo/odoo/pull/285383 |Before|After| |-|-| |<img width="500" alt="image" src="https://github.com/user-attachments/assets/2fbff5eb-4282-4a5b-88d6-4c3c491dd2ea" />|<img width="500" height="691" alt="image" src="https://github.com/user-attachments/assets/7349b06f-2ddf-4d47-868b-7a2a8ccfc6b7" />|
Payslip worked-day lines are now translated using the employee's payslip language instead of the HR officer's language. This prevents mixed-language payslips and helps employees receive clearer, more consistent payroll documents, except where translations are not yet available.
Original PR description
l10n_be_hr_payroll Translation for payslip was not uniform. It is supposed to be based on employee language. But some fields we based on the user language (the HR officer who issues the payslips) What is not covered : fields that have missing translations. Those ones will still appear with the default (english) value.
Custom font files uploaded through the website editor no longer appear in the media dialog's Documents tab. This keeps the document list cleaner by hiding technical font-related files that business users do not need to manage there.
Original PR description
Steps to reproduce: - From the website editor, open the Theme tab. - Upload a custom font. - Open the media dialog and go to the "Documents" tab. Issue: The uploaded font files appeared in the…
Steps to reproduce:
- From the website editor, open the Theme tab.
- Upload a custom font.
- Open the media dialog and go to the "Documents" tab.
Issue:
The uploaded font files appeared in the Documents tab. When a zip file
was uploaded, every font it contained appeared individually, along with
the generated "CSS font face" attachment and the Google fonts metadata
cached by the server.
Cause:
Fonts uploaded through `/website/theme_upload_font` are created as
public attachments. The Documents tab of the media dialog lists every
public attachment that is not an image or an asset, so the font files
(mimetype `font/...`), their font face declaration (mimetype `text/css`)
and googleFontMetadata (server caches it as public attachment) were
listed.
Fix:
Create those attachments with a technical `/web/font/{id}/{name}` url
and exclude it from the Documents tab domain.
Existing databases are adapted by an upgrade script(https://github.com/odoo/upgrade/pull/10999)
Upgrade PR: https://github.com/odoo/upgrade/pull/10999
task-[4771523](https://www.odoo.com/odoo/project/974/tasks/4771523)This fixes an issue where special styling from user mentions could accidentally be carried into email content. Emails generated from Odoo will now keep cleaner, more consistent formatting and avoid a test failure caused by differing style values.
Original PR description
Before this commit, inlining the styles of a mail body copies the border radius, the padding and the margin of a mention into its style attribute, although `o_mail_redirect` is blacklisted so that none of its class styles are inlined. This happens because the blacklisted declarations are matched by property name, while the styles collected for the node have `padding-top` and its siblings merged into `padding`, `margin` and `border-radius`, three names no blacklisted declaration carries. This commit compares each blacklisted declaration with the value the node ends up with, so that a merged shorthand is removed as well. Note that the three tests asserted the values that leaked, the radius among them being `$btn-border-radius-lg`: 6px in enterprise but 4px in community, which is what turned the JS suite red on master. https://runbot.odoo.com/odoo/error/946970
Corrects how the website shop reads the delivery country when searching for pickup locations. This prevents pickup point lookup from failing or showing an incorrect prompt when a customer address already has a country selected.
Original PR description
`country_id` is a number so the fix in #281720 - which avoids a traceback when no country is present - now leads to nothing being loaded when the delivery address has a country. Because `country_id?.id` now gives `undefined`. The fix makes sense only if the field is marked as a many2One as done in 319bb52 (which was only merged in 19.4+). This is consistent with fix edf65dc done in 19.4+ as well. Forward-Port-Of: odoo/odoo#286195 Forward-Port-Of: odoo/odoo#285006
This update fixes missing accent marks in Spanish fiscal position labels. It improves the professionalism and accuracy of Spanish localization text without changing business logic or workflows.
Original PR description
@Tecnativa Forward-Port-Of: odoo/odoo#284053
Links added to manufacturing shop floor notes now open in a new browser tab instead of disrupting the current shop floor view. This keeps operators in their workflow while still allowing them to access attached documents or referenced pages.
Original PR description
Steps to reproduce 1. On a Manufacturing Order, open the Miscellaneous tab, click in Additional Notes, type "/file", pick "File" (Insert a file from Documents), select a document and save. 2. Open…
Steps to reproduce 1. On a Manufacturing Order, open the Miscellaneous tab, click in Additional Notes, type "/file", pick "File" (Insert a file from Documents), select a document and save. 2. Open the Shop Floor of that Manufacturing Order. 3. On the order card, click the link shown in the note. Expected: the link opens in a new tab. Actual: the Notes edition dialog opens and the link is not opened. Issue --- On the Shop Floor the Additional Notes HTML field is rendered inside a container whose click handler opens the note edition dialog, its links carry no target and the handler stops the event propagation, so clicking a link opens the edition dialog instead of the linked document. Additional Notes became an HTML field in ebc30649c0f5, which allowed such links while this rendering was never adapted to open them. https://github.com/odoo/enterprise/blob/bfda5100ddd423f9e5fb91a9f83b4719c1f58397/mrp_workorder/static/src/mrp_display/mrp_display_record.xml#L58-L63 The note links now receive target="_blank" after mount and on every patch so they open in a new tab like the readonly HTML field viewer, and the container handler ignores clicks landing on a link so it no longer opens the edition dialog for them. https://github.com/odoo/enterprise/blob/bfda5100ddd423f9e5fb91a9f83b4719c1f58397/mrp_workorder/static/src/mrp_display/mrp_display_record.js#L106-L111 opw-6487702 Forward-Port-Of: odoo/enterprise#128979
This update prevents conflicting context settings when users create items quickly during bank reconciliation. It ensures the user's current settings take priority, reducing inconsistent behavior in accounting workflows.
Original PR description
Since this commit: https://github.com/odoo/enterprise/commit/938978c622700f9de097d9ff163f5b3c043231ed We pass the auto_statement_processing context key to false when destroying the component. The problem is that for the quick creation we use the model context. It might happen that those two contexts are different and can create inconsistancy. This commit will make sure the user context has priority on the global state context. no task id Forward-Port-Of: odoo/enterprise#130456 Forward-Port-Of: odoo/enterprise#129957
This fix ensures that when an employee has multiple contracts and payslips in the same month, canteen costs are applied to the first payslip with a paid amount. This helps Belgian payroll calculations stay accurate and avoids misplaced employee cost deductions.
Original PR description
In case of multiple contracts for a single month (and then multiple payslips), the canteen cost must appear in the first payslip that have a paid amount. Forward-Port-Of: odoo/enterprise#130364 Forward-Port-Of: odoo/enterprise#130109
This fix prevents an unexpected error from appearing when Odoo handles certain report actions. It improves reliability by using the correct record context, reducing the chance of users seeing a traceback during normal operations.
Original PR description
opw-6360013 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#274977
Fixes an error that could occur when paying a vendor bill with withholding tax after the currency field was cleared. The system now safely falls back to the company currency, helping users continue the payment flow without an unexpected crash.
Original PR description
Currently, an error occurs when user tries to pay on a vendor bill and removes the currency. Steps to replicate: - Install `l10n_account_withholding_tax`and activate multiple currencies. - Open…
Currently, an error occurs when user tries to pay on a vendor bill and removes the currency.
Steps to replicate:
- Install `l10n_account_withholding_tax`and activate multiple currencies.
- Open Invoicing > Vendors > Bills and create a new bill and add a vendor and bill date.
- Add a product and tax `2% WTH`.
- From the Cog menu > Click Pay > Remove the Currency.
Error:
```
File '/home/odoo/src/odoo/saas-19.4/addons/l10n_account_withholding_tax/models/account_withholding_line.py', line 208, in _compute_original_amounts
line.original_base_amount = line_curr.round(base_amount * rate)
File '/home/odoo/src/odoo/saas-19.4/odoo/addons/base/models/res_currency.py', line 264, in round
self.ensure_one()
File '/home/odoo/src/odoo/saas-19.4/odoo/orm/models.py', line 5342, in ensure_one
raise ValueError('Expected singleton: %s' % self)
ValueError: Expected singleton: res.currency()
```
Cause:
- As the user removed currency, the `comodel_currency_id`is received as false.
- Later when we call `round()` on the empty res.currency recordset causes this error to occur.
Solution:
- Added the company currency as a fallback value when `currency_id` is removed by user, since `currency_id` is a required field user will need to select a currency when saving.
sentry-7616890592
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#283737
Forward-Port-Of: odoo/odoo#277507This fixes an internal test setup for LDAP authentication so it matches expected cookie behavior after recent timezone handling changes. It helps keep automated checks reliable without changing how users sign in.
Original PR description
In #279318 `ResUsers._login` was modified to *parse* the `tz` cookie instead of just storing it in order to normalize the timezone (as browsers can send CLDR timezones which are legacy tzdata timezones). This is a problem in auth_ldap's tests because `mock_check_identity` sets the entire request as a straight mock, so `request` is truthy, `request.cookies` is a mock, `request.cookies.get(...)` is a mock, and `ZoneInfo` blows up trying to resolve it because it's nonsensical. If we make the mock cookies into a straight dict, `request.cookies.get(...)` returns `None` and we skip ahead without error (previously we'd skip ahead because `tz in all_timezones` would be `False`). https://runbot.odoo.com/odoo/error/945680
Pasted tables from Google Docs now keep only the first row as the header, matching what the editor supports. This prevents extra header rows from appearing incorrectly and makes pasted table content more consistent for users.
Original PR description
Steps to Reproduce - Copy a table with multiple header rows from Google Docs. - Paste the table into the editor. Description of the issue: - The pasted table contains multiple header rows, but the editor supports only the first row as the table header row. Cause: - During paste, `cleanForPaste` does not handle tables with multiple header rows - As a result, header cells (`<th>`) in rows other than the first row remain as header cells instead of being converted to normal table cells (`<td>`). Solution: - Update `cleanForPaste` to handle tables with multiple header rows. - If a table contains `<th>` elements in any row other than the first row, replace those `<th>` elements with `<td>` elements. - This ensures that only the first row is treated as the table header row. task-6455248 Forward-Port-Of: odoo/odoo#286303 Forward-Port-Of: odoo/odoo#281234
This fix makes employee records with the same name appear in a consistent order, preventing intermittent test and data-ordering failures. It helps ensure HR-related absence information is read reliably when a partner is linked to multiple users.
Original PR description
Before this commit, TestPartner.test_res_partner_to_store fails on the all-modules and per-country builds: AssertionError: '2024-06-06' != '2024-06-07' : Return date is the return date of the main…
Before this commit, TestPartner.test_res_partner_to_store fails on the all-modules and per-country builds: AssertionError: '2024-06-06' != '2024-06-07' : Return date is the return date of the main user of the partner This happens because the test reads the first entry of the hr.employee list, which holds one employee per user of the partner: back on the 7th for the main user, on the 6th for the other. This comes from "[FIX] hr*: load out-of-office dates from all user employees", which added the employees of the partner to the payload, where it held those of the main user only. The problem is that the list keeps the order of employee_ids, which is 'name' with no tiebreaker, and both employees are named test1, as an employee takes the name of its user and creating the second user renames the partner. Postgres is then free to return either one first, and the failing builds get the second one. This commit fixes the issue by ordering the employees on 'name, id', so that employees sharing a name keep a stable order instead of the one the database picks. The test asserts the whole hr.employee list, one entry per user of the partner, rather than its first entry alone, and that assertion pins the order. https://runbot.odoo.com/odoo/error/945994 Forward-Port-Of: odoo/odoo#286796 Forward-Port-Of: odoo/odoo#286236
This update fixes an internal test issue in the Mail app where mention styling could be measured differently depending on the installed edition. It helps keep automated checks stable across Odoo setups without changing the user experience.
Original PR description
Before this commit, some tests in convert_inline were failing due to mismatch of border-radius of mentions: - expected 0.375rem - received: 0.25rem This happens because the border radius of mention relies on `$btn-border-radius-lg`, which has different value in community and enterprise, respectively `o-to-rem(6px)` and `o-to-rem(8px)`. This commit fixes the issue by dynamically reading the border radius of mention, so that running it with or without enterprise modules make the test pass. Fixes runbot-error-946970
This update removes an older Point of Sale data cleanup step that is no longer needed. A newer, more targeted fix now handles stale loyalty reward lines, reducing the risk of unintended changes while keeping checkout data clean.
Original PR description
This fix is no longer required(https://github.com/odoo/odoo/pull/202752) as this one (https://github.com/odoo/odoo/pull/257043) is cleaner and less aggressive (it will only delete stale reward lines). This is the relevant part of the new fix to delete the previous one: https://github.com/odoo/odoo/pull/257043/changes#diff-18cef42f8c39513a82387e9cb81bc732b252304cd15b5b2f7b0b4623ac20cb41R100-R104 opw-6447092 Forward-Port-Of: odoo/odoo#286499 Forward-Port-Of: odoo/odoo#285376
This fix makes internal automated tests use a consistent language when checking activity history and tracking messages. It helps prevent false test failures caused by translation differences, improving release reliability without changing day-to-day product behavior.
Problem: When a parent element applies a `font-weight: 300` to its content, a child `<strong>` tag defaults to `font-weight: bolder`, which resolves to a computed font weight of `400`. For certain font families, weight `400` is visually identical to `300`, leaving no visual distinction for bold text. Cause: `<strong>` tags relied on relative weight boosting (`bolder`), which only increases the parent weight from `300` to `400` instead of applying explicit bold weight. Solution: Expl
Original PR description
Problem: When a parent element applies a `font-weight: 300` to its content, a child `<strong>` tag defaults to `font-weight: bolder`, which resolves to a computed font weight of `400`. For certain font families, weight `400` is visually identical to `300`, leaving no visual distinction for bold text. Cause: `<strong>` tags relied on relative weight boosting (`bolder`), which only increases the parent weight from `300` to `400` instead of applying explicit bold weight. Solution: Explicitly set `font-weight: bold` on `strong` for `.o_wblog_read_text` Steps to reproduce: - Go to /blog - Open any blog - Open editor. - Select some text from the content of the blog. - Apply Bold. - Observe that there is no visual difference. opw-6460699 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#282667