Friday, March 7, 2025
72 changes
Enhancements to existing features
Point of Sale product searches now avoid showing a misleading notification when matching products are found. Staff will only see a message when no additional products match the search, reducing confusion during checkout.
Original PR description
Previously, the toaster notification incorrectly displayed the number of product variants instead of actual products found. This commit removes the (useless) notification when products are found and only displays "No more product found" when no results match the search. task-id: 4595775 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The invoice report action label is renamed from "PDF" to "Invoice PDF". This makes the option clearer for users when generating or accessing invoice documents.
Original PR description
Changing the name: PDF -> Invoice PDF. task-4614454
Resolved issues and error corrections
Channel member lists now show a person’s full name when hovering over their entry. This makes it easier for users to identify members whose names may be shortened in the list.
Original PR description
Purpose: to display the full name on hover in channel member list. task-4630148 after PR:  --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Miscellaneous changes
Repro steps: 1. Create a new company. 2. Attempt to delete the newly created company. 3. The deletion is successful, but if the user tries to login again, they will keep getting this error `Record does not exist or has been deleted.` Cause: The cause was that the cache would have the id of the deleted company, and attempting to access this company was the bug cause. Solution: This commit solves this bug by clearing the cache on company deletion. task-4438207 --- I confirm I
Original PR description
Repro steps: 1. Create a new company. 2. Attempt to delete the newly created company. 3. The deletion is successful, but if the user tries to login again, they will keep getting this error `Record does not exist or has been deleted.` Cause: The cause was that the cache would have the id of the deleted company, and attempting to access this company was the bug cause. Solution: This commit solves this bug by clearing the cache on company deletion. task-4438207 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200711 Forward-Port-Of: odoo/odoo#200164
Short automated portal or website walkthroughs no longer fail when portal chatter is still loading in the background. This prevents irrelevant test crashes and helps keep validation results stable without changing the customer-facing portal experience.
Original PR description
Backport of https://github.com/odoo/odoo/pull/199212 Runbot may be red due to tours ending while portal chatter is lazy-loading. We don't care of lazy-loading of portal chatter that hasn't ended, the…
Backport of https://github.com/odoo/odoo/pull/199212 Runbot may be red due to tours ending while portal chatter is lazy-loading. We don't care of lazy-loading of portal chatter that hasn't ended, the tour passes and that's what matters. ORIGINAL MESSAGE: Before this commit, short portal and website tours that open a page with portal chatter may crash with following error: ``` Error received after termination: AssetsLoadingError: The loading of http://127.0.0.1:8069/web/bundle/portal.assets_chatter_style?lang=en_US&website_id=1 failed ``` This happens because the tour is so short and doesn't assert loading of portal chatter that the tour ends while portal chatter hasn't been loaded. The tour termination forces abort of ongoing lazy-loading such as portal chatter, which results in the crash above. This commit fixes the issue by silently catching the error in this very specific case that lazy-loading has been aborted by browser page reload or closing, which is precisely the case with tour. The crash is not relevant in that case, in practice the crash is intended to detect programming errors. runbot-114302
Odoo now automatically includes the supporting property-definition field needed by property fields when preparing views. This prevents users from hitting an error in Studio or forms when access rules hide a related field, improving reliability without changing the visible workflow.
Original PR description
Steps to reproduce
==================
- Install repair,web_studio
- Go to repair
- Open any record
- Open studio
- Switch to the misceallaneous tab
- Click on the Operation Type field
- Add the "Technical / Receive notifications in Odoo" group in "Allow visibility to groups"
```
TypeError: Cannot read properties of undefined (reading '0')
at PropertiesField._getSeparatorFoldKey
```
Cause of the issue
==================
Since the user doesn't have that group, the field `picking_type_id` will no be available.
```py
repair_properties = fields.Properties(
'Properties',
definition='picking_type_id.repair_properties_definition'
)
```
That field is needed as it's the definition field for the repair_properties field.
Solution
========
When postprocessing views, we already add some fields that are needed by others. We can do the same for properties fields.
opw-4594796The Point of Sale product card now rounds displayed quantities to two decimal places, preventing confusing values like 4.199999999999999. This makes weighted product totals clearer and more trustworthy for cashiers during checkout.
Original PR description
Steps to reproduce: - install pos - create a product with weigh on scale - open pos session and add it twice, once in 1.9 and once in 2.3 - you will find the number on the card number as 4.1999999999999999 Problem: issue in the precision of decimal additions in javascript, so added a rounding to max 2 decimal places opw-4529408 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 stock dashboard now handles records that do not have a date category instead of failing during display or upgrade checks. This prevents an error in the inventory kanban dashboard and shows a blank value rather than the word "none" when no date is available.
Original PR description
date_category can be None, we should check before adding values to the dict. And also return empty string instead "none" in _compute_kanban_dashboard_graph error from upgrade mock viewer. ``` File…
date_category can be None, we should check before adding values to the dict.
And also return empty string instead "none" in _compute_kanban_dashboard_graph
error from upgrade mock viewer.
```
File "/tmp/tmpd7nbq20v/migrations/base/tests/test_mock_crawl.py", line 256, in crawl_menu
self.mock_action(action_vals)
File "/tmp/tmpd7nbq20v/migrations/base/tests/test_mock_crawl.py", line 269, in mock_action
return self.mock_act_window(action)
File "/tmp/tmpd7nbq20v/migrations/base/tests/test_mock_crawl.py", line 429, in mock_act_window
mock_method(model, view, fields_list, domain, group_by)
File "/tmp/tmpd7nbq20v/migrations/base/tests/test_mock_crawl.py", line 531, in mock_view_kanban
self.mock_web_search_read(model, view, [domain], fields_list)
File "/tmp/tmpd7nbq20v/migrations/base/tests/test_mock_crawl.py", line 590, in mock_web_search_read
data = model.search_read(domain=domain, fields=fields_list, limit=80)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 6074, in search_read
return records._read_format(fnames=fields, **read_kwargs)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 4016, in _read_format
vals[name] = convert(record[name], record, use_display_name)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 6983, in __getitem__
return self._fields[key].__get__(self)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 1287, in __get__
self.compute_value(recs)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 1469, in compute_value
records._compute_field_value(self)
File "/home/odoo/src/odoo/18.0/odoo/models.py", line 5222, in _compute_field_value
fields.determine(field.compute, self)
File "/home/odoo/src/odoo/18.0/odoo/fields.py", line 109, in determine
return needle(*args)
File "/home/odoo/src/odoo/18.0/addons/stock/models/stock_picking.py", line 376, in _compute_kanban_dashboard_graph
summaries[picking_type_id]['total_' + date_category] += 1
KeyError: 'total_none'
```
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-prThis fix ensures the HTML editor only removes focus outlines from areas that are actually editable. Non-editable content keeps its normal visual outline behavior, helping preserve clarity and expected page editing feedback.
Original PR description
**Problem**: The outline is removed for all elements with `contenteditable`, including those with `contenteditable=false`, which is incorrect. **Solution**: Restrict outline removal to elements with `contenteditable=true` only. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The signup password field now has better spacing so typed text does not overlap with the password strength indicator. This makes account creation clearer and easier for users, with no change to the underlying password rules.
Original PR description
Due to the pasword security meter on the right of the input, the content of the input can overflow behind the security meter. Note: I seized the opportunity to reindent this file according to our coding guidelines task-4630394 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The HTML editor's automated tests now use the actual default text color instead of assuming a value from the Enterprise edition. This makes test results consistent across Odoo editions and helps prevent false failures during development.
Original PR description
Before this commit, some tests based on the default text color only worked if the tests were run with enterprise because the default text color was hard-coded based on the style of enterprise. 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
Down payment receipts in Point of Sale now display long product names without creating an unwanted horizontal scrollbar. This keeps receipts easier to read and improves the checkout experience for staff and customers.
Original PR description
Before this commit, making a down payment for a sale order with a product that has a long name would cause a horizontal scroll bar to appear in the receipt. Before: <img width="259" alt="image" src="https://github.com/user-attachments/assets/3db17ad0-e1a7-4653-9e50-edd9dd8c4e9e" /> After: <img width="383" alt="image" src="https://github.com/user-attachments/assets/faa0c3ea-c400-4cb6-96ed-2b496236710f" /> opw-4604797 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Public ecommerce visitors no longer receive access to react to product or course reviews unless they have a valid portal identity. This keeps review interaction permissions consistent and prevents anonymous users from seeing or using reaction features incorrectly.
Original PR description
This commit completes the fix https://github.com/odoo/odoo/pull/197508. In this commit we make sure that the thread has the correct `can_react` value by also checking that the user has a valid portal_partner.
Point of Sale now avoids loading a customer's linked price list and products during customer search when those items are not available in the PoS. This prevents extra, unintended data from being pulled into the session and helps keep PoS behavior aligned with its configured availability.
Original PR description
Before this commit, when a partner linked to a specific pricelist was searched and loaded in the PoS, the associated pricelist and its products could be unintentionally loaded, even if they were not available in the PoS. opw-4615603 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This commit fixed the access error issue that non-admin users would encounter when submitting a Jordanian e-invoice. It adds sudo access rights to the fields l10n_jo_edi_client_identifier and l10n_jo_edi_secret_key while reading them for e-invoice submission. task-4577597 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200015
Original PR description
This commit fixed the access error issue that non-admin users would encounter when submitting a Jordanian e-invoice. It adds sudo access rights to the fields l10n_jo_edi_client_identifier and l10n_jo_edi_secret_key while reading them for e-invoice submission. task-4577597 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200015
Currently, the date filters do not have their title displayed in the `FilteValue` component which is an issue in dashboards where one could have multiple date filters defined and could not differentiate them. This revision adds the fiter label as a title such that users can identify the right filter given that they gave it an appropriate label. task-4606670 Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged:
Original PR description
Currently, the date filters do not have their title displayed in the `FilteValue` component which is an issue in dashboards where one could have multiple date filters defined and could not differentiate them. This revision adds the fiter label as a title such that users can identify the right filter given that they gave it an appropriate label. task-4606670 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#200657 Forward-Port-Of: odoo/odoo#200502
Versions -------- - saas-17.4+ Earlier versions displayed each variant seperately. Steps ----- 1. Have 2 product template attributes A and B; 2. have one of B's attribute values be excluded for one of A's values; 3. have a product template using these values; 4. ensure product template is available in POS; 5. sell product template in POS. Issue ----- The attribute combination that should be excluded isn't displayed as such. Cause ----- When checking for product attribute
Original PR description
Versions -------- - saas-17.4+ Earlier versions displayed each variant seperately. Steps ----- 1. Have 2 product template attributes A and B; 2. have one of B's attribute values be excluded for one of A's values; 3. have a product template using these values; 4. ensure product template is available in POS; 5. sell product template in POS. Issue ----- The attribute combination that should be excluded isn't displayed as such. Cause ----- When checking for product attribute exclusions, it currently only considers attribute combinations of archived products to be unavailable for sale. Solution -------- In the `_get_archived_combinations_per_product_tmpl_id` method, factor in attribute exclusions, and treat them as archived product variants. In master, rename the method & references to it to reflect more general unavailable attribute combinations instead of specifically archived products. opw-4521198 Forward-Port-Of: odoo/odoo#199042
Since the upgrade of Chartjs to v4.3 in [commit 1], stacked charts in website were wrongly computed. This commit fixes it. [commit 1]: https://github.com/odoo/odoo/commit/7e3c1ecdb86110912b15722e600f9571692807ed task-4603349 Forward-Port-Of: odoo/odoo#199186
Original PR description
Since the upgrade of Chartjs to v4.3 in [commit 1], stacked charts in website were wrongly computed. This commit fixes it. [commit 1]: https://github.com/odoo/odoo/commit/7e3c1ecdb86110912b15722e600f9571692807ed task-4603349 Forward-Port-Of: odoo/odoo#199186
#### Description of the issue/feature this PR addresses: When updating an allocation's number_of_days, a validation check is performed to ensure that we do not reduce the `number_of_days` to be less than the number of leaves that are taken by the employee. However this logic also takes into consideration any virtual leaves (leaves that are in the `confirm` or `validate1` state, ie. leaves that are awaiting an approval) that may have been requested by an employee. These virtual leaves that ar
Original PR description
#### Description of the issue/feature this PR addresses: When updating an allocation's number_of_days, a validation check is performed to ensure that we do not reduce the `number_of_days` to be less…
#### Description of the issue/feature this PR addresses: When updating an allocation's number_of_days, a validation check is performed to ensure that we do not reduce the `number_of_days` to be less than the number of leaves that are taken by the employee. However this logic also takes into consideration any virtual leaves (leaves that are in the `confirm` or `validate1` state, ie. leaves that are awaiting an approval) that may have been requested by an employee. These virtual leaves that are not yet approved should not count towards the calculation since it could be possible that the employer could refuse them or the employee's accrual plan could grant sufficient leaves if it is requested for a future date. #### Current behavior before PR: 1. Setup a timeoff type that requires approval from the manager 2. Set up an accrual plan where an employee accrues '_N_' days of leave at the start of each year with **no carryover** (NOTE: the no carryover is the most crucial step because this is what writes the number_of_days on the leave allocation to zero) 3. Request a leave by an employee for any date after the carryover period. What should have happened: The accrual should reset the leaves based on no carryover policy back to _N_ days However, it throws a validation error: Now the issue happens because when we see that the carryover is none because of which: 1. The allocated leaves are set to 0 when calling this CRON (for no carryover): https://github.com/odoo/odoo/blob/cf18c4ac88919513a9f2b922d625fa5dc113cb39/addons/hr_holidays/models/hr_leave_allocation.py#L527 2. The leave that was requested by the employee but not yet approved causes the validation to fail. It is best explained in the below screen recording which uses the test case mentioned in the commit: https://github.com/user-attachments/assets/f8914bac-815d-48c9-b4b2-c132a2fccbdb   #### Desired behavior after PR is merged: Virtual Leaves that are not yet approved would not block us from updating the allocation's `number_of_days` opw-4442471 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200000 Forward-Port-Of: odoo/odoo#198382
This https://github.com/odoo/enterprise/commit/68f6c1f9fd3ff6762c98e1a405ade035129efce0 caused the `test_create_res_partner` test to fail. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200527
Original PR description
This https://github.com/odoo/enterprise/commit/68f6c1f9fd3ff6762c98e1a405ade035129efce0 caused the `test_create_res_partner` test to fail. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200527
### Steps to reproduce: - In Sale create an empty sale order and confirm - In Expense > Configuration > Expense Categories > Mileage set the price per km to be 1 and "Re-Invoice Expenses" to "Sales price" - Create a new expense - Change the category to "Mileage" - Set a quantity >1 - In "Customer to Reinvoice" select the one from the quotation - Click "Create Report" > "Submit to Manager" > "Validate" > "Post Journal Entries" - Return to the sale order - The number under "Delivered" is
Original PR description
### Steps to reproduce: - In Sale create an empty sale order and confirm - In Expense > Configuration > Expense Categories > Mileage set the price per km to be 1 and "Re-Invoice Expenses" to "Sales price" - Create a new expense - Change the category to "Mileage" - Set a quantity >1 - In "Customer to Reinvoice" select the one from the quotation - Click "Create Report" > "Submit to Manager" > "Validate" > "Post Journal Entries" - Return to the sale order - The number under "Delivered" is 1, it should be the same as the quantity ### Cause: When creating the move from the expense, the quantity is not given and defaults to 1. ### Solution: Add the quantity to the `payments_vals`. opw-4389303 Forward-Port-Of: odoo/odoo#200179 Forward-Port-Of: odoo/odoo#192524
**Current behavior:** Adding a product which is invoiced based on delivered quantities to the delivery of a sale which has already been confirmed, then validating the delivery, does not reflect the change in price (which will be invoiced) on the sale order. **Expected behavior:** The sale order should show the actual amount of money to be charged to the orderer. **Steps to reproduce:** 1. Create a stored product with some price and change its invoicing policy to 'delivery' 2. Cr
Original PR description
**Current behavior:** Adding a product which is invoiced based on delivered quantities to the delivery of a sale which has already been confirmed, then validating the delivery, does not reflect the…
**Current behavior:** Adding a product which is invoiced based on delivered quantities to the delivery of a sale which has already been confirmed, then validating the delivery, does not reflect the change in price (which will be invoiced) on the sale order. **Expected behavior:** The sale order should show the actual amount of money to be charged to the orderer. **Steps to reproduce:** 1. Create a stored product with some price and change its invoicing policy to 'delivery' 2. Create a new sale order, add 1 of the created product, then confirm it 3. Open the delivery, add another line to it for the same created product, fill in the quantities for each move, then validate the picking 4. Check the sale order line to see that, while the price unit is populated with the product's price, the subtotal/total fields are not **Cause of the issue:** Order lines added in this manner have `product_uom_qty == 0` which will zero-out the price computation. **Fix:** First, `_compute_purchase_price` is modified such that lines for standard cost product will have a value computed (where previously they were skipped). Then for `_compute_margin`: use `qty_delivered` and an on-the-fly calculated `price_subtotal` to find a margin value for a SOL added from a delivery (which is determined when `product_uom_qty == 0` and `qty_delivered != 0` opw-4210056 Forward-Port-Of: odoo/odoo#186236
**Steps to reproduce:** 1. Log in with a non-admin users 2. Open any Partner from 3. Click on Actions > Privacy Lookup **Bug:** ``` You are not allowed to access 'Privacy Lookup Wizard' (privacy.lookup.wizard) records. This operation is allowed for the following groups: - Administration/Settings Contact your administrator to request access if necessary. ``` **Expected behavior:** The error message is correct. This feature should only be available to Administrator user
Original PR description
**Steps to reproduce:** 1. Log in with a non-admin users 2. Open any Partner from 3. Click on Actions > Privacy Lookup **Bug:** ``` You are not allowed to access 'Privacy Lookup Wizard' (privacy.lookup.wizard) records. This operation is allowed for the following groups: - Administration/Settings Contact your administrator to request access if necessary. ``` **Expected behavior:** The error message is correct. This feature should only be available to Administrator users. Therefore, the action should be hidden accordingly. See: - https://github.com/odoo/odoo/blob/16.0/addons/privacy_lookup/security/ir.model.access.csv#L2 --- ping @tivisse --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#192227 Forward-Port-Of: odoo/odoo#150748
Versions -------- - 16.0+ Steps ----- 1. Have a cart ready to be paid; 2. open `/shop/payment` in two windows; 3. click "Pay now" in one window; 4. click "Pay now" in the next window. Issue ----- Depending on version, installed modules & click speed, one of the following happens: - Error: "The operation cannot be completed: Reference must be unique!" - 500: Internal Server Error. - Both payments get confirmed. Cause ----- There's no check on whether a payment is already b
Original PR description
Versions -------- - 16.0+ Steps ----- 1. Have a cart ready to be paid; 2. open `/shop/payment` in two windows; 3. click "Pay now" in one window; 4. click "Pay now" in the next window. Issue -----…
Versions -------- - 16.0+ Steps ----- 1. Have a cart ready to be paid; 2. open `/shop/payment` in two windows; 3. click "Pay now" in one window; 4. click "Pay now" in the next window. Issue ----- Depending on version, installed modules & click speed, one of the following happens: - Error: "The operation cannot be completed: Reference must be unique!" - 500: Internal Server Error. - Both payments get confirmed. Cause ----- There's no check on whether a payment is already being processed for a particular order. This can happen in two manners: 1. The 1st one has finished, but the 2nd one is still allowed to start. 2. Clicking fast enough, both will try to transaction concurrently. Solution -------- 1. If the `amount_total` is equal to `amount_paid`, raise an error. 2. Put a database-level lock on the Sale Order using `FOR NO KEY UPDATE` which will get released as soon as the payment transaction is committed to the database, or is rolled back due to failure. opw-4555664 Forward-Port-Of: odoo/odoo#200428 Forward-Port-Of: odoo/odoo#198873
The Sales Details report in POS sometimes displays incorrect quantities due to floating point precision errors. This happens when summing product quantities that have decimal values, leading to unintended rounding inaccuracies in the report output. Steps to Reproduce: 1. Create a sample product to be sold in POS. 2. Check the rounding precision set for the unit of measure for this product. 3. Open a new POS session and confirm an order with `14.9` quantities of the product. 4. Create anot
Original PR description
The Sales Details report in POS sometimes displays incorrect quantities due to floating point precision errors. This happens when summing product quantities that have decimal values, leading to…
The Sales Details report in POS sometimes displays incorrect quantities due to floating point precision errors. This happens when summing product quantities that have decimal values, leading to unintended rounding inaccuracies in the report output. Steps to Reproduce: 1. Create a sample product to be sold in POS. 2. Check the rounding precision set for the unit of measure for this product. 3. Open a new POS session and confirm an order with `14.9` quantities of the product. 4. Create another order for the same product, this time with `59.7` as the quantity. 5. Go to POS → Reporting → Sales Details, select the relevant POS, and print the report. 6. Issue: The generated PDF report incorrectly shows `74.60000000000001` instead of `74.6`. The sum of product quantities was not respecting the unit of measure's decimal precision, leading to floating point inaccuracies in the report. I Applied rounding to the quantity aggregation using the decimal precision of Product Unit of Measure, ensuring consistent and correctly formatted values in the report. opw-4430513 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#198114 Forward-Port-Of: odoo/odoo#197755