Tuesday, April 21, 2026
7 changes · saas-18.3
Resolved issues and error corrections
The salary package test no longer depends on sample/demo records being present. It now creates its own test data, which makes the test more reliable in environments where demo data is disabled.
Original PR description
### Issue: - We were referring an existing XML ID in our test case, but that record is only created in demo data. ### Fix: - No need to use the demo record Id, instead, create a new record. Task: 6115762 Forward-Port-Of: odoo/enterprise#114312 Forward-Port-Of: odoo/enterprise#113622
Generating a W-2 CSV now works even when the report’s end date is left blank. If no end date is provided, the system uses the current year for the file name instead of failing, making the report more reliable for users.
Original PR description
Currently, an error occurs when user tries to create a csv for w2 form with no end date defined. Steps to replicate: - Install `l10n_us_hr_payroll`. - Open Payroll > Reporting > W2 Report. - Click…
Currently, an error occurs when user tries to create a csv for w2 form with no end date defined.
Steps to replicate:
- Install `l10n_us_hr_payroll`.
- Open Payroll > Reporting > W2 Report.
- Click `New` > Remove value from `End Date` and click Generate.
Error:
```
File '/home/odoo/odoo19/enterprise/l10n_us_hr_payroll/models/l10n_us_w2.py', line 249, in action_generate_csv
self.csv_filename = f'form_w2_{self.date_end.year or date.today().year}.csv'
^^^^^^^^^^^^^^^^^^
AttributeError: 'bool' object has no attribute 'year'
```
Cause:
- As the user did not give any value for `End Date`, False was passed and when the execution flow reached [here] `self.end_date` is False and attempting to access `self.end_date.year` results in this error.
Solution:
- If we do not receive the `self.end_date` while generating the CSV, we will use the current year to generate the CSV file name.
[here]: https://github.com/odoo/enterprise/blob/01be8d6e9384bcb340559847d529b4887e073519/l10n_us_hr_payroll/models/l10n_us_w2.py#L248
No ID
Forward-Port-Of: odoo/enterprise#113408This fix makes sure attachments keep their originally provided file type information when they are uploaded to cloud storage. It prevents the system from re-detecting or changing the file type, which helps keep documents classified correctly and avoids inconsistencies for users.
Original PR description
When uploading an attachment to cloud storage via `_post_add_create(cloud_storage=True)`, the attachment's original `mimetype` is guessed even if we specify it. With this commit we explicitly preserve given mimetype Discovered during task-5153790 Forward-Port-Of: odoo/odoo#257979
The table editing menu now refreshes its options when the selected cell changes. This prevents outdated choices from appearing and helps users apply the right table actions more reliably.
Original PR description
After this commit [1], setup is executed only on the initial mount of the table menu and not on subsequent target cell changes. As a result, colItems, rowItems, and other values found in setup become stale, causing the menu to display options that do not reflect the current target cell. This commit moves the necessary values from setup into useEffect so they update correctly when the target cell changes. task-6111986 [1]: https://github.com/odoo/odoo/commit/7d523d6402c9bff3c2e4bcd0329f486a2d0f45ec Backport of Commit https://github.com/odoo/odoo/commit/729c45ddf3d1e377507d93997c5ca45984d64d75 Forward-Port-Of: odoo/odoo#259431 Forward-Port-Of: odoo/odoo#258590
This change fixes a flaky test in the website editor that could pass or fail depending on how quickly the system reacted. It now behaves more like a real user click, making the test results more reliable and reducing false failures in automated checks.
Original PR description
The popover opening is triggered through click, but there is a selectionchange handler on click that checks if the selection is outside of the link and, if it is, closes the popover. In this case, the click method didn't set the selection inside the link properly because of the presence of \ufeff around the link. The test actually passes by mistake when the runbot was fast, but failed when the runbot was slow, as the selectionchange handler had the time to execute and close the popover. This commit forces the selection to be inside the link after calling click, to be closer to what actually happens when a user click on a link, as opposed to a programmatic click. runbot-161423 Forward-Port-Of: odoo/odoo#259688
The web client now correctly handles action buttons even when they do not have a visible label. This ensures the system can tell whether a close or discard button triggered the callback, improving reliability in user flows that depend on that result.
Original PR description
View buttons with no name cause onClosed to be called without any parameters even if special=true or dismiss=true. This commit fixes that which allows to know if a close/discard button caused the action onClosed callback. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change corrects a test setup issue in the UBL export module so it no longer fails while checking required security groups. It helps keep automated tests stable and prevents false failures during installation checks.
Original PR description
The `get_default_groups` call happens during super.setUpClass(), therefore we have not checked (yet) if the module in which the security group is in is installed, and we end up with an Exception. task-none Forward-Port-Of: odoo/odoo#260230