Tuesday, December 16, 2025
20 changes · saas-18.4
Enhancements to existing features
This update enhances the way Odoo calculates order amounts by allowing custom addons to modify the list of order lines used. Previously, this process was fixed, now it's more flexible, enabling developers to tailor order amount calculations to specific business needs. This improves the adaptability of the sales order system.
Original PR description
This allows to change the record set of order lines which are used by `sale.order` `_compute_amounts` by custom addons Forward-Port-Of: odoo/odoo#239928 Forward-Port-Of: odoo/odoo#233239
Resolved issues and error corrections
This change prevents unnecessary calculations when retrieving data for inherited fields. By avoiding redundant computations, the system now performs more efficiently, particularly when dealing with complex data relationships. This results in faster response times and a smoother user experience.
Original PR description
when the ``get_description`` is calling. So, it getting all the information weather it's groupable or not for it…
when the ``get_description`` is calling. So, it getting all the information weather it's groupable or not for it [here](https://github.com/odoo/odoo/blob/b48d41086d7ff8ef91c6c43d37d588686d6b921a/odoo/orm/fields.py#L923) and field is from inherited model it trying ``model._read_group_groupby(model._table, groupby, query)`` because those related and non store. As there is no meaning for computation for that because it going groupable because it parent_field is groupable. So, keeping check for that and reduce the computation.
```
File "/tmp/tmpmagm1mli/migrations/base/tests/test_mock_crawl.py", line 430, in mock_act_window
views = get_views(
File "/home/odoo/src/odoo/19.0/addons/mail/models/mail_thread.py", line 463, in get_views
res = super().get_views(views, options)
File "/home/odoo/src/enterprise/19.0/web_studio/models/models.py", line 10, in get_views
result = super().get_views(views, options=options)
File "/home/odoo/src/enterprise/19.0/web_studio/models/ir_ui_view.py", line 52, in get_views
return super().get_views(views, options)
File "/home/odoo/src/odoo/19.0/odoo/addons/base/models/ir_ui_view.py", line 2935, in get_views
result['models'][model] = {"fields": self.env[model].fields_get(
File "/home/odoo/src/odoo/19.0/addons/stock/models/product.py", line 521, in fields_get
res = super().fields_get(allfields, attributes)
File "/home/odoo/src/enterprise/19.0/web_studio/models/ir_model.py", line 76, in fields_get
return super().fields_get(allfields, attributes=attributes)
File "/home/odoo/src/enterprise/19.0/ai_fields/models/models.py", line 47, in fields_get
res = super().fields_get(allfields, attributes)
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 3360, in fields_get
description = field.get_description(self.env, attributes=attributes)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 883, in get_description
value = value(env)
File "/home/odoo/src/odoo/19.0/odoo/orm/fields.py", line 930, in _description_groupable
model._read_group_groupby(model._table, groupby, query)
File "/home/odoo/src/odoo/19.0/addons/mail/models/mail_activity_mixin.py", line 259, in _read_group_groupby
return super()._read_group_groupby(alias, groupby_spec, query)
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 2064, in _read_group_groupby
coquery = comodel._search(codomain, bypass_access=field.bypass_search_access)
File "/home/odoo/src/odoo/19.0/odoo/addons/base/models/ir_attachment.py", line 659, in _search
records = self.sudo().with_context(active_test=False).search_fetch(
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 1418, in search_fetch
return self._fetch_query(query, fields_to_fetch)
File "/home/odoo/src/odoo/19.0/odoo/orm/models.py", line 3914, in _fetch_query
rows = self.env.execute_query(query.select(*sql_terms))
File "/home/odoo/src/odoo/19.0/odoo/orm/environments.py", line 534, in execute_query
self.cr.execute(query)
File "/home/odoo/src/odoo/19.0/odoo/tests/test_cursor.py", line 79, in execute
return self._cursor.execute(*args, **kwargs)
File "/home/odoo/src/odoo/19.0/odoo/sql_db.py", line 426, in execute
self._obj.execute(query, params)
psycopg2.DatabaseError: out of memory for query result
```
opw-5260147
upg-3444635
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#239991
Forward-Port-Of: odoo/odoo#239400This update resolves an issue where loading demo data in a newly created company within the Appraisal module would trigger a permission error. The fix ensures demo employee data is created within the user's current company, eliminating the conflict with company-specific security rules. This allows users to easily load and test demo data in new business environments.
Original PR description
Currently, an error occurs when a user attempts to load demo data for a newly created company in the Appraisal module. **Steps to Reproduce:** 1. Install `hr_appraisal` without demo data. 2. Create a…
Currently, an error occurs when a user attempts to load demo data for a newly created company in the Appraisal module.
**Steps to Reproduce:**
1. Install `hr_appraisal` without demo data.
2. Create a new company and switch to it.
3. Appraisals > Click "Load sample data".
**Traceback:**
```
AccessError
Uh-oh! Looks like you have stumbled upon some top-secret records.
Sorry, Sengsourigna Phonkaseumsouk (id=2) doesn't have 'read' access to:
- Employee, Emma Granger (hr.employee: 3, company=TPX Solutions)
Blame the following rules:
- Employee multi-company rule
If you really, really need access, perhaps you can win over your friendly administrator with a batch of freshly baked cookies.
This seems to be a multi-company issue; you might be able to access the record by switching to the company: TPX Solutions.
ParseError
while parsing /home/odoo/src/enterprise/18.0/hr_appraisal_skills/demo/scenarios/scenario_appraisal_demo.xml:4, somewhere inside <function model="hr.appraisal" name="_copy_skills_when_confirmed" eval="[ref('hr_appraisal.hr_appraisal_2')]"/>
ValueError
ParseError('while parsing /home/odoo/src/enterprise/18.0/hr_appraisal_skills/demo/scenarios/scenario_appraisal_demo.xml:4, somewhere inside\n<function model="hr.appraisal" name="_copy_skills_when_confirmed" eval="[ref(\'hr_appraisal.hr_appraisal_2\')]"/>') while evaluating 'action = model._load_demo_data()'
```
**Cause:**
The demo data loading process attempts to access employee records without the required permissions. Since the user belongs to a different company, the multi-company security rules prevent reading those employees.
**Fix:**
This commit removes the company assignment from the demo employee records so they are created in the current company instead of the base company.
sentry-7032880299
Forward-Port-Of: odoo/odoo#239415This update addresses an issue where runbot reports were incomplete due to changes in how errors were handled during testing. The team is restoring logging to provide more detailed error information, improving the accuracy of runbot reports and streamlining debugging. This ensures more reliable automated testing.
Original PR description
One of the changes in #118332 was to let exceptions bubble up to the interpreter in case of error, to improve the experience while running the script locally. This turns out to have downgraded runbot reporting significantly as it doesn't account for stderr / log tracebacks if it got error-level (and possibly even warning-level) logs during the run. Hopefully get the best of both world (and shorten tracebacks slightly) by restoring `logging.exception` at the script level but triggering an abnormal exit for local CLI utility. Forward-Port-Of: odoo/odoo#239995
This update resolves an issue where review messages were incorrectly displayed for administrators. The fix ensures that administrators always edit their own review messages when using the 'Edit Review' button. This improves the user experience for administrators managing course reviews.
Original PR description
How to reproduce: - Log as Mitchell Admin - Edit Marc Demo review using the contextual edit button - Click on save to update the review - Click on the button "Edit Review" on the top The review modals opens with the message of Marc Demo instead of the message of Mitchell Admin. The fix ensures you always edit your review message when clicking on "Edit review" button. Note: this is only possible with admin user as other users cannot edit messages of other users. So unfortunately, we had to create a new tours as we can't add steps to test_course_reviews_elearning_officer (not running as admin). An alternative would have been to extend test_fullscreen_slide_text_highlights and rename it. Task-5170310 Forward-Port-Of: odoo/odoo#239554 Forward-Port-Of: odoo/odoo#232696
A minor bug causing test failures in the HTML editor has been resolved. The update refined a test selector to avoid unintended targeting of elements within the toolbar, ensuring consistent test results. This improves the reliability of the HTML editor functionality.
Original PR description
Because of the toolbar being sometimes opened, the test added in odoo#238735 would sometimes failed. This was due to the selector "span" also targetting the elements in the toolbar. To prevent this test from failing, the selector "span" was updated to be more specific. Forward-Port-Of: odoo/odoo#239174
This update fixes an issue where the XML reports were incorrectly including a slash ('/') when there was no comment in the comment section. This change ensures the reports are formatted correctly and consistently, preventing potential data discrepancies. The fix was implemented to align with the standard report structure.
Original PR description
Since 17.0, we added a / when there was no comment in the comment section of the xml. This is wrong and should be left empty. opw-5242381 Forward-Port-Of: odoo/enterprise#101339 Forward-Port-Of: odoo/enterprise#100033
This update ensures that group hierarchies displayed in user interfaces are always shown in the user's preferred language, regardless of language changes or new user creation. By making the cache language-dependent and removing unnecessary data, users will consistently see translated group names and field values, improving the overall user experience.
Original PR description
## Before this commit: When opening the user's form view, the group hierarchy is loaded using the context's language, and cached. However, switching language or creating a new user (which copies the portal template user) could result in the group hierarchy being displayed in the wrong language. This occurs because the cache does not account for the language changes. ## After this commit: Make the cache language-dependent to ensure group names and translated fields are always displayed in the user's current language. Also remove the unnecessary copy of the `view_group_hierarchy` field. Forward-Port-Of: odoo/odoo#236767
This update fixes a misleading warning message displayed to users when viewing subscription products without a defined plan. The change ensures users receive a clear and accurate message – 'This product has no valid combination' – preventing confusion and improving the eCommerce experience. This resolves a usability issue impacting all subscription products.
Original PR description
Version: - saas-18.4 Steps to reproduce: - Install website_sale_subscription - Create a subscription product without a plan - Open product on eCommerce Issue: - When viewing a subscription product without a subscription plan in the eCommerce shop, the system incorrectly shows the warning "This subscription is not compatible with the one already in your cart. Please order them separately or empty your cart." - This happens even if the cart is completely empty. - The method _is_add_to_cart_possible doesn’t find any valid combination to add to the cart, and because the product is marked as recurring, it always triggers the wrong message. Solution: - Add a condition to check if current product have any recurring price set if not then it will show the correct warning that 'This product has no valid combination.' Impact: - Users see clear and correct warnings on products without a subscription plan. task-5255749
This update resolves an issue where invoices with journal items lacking labels would trigger a system error. The fix ensures that all labels are treated as strings, defaulting to an empty string if a label isn't present, preventing the traceback and allowing invoices to be successfully validated. This improves invoice processing reliability.
Original PR description
Creating an invoice containing journal items without a label triggers a traceback because the code unconditionally slices the 'name' field (line.name[:64]) without ensuring it is not False. Since 'name' is not a required field on account.move.line, it must be safely handled.
This commit ensures that the label is always a string by falling back to an empty string when the value is missing.
Steps to reproduce the bug:
- Create a storable product
- Create an invoice:
- Add the product to the invoice
- Set any customer
- Go to the journal items tab
- Remove the label of the journal item corresponding to the product
- Try to validate the invoice
- A traceback is raised
opw-5360602
Forward-Port-Of: odoo/odoo#239664
Forward-Port-Of: odoo/odoo#239188This update resolves an issue where newly duplicated website pages weren't immediately visible in the page list. Users now need to reload the page list after duplicating a page to ensure the new page appears correctly. This improves the user experience and prevents frustration when managing website content.
Original PR description
Steps to reproduce: - Go in website page list - Select a page - Click on actions -> duplicate - Select a name - New page doesn't appear in the list, you need to reload to be able to see it task-5412167 https://github.com/odoo/odoo/issues/225299 Forward-Port-Of: odoo/odoo#240041 Forward-Port-Of: odoo/odoo#239702
This update resolves an issue where triple-clicking a checkbox in a checklist would unexpectedly select the entire list item. The fix prevents triple-clicks from triggering this unwanted selection, ensuring a more reliable and intuitive user experience when working with checklists.
Original PR description
**Current behavior before PR:** Currently, triple clicking on a checkbox in a checklist item ends up selecting the list content. This happens because in `selection_plugin` `onTripleClick` handler selects the whole list item. **Desired behavior after PR is merged:** This PR ensures that `onTripleClick` in `selection_plugin` does nothing if tripleclick is triggered when checking a box. task-5361579 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#238876 Forward-Port-Of: odoo/odoo#237690
This update resolves a bug where the chatter feature was incorrectly using both the old and new email addresses of an applicant. The fix ensures that only the updated email address is used when sending emails from the applicant record, improving data accuracy and communication. This prevents confusion and ensures correct recipient addresses.
Original PR description
Steps to reproduce: 1- Create a job position and then create an applicant for the position with an email address. 2- Change email from the applicant form. 3- Use the chatter to send an email. 4- As seen, both old email and new email address are used as recipient addresses which shouldn't be the case. The cause was that it failed to save the new email on the partner_id associated to the hr_applicant. This was fixed by modifying the inverse function to allow the values to be modified even if already existant. task-5269650 Forward-Port-Of: odoo/odoo#239660 Forward-Port-Of: odoo/odoo#236208
This update fixes a technical issue preventing portal users from correctly filtering job postings. The change involved adding a security layer (`sudo()`) to access department data, which was previously causing access errors. This ensures portal users can consistently use the department filter functionality.
Original PR description
**Steps to reproduce:** 1. Install `website_hr_recruitment` 2. Open the job website page and, through editor add a filter for department 3. Switch to a portal user and change the department filter **Issue:** - The controller passes department_id to the template, but unlike before this commit https://github.com/odoo/odoo/commit/0ab6e84c54f134c8744d8f94108a715e989b2815, where the code used sudo() to sort departents https://github.com/odoo/odoo/blob/6159c6527cfa38ea0c92e6f3fa6025ee534a1acb/addons/website_hr_recruitment/controllers/main.py#L81 it now just passes the department_id without actually returning a full record with accessible fields. In the template, the filter rendering uses selected_filter.name, which triggers an AccessError for portal users. **Solution:** - Apply `sudo()` when accessing `hr.department` to avoid access errors for portal users. opw-5103910 Forward-Port-Of: odoo/odoo#229040
This update corrects a visual issue where content within toggle lists inside banners was misaligned. The fix targets a styling error that incorrectly applied margins to paragraph elements, ensuring proper alignment and a consistent user experience. This improves the overall appearance and usability of the HTML editor.
Original PR description
**Steps to reproduce:** - Create a banner. - Create a toggle list inside the banner. - Notice that the content inside the toggle list is not properly aligned. **Description of the issue:** - This happens because a margin-bottom is applied to all last `o-paragraph` elements inside the `o_editor_banner class`. Since the toggle list also contains `o-paragraph` elements that are the last child within it, the margin-bottom style is incorrectly applied to those as well. **Solution:** - Apply the margin-bottom only to the last direct child of `.o_editor_banner_content`. task-5213985 Forward-Port-Of: odoo/odoo#237177 Forward-Port-Of: odoo/odoo#233709
This update resolves a technical error that prevented users from saving a duplicate transaction when a journal wasn't linked. The fix ensures the system handles missing journal data correctly, preventing a crash and improving the user experience. This change enhances stability and reliability of the account synchronization process.
Original PR description
Currently, an error occurs when user opens the `account.duplicate.transaction.wizard.form` view and saves it. **Steps to Reproduce:** - Install the `account_accountant` module. - Using `Open View`,…
Currently, an error occurs when user opens the `account.duplicate.transaction.wizard.form` view and saves it. **Steps to Reproduce:** - Install the `account_accountant` module. - Using `Open View`, open the `account.duplicate.transaction.wizard` view > enter the start date, and save.. `ValueError: Compute method failed to assign account.duplicate.transaction.wizard(22,).provider_duplicate_ids` The error occurs because when the view is opened and saved, the _compute_provider_duplicate_ids method is triggered. Since no journal is linked to the wizard, the method assigns an empty list ([]) to provider_duplicate_ids [1]. Because this is a O2M field, assigning a raw empty list is invalid and causes the error. This commit ensures that when journal is missing, instead of assigning an empty list ([]), a valid relational command `([Command.set([])])` is used. Ref: https://github.com/odoo/enterprise/pull/97196/commits/c109e0bcce20f14b6dbd3d28e61b135f1fd048f2 [1] https://github.com/odoo/enterprise/blob/d808ad3f6ff52632e00cf1a68de0e5270e52895d/account_online_synchronization/wizard/account_journal_duplicate_transactions.py#L53 sentry-7080686084 Forward-Port-Of: odoo/enterprise#101177
Previously, users couldn't change the name of the 'Help' menu item in the Helpdesk, encountering an error. This update allows users to rename the menu item, resolving a usability issue and providing greater flexibility within the Helpdesk feature. This change ensures a smoother experience for users managing their Helpdesk workflows.
Original PR description
**Issue** It was not possible to rename the "Help" menu item, an error appeared with the message: "This URL is reserved for the helpdesk teams with 'website form' feature enabled.", even if the user was not trying to edit the URL. **Change** Allow the user to edit the menu item's name. opw-5375334 Forward-Port-Of: odoo/enterprise#101567 Forward-Port-Of: odoo/enterprise#101323
This update fixes an issue where the website editor's highlight overlay was misaligned when the website was zoomed in. The fix ensures that the overlay accurately reflects the selected content regardless of the zoom level, improving the user experience when editing mobile websites. This resolves a visual inconsistency that could lead to incorrect website designs.
Original PR description
Steps to reproduce: =================== 1- Go to the Website editor. 2- Go to mobile view 3- Zoom in (e.g., set it to 120%). 4- Click on any snippet inside the website iframe. -> The highlight…
Steps to reproduce: =================== 1- Go to the Website editor. 2- Go to mobile view 3- Zoom in (e.g., set it to 120%). 4- Click on any snippet inside the website iframe. -> The highlight overlay is in the wrong position. When the website builder iframe is zoomed (scaled), the overlay elements (blue selection borders) become misaligned and incorrectly sized. Cause: ====== This occurs because `targetRect` returns coordinates in the iframe's internal coordinate system (unscaled), while `iframeRect` is in the window's coordinate system (scaled). So when we try to draw the Overlay (in Main Window) using targetRect (from Iframe), we must scale the `targetRect` values to match the Main Window's reality. See [1] for more informations on how `getBoundingClientRect` works Solution ========= Scale targetRect to match the main windows's reality. [1]: https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect opw-5345154 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an issue where background colors were lost when copying tables from the Knowledge interface to other Odoo applications. The change ensures that the correct formatting is preserved during the copy-paste process, improving the user experience when working with tables.
Original PR description
To make it possible to properly copy DOM elements across editors, the `application/vnd.odoo.odoo-editor` mimetype was introduced in the `ClipboardPlugin`. However, this was not used inside the `HtmlViewer`. Because of this, some content formatting could be lost when copying elements from an `HtmlViewer` to an editor. This commit solves this by also invoking the code that fills the clipboard in `ClipboardPlugin` when content is copied in an `HtmlViewer`. Steps to reproduce: - Insert a table in Knowledge - Set a background color on a few cells - Use the "lock" feature of Knowledge (inside a dropdown the menu on the right) - Select the entire table - Copy/paste it in a project task => The background colors in the cells were lost task-4017841 Forward-Port-Of: odoo/odoo#239746 Forward-Port-Of: odoo/odoo#238655
This update ensures the TM-m30 printer is consistently recognized as a receipt printer within Odoo, regardless of the backend used. Previously, the system incorrectly identified some printers as office printers. This change improves printer compatibility and ensures accurate receipt printing functionality.
Original PR description
Before this commit, the receipt printer subtype was assigned based on the presence of `CMD:ESC/POS;` in the `device-id` of the printer. However, this string was only present for the `lpd` backend, for `dnssd` it was not resulting in a subtype of Office printer. After this commit, we additionally check for the string `TM-m30` in the device name, and if it is present we set it as a receipt printer. We also check for the string `ZPL` and if found set it as a label printer. task-5411994 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#240171