Thursday, October 23, 2025
19 changes · saas-18.4
Enhancements to existing features
This update suppresses misleading warning messages caused by an operating system packaging issue on Ubuntu Jammy environments. It helps keep automated checks and server logs cleaner without changing business features or user workflows.
Original PR description
Apparently on jammy the pdfminer package returns nonsensical versions (the distribution for `pdfminer.six` yields `-VERSION-`, and inside the python code the `__version__` is `__VERSION__`). When trying to look up the distribution for the (invalid as a distribution name) `ldap`, as a fallback `pkg_resources` parses every package on the sys.path before returning a lookup failure. Doing so, it encounters `pdfminer` fails to parse its version as a `Version`, warns that that is deprecated, then parses it using the more lenient `LegacyVersion` and warns that this is also deprecated. Since this is a packaging issue in just jammy and we can't really do anything about it, just sweep the issue under the rug. https://runbot.odoo.com/odoo/error/163677 Forward-Port-Of: odoo/odoo#232650
This update improves performance when Odoo connects sales orders with related projects. It helps avoid slow database scans in cases with many projects, making affected sales order pages or processes respond more efficiently.
Original PR description
This commit adds an index on `project.project. reinvoiced_sale_order_id`, because the search in `sale.order. _compute_project_ids` might not be selective enough based on `sale_order_id`, which is a related field using `sale_line_id`. Since it's related, there is only a where clause on `sale_line_id IS NOT NULL`, which might not be selective enough and leads to a Seq. Scan of the `project_project` table. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232623
The web development tooling now includes VoIP-related modules in its linting checks. This helps catch code quality issues earlier for those areas, reducing maintenance risk without changing user-facing behavior.
Original PR description
Forward-Port-Of: odoo/odoo#232559 Forward-Port-Of: odoo/odoo#232484
Resolved issues and error corrections
Performance tests were updated to reflect an additional calendar lookup used when calculating attendance intervals. This helps ensure automated checks stay accurate for employees or appointments using different calendar setups.
Original PR description
- adjusted some query counters to account for the extra search in `_attendance_intervals_batch` done by the method `_get_calendar_at` task-id: 5065160
Code cleanup and technical improvements
This update applies automated code quality checks to the VoIP area without changing how users make or receive calls. It helps keep the codebase consistent and easier to maintain, reducing the risk of future issues.
Original PR description
Forward-Port-Of: odoo/enterprise#97753
Fixed a display issue in the Timesheets monthly view where text could overlap into timer button areas when users increased text size and scrolled horizontally. This improves readability and keeps totals and footer rows visually clean.
Original PR description
Steps to reproduce: - Open timesheets and change to Month scale. - Increase text size a little bit. - Scroll to the right side Issue: - You can see runover text being visible in timer button cell of Total row and Footer row. Reason: - It is due to z-index problem as z-index-* is deprecated from https://github.com/odoo/odoo/pull/165568 (from saas-17.4+). Fix: - Replace it with Bootstrap z-index class notated as z-*(-1 to 3) task-4949182 Forward-Port-Of: odoo/enterprise#96371
Long mailing list names now remain contained within the list view instead of overlapping nearby information. This keeps the Marketing mailing lists screen readable and easier to use when records have lengthy names.
Original PR description
Issue: When you create a long name for your maling list, the name overflows over the other fields in the view. Repro: Go to marketing -> mailing lists -> create a fairly long name -> notice name overflows in the view. Cause: Small bootstrap issue, name field not limited to it's container. Fix: Added a simple w-100 to limit the field to 100% of it's container. opw-5153270 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232312
Adds test coverage to ensure flexible employees using attendance-based work entries can have overlapping sick leave and public holidays without causing payroll work entry errors. This helps protect payroll processing reliability for complex absence scenarios.
Original PR description
**Purpose:** Add regression test to verify that overlapping leave scenarios (sick leave + public holiday) do not cause singleton errors for fully flexible employees using attendance-based work entries. **Test Coverage:** - Fully flexible employee with no calendar assignment - Attendance-based work entry source configuration - Overlapping sick leave and public holiday scenario - Work entry generation and validation without singleton errors **saas-18.4+ Adaptation:** Adapted for versioned contract architecture - contract fields now set directly on employee. Related : [PR](https://github.com/odoo/odoo/pull/223448) opw-4979974 Forward-Port-Of: odoo/enterprise#93902
This fixes a formatting issue in printed folder-style reports where page numbers could wrap onto two lines when using the Montserrat font. Keeping the page number on one line makes report footers cleaner and more professional.
Original PR description
The folder layout is using the same footer than the `external_layout_standard` but when using Montserrat, the page number wraps in 2 lines on the folder layout. It's missing a `text-nowrap` class. task-4942402 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#228391
When an applicant is refused and a refusal email is sent, the email is now also recorded in the application's chatter. This gives recruiters a clearer communication history and helps teams confirm what was sent to candidates.
Original PR description
To reproduce: ============= refuse an application with `send_email` checked, the email is sent but not logged in the chatter Solution: ========= Add a `message_post` in the `_prepare_send_refusal_mails` method opw-5137342 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Event registration pages now translate the date selection labels when visitors use another language. This improves the multilingual registration experience by showing consistent localized wording for event slots.
Original PR description
Scenario: - adds slots to an event - register to that event with another language Result: "Selected Date" or "Select a Date" is not translated or translatable. Fix: wrap those JS strings with _t function. opw-5167911 Forward-Port-Of: odoo/odoo#231729
The fix restores the speed slider for animated background shapes in the website editor. Users can now adjust animation speed as expected, improving editing accuracy for page designs.
Original PR description
Steps to reproduce: - Drop a snippet - Add a background shape (e.g. Rainy 05) - Use the slider to change the speed - Nothing happens This commit is adapting `CSS_ANIMATION_RULE_REGEX` as it was too restrictive, the space after the colon is now optional. task-5170549 Forward-Port-Of: odoo/odoo#231747
This fixes a missing hours field when planning service work from a sales order. Users can now enter allocated hours in the planning dialog when the usual start time field is hidden, helping schedules capture the required effort correctly.
Original PR description
Steps to reproduce: - Create a Sales order with planning services. - Click on To Plan stat button. - Click on empty cell Issue: - Plan dialog is opened but has missing allocated_hours field. Reason: - In this commit https://github.com/odoo/enterprise/commit/d21bd4b694ec63ba83bea077714a8fe928d6e014 allocated hours was merged with start_datetime using a widget and thus removed from view. - But in planning list view we hide start_datetime when we schedule shifts from sales order. Fix: - Add back allocated_hours conditionally to be visible when we schedule shifts as in other cases start_datetime is present. task-5117776 Forward-Port-Of: odoo/enterprise#96391
Website form editors can no longer delete the final option from a multiple-checkbox field. This prevents forms from getting stuck in a state where users cannot add options back, improving reliability when configuring website forms.
Original PR description
Since `html_builder`, the last element of a multiple checkboxes form field can be removed, but it leads to a situation where no element can be added anymore to the field. To avoid this, this commit restores the former behavior which did forbid the removal of the last element. Steps to reproduce: - Drop a form snippet - Add a field - Set the field type to "Multiple checkboxes" - Remove all options => It was possible to remove the last option. task-4367641
The website donation form now waits for required currency information before processing a donation click. This prevents rare crashes or failed submissions on slow networks and reduces accidental double-click issues by showing a loading state.
Original PR description
This fixes a very rare race condition in the `test_01_donation` tour... but it is actually surprising it is not more frequent than it is. Steps to reproduce: - Simulate a slow network (e.g. using…
This fixes a very rare race condition in the `test_01_donation` tour... but it is actually surprising it is not more frequent than it is. Steps to reproduce: - Simulate a slow network (e.g. using Chrome DevTools) - Load a page with a donation snippet - Quickly fill in the donation form and click the submit button => You'll sometimes get a crash. Or a more precise one: - Add a 1 minute delay to the `/website/get_current_currency` route - Load a page with a donation snippet - Fill in the donation form and click the submit button once the page is fully loaded. => You'll definitely get a crash. This commit makes that button's handler async-protected, meaning it will now properly wait for what is needed (the currency) before proceeding, but it will also display a loading effect for the duration and prevent double clicking. Once the form is submitted, the loading effect is removed for stability safety. In master it can probably be improved. runbot-220885 Forward-Port-Of: odoo/odoo#232585 Forward-Port-Of: odoo/odoo#232408
Helpdesk users can now add the SLA status grouping back in the SLA reporting view after removing it. This avoids needing to reload the report and makes SLA analysis smoother and less disruptive.
Original PR description
Currently, when the user opens the sla reporting view, if he removes the default grouping of sla_status, he has no way to get it back unless he reloads the view completly. This commit fixes this issue by adding the sla_status field to the group_by options. task-5076401 Forward-Port-Of: odoo/enterprise#95261
The offer signature shortcut now works correctly when an employee has signed the same offer more than once. HR users are shown all related signature requests instead of being blocked or taken to an incorrect single request, making follow-up smoother.
Original PR description
Steps to reproduce: - Go to an employee and create an offer - Sign the offer with the employee twice - Log as the HR responsible and use the "Requested signature" smartbutton on the offer This has been fixed by opening a kanban view of all sign requests, if multiple. task-5053624
The table selection popup in POS self-order now lists tables consistently by floor and table number. This makes it easier for customers or staff to find the right table and reduces confusion during ordering.
Original PR description
Task [#4991803](https://www.odoo.com/odoo/my-tasks/4991803) Runbot: https://runbot.odoo.com/runbot/bundle/18-0-incremental-order-table-pop-pos-self-order-ltra-391429 --- When selecting a table in the POS self-order, we sort the tables by `floor_id` and then by `table_number` in ascending order. This ensures a consistent and user-friendly experience when choosing a table. Forward-Port-Of: odoo/odoo#222811 Forward-Port-Of: odoo/odoo#222421
Invoices grouped by Sent or Not Sent now show only the matching records instead of duplicating all invoices in both groups. This makes invoice lists more reliable for accounting teams when tracking whether customer invoices have been sent.
Original PR description
### Issue: The groups "Sent" and "Not Sent" display all the invoices. ### Steps to reproduce: - Go in Accounting > Customer > Invoices - Create a custom GroupBy with "Sent" - Unfold the groups: all invoices appear in each group ### Cause: `web_read_group` returns the groups with their length and the domain corresponding. When unfolding `web_search_read` uses the given domain to get the records to display. Here the issue comes from the domain returned, it contains `['move_sent_values', '=', 'sent']`, but `move_sent_values` is a computed field that doesn't have a `_search` method so the domain doesn't filter on this field. ### Solution: Add the method `_search_move_sent_values` to search on `is_move_sent`. opw-5164650 Forward-Port-Of: odoo/odoo#232400