Sunday, August 23, 2026
7 changes · saas-19.4
Enhancements to existing features
This update enables additional automated code quality checks for a document-related test area, helping catch issues earlier before they affect users. It also adjusts a project menu visibility check to avoid slowing down unrelated actions while a more complete technical solution is considered.
Original PR description
Task-5180137 Forward-Port-Of: odoo/odoo#283996 Forward-Port-Of: odoo/odoo#280233
This update improves internal testing for marketing automation background jobs, helping ensure scheduled campaign activities run reliably. It also corrects configuration usage in tests, reducing the risk of test loops or missed issues during future development.
Original PR description
Forward-Port-Of: odoo/enterprise#128884 Forward-Port-Of: odoo/enterprise#128522
Resolved issues and error corrections
This fix prevents errors when rounded work-hour values land exactly on the next hour, such as 16.9959 becoming 17:00. It improves reliability for computed or aggregated hour values and safely handles values that round to the end of the day.
Original PR description
### Bug `odoo.tools.date_utils.float_to_time` builds the minutes with a rounding step: ```python return time(int(integral), int(float_round(60 * fractional, precision_digits=0)), 0) ``` When the…
### Bug
`odoo.tools.date_utils.float_to_time` builds the minutes with a rounding step:
```python
return time(int(integral), int(float_round(60 * fractional, precision_digits=0)), 0)
```
When the fractional part of the hour is high enough, `round(60 * fractional)`
rounds up to a full **60**, and `time(hour, 60)` is invalid:
```python
>>> float_to_time(16.9959)
ValueError: minute must be in 0..59, not 60
>>> float_to_time(8.999)
ValueError: minute must be in 0..59, not 60
```
Any hours value whose fractional part is ≥ ~0.9917 hits this — which happens
easily with computed/aggregated work-hour floats.
### Fix
Carry the rounded-up minute into the hour, and return `time.max` when that carry
reaches the end of the day (mirroring the existing `hours == 24.0` case):
```python
if minute == 60:
hour += 1
minute = 0
if hour >= 24:
return time.max
```
`float_to_time(16.9959)` now returns `time(17, 0)`, `float_to_time(23.9959)`
returns `time.max`, and regular values are unchanged.
Adds `TestFloatToTime` in `test_date_utils.py` covering the carry, the
end-of-day carry, and regular values.
Forward-Port-Of: odoo/odoo#280807Closing and reopening the note composer could show a confirmation popup that crashed when users pressed Escape or arrow keys. This fix makes those key presses safely do nothing, preventing an interruption while logging notes.
Original PR description
Reproduction steps: - Open a record that has a chatter where you can log notes - Start logging a note in the composer - Close the composer - Click log note again - See "Continue with Full Composer?" popup - Hit escape, up, or down - See traceback This shouldnt really do anything, so this fix makes it do nothing instead of crashing. opw-6476660 Forward-Port-Of: odoo/odoo#283389 Forward-Port-Of: odoo/odoo#282803
Mentioning a contact linked to multiple active users in a mail sub-channel no longer triggers an error. The system now checks each user's notification preference and invites the contact when at least one linked user allows channel notifications, keeping discussions flowing for administrators and teams.
Original PR description
Before this commit, mentioning a partner that has two active users in a sub-channel ended on: ValueError: Expected singleton: res.users.settings(77, 80) This happens because the channel notification setting is read through res_users_settings_id, a Many2one on res.users, so two users give two settings records and reading a value on them asks for a singleton. Only an administrator reaches it, as the res.users.settings rule limits everyone else to their own settings. This commit fixes the issue by inviting the partner as soon as one of its users did not turn channel notifications off. Forward-Port-Of: odoo/odoo#283912 Forward-Port-Of: odoo/odoo#283805
The Timesheet Assistant now clears the previously selected suggestion when a user unselects it. This prevents an old project or task from carrying over when the user chooses a different suggestion, reducing incorrect timesheet entries.
Original PR description
Steps to reproduce: ------------ - install timesheet_grid. - activate assistant. - select a suggestion and then unselect it. - select a different project suggestion. Issue: ----------- the project from the previous suggestion remains selected. cause: --------- currentRecord is not reset when a suggestion is unselected, so the previous suggestion's project and task are still reused. Fix: --------- reset currentRecord to null when the suggestion is unselected and showCreateForm is false. Effected pr-https://github.com/odoo/enterprise/pull/126450 task-6482312 Forward-Port-Of: odoo/enterprise#128374
This fix prevents the Sign app from trying to use a logging component that does not exist. It helps avoid unnecessary technical errors during document signing operations and improves reliability without changing user workflows.
Original PR description
See https://github.com/odoo/enterprise/pull/121960 Forward-Port-Of: odoo/enterprise#128748