Wednesday, February 26, 2025
22 changes · 17.0
Enhancements to existing features
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
Original PR description
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
Adds automated coverage to confirm that visitors can complete the basic appointment booking journey, including selecting an appointment type, choosing a slot, and passing the email check. This helps reduce the risk of booking issues reaching customers by validating a key public-facing flow.
Original PR description
Before this commit, there is no test covering a visitor can properly book an appointment. This test focuses on the basic flow, from selecting an appointment type to successfully booking a slot, including coverage of the email check. task-4601065
Resolved issues and error corrections
The online shop’s mobile filter panel now includes multi-checkbox product attributes, matching the desktop shopping experience. This helps mobile shoppers find products using all available filter options instead of missing certain attributes.
Original PR description
## Versions:
17.0+
## Issue:
Multi-checkboxes attributes are displayed as filters in the shop view but are not displayed in mobile view.
## Steps to reproduce:
1. Create a `Multi-checkbox (option)` attribute called "Extra" via `Sales / Configuration / Products / Attributes`;
2. Add 1 attribute value;
3. Go to any product available on the shop (e.g. Acoustic Bloc Screens);
4. Via its `Attributes & Variants` tab, add the newly created attributes and select the value;
5. Go to the shop via the `Website` app;
- *In normal web view, the filter is available on the left*
6. Change view to mobile mode and open the filters;
7. Open the "Extra filter and see no filter under it.
## Cause:
Mobile displayed filters are restricted to avoid color attributes but didn't expand to allow multi-checkboxes.
opw-4383970Miscellaneous changes
- Open a posted invoice - Reset to draft - Action > Switch into invoice/credit note Validation Error will raise `You cannot switch the type of a posted document.` However the message is misleading, because we check that the document has not been posted at all opw-4509455 Forward-Port-Of: odoo/odoo#198592
Original PR description
- Open a posted invoice - Reset to draft - Action > Switch into invoice/credit note Validation Error will raise `You cannot switch the type of a posted document.` However the message is misleading, because we check that the document has not been posted at all opw-4509455 Forward-Port-Of: odoo/odoo#198592
Resume content searches in recruitment now only look at files attached to applicant records. This prevents unrelated attachments from appearing in search results, helping recruiters find the right candidates more reliably.
Original PR description
Currently, searching for `Resume's Content` on applicants uses the domain `attachment_ids.index_content`, which searches the `index_content` of all attachments, ignoring the model they are linked to. This update modifies the domain to include a `res_model` filter, ensuring the search is limited to applicants' attachments, which are typically CVs added by recruiters. opw-4558352 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Unsupported web editor file URLs now return a normal “not found” response instead of causing a server error. This prevents unnecessary error reports and gives users a cleaner experience when invalid editor asset links are requested.
Original PR description
Currently a ValueError occurs when users access URLs like '/web_editor/shape/image/jpeg'. Error: ``` ValueError: Unsupported file: util/static/shapes/index File "odoo/http.py", line 2364, in __call__…
Currently a ValueError occurs when users access URLs like '/web_editor/shape/image/jpeg'.
Error:
```
ValueError: Unsupported file: util/static/shapes/index
File "odoo/http.py", line 2364, in __call__
response = request._serve_db()
File "odoo/http.py", line 1892, in _serve_db
return self._transactioning(
File "odoo/http.py", line 1955, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 137, in retrying
result = func()
File "odoo/http.py", line 1922, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2082, in dispatch
return self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 329, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 727, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "addons/html_editor/controllers/main.py", line 499, in shape
svg = self._get_shape_svg(module, 'shapes', filename)
File "addons/html_editor/controllers/main.py", line 84, in _get_shape_svg
with file_open(shape_path, 'r', filter_ext=('.svg',)) as file:
File "odoo/tools/misc.py", line 247, in file_open
path = file_path(name, filter_ext=filter_ext, env=env)
File "odoo/tools/misc.py", line 210, in file_path
raise ValueError("Unsupported file: " + file_path)
```
This ValueError was raised from the odoo/tools/misc.py at line [1] because the
file extension was not a match with the normalise path of the file path.
This commit will handle the ValueError at the time of opening the file;
now it shows not found instead of an error.
https://github.com/odoo/odoo/blob/231952114ae730bb8d4671f4a61f738e8b6dd5b8/odoo/tools/misc.py#L177-L178
sentry-6073086305This fixes an internal testing issue in financial reports where repeated test data could be created and cause failures. The change helps keep automated checks reliable, reducing the risk of delays or false alarms during product validation.
Original PR description
A previous commit[^1] disabled the rollback of the subtests. This was leading to the creation of multiple times the same data inside of the same sub transaction, raising a constraint on the company name, which should be unique. runbot-135304 [^1]: 8f50521be74d0cf858beea3b0aeb59760264ac4d
This update removes an empty view replacement that could interfere with how payroll contract screens are extended. It helps keep Swiss payroll ELM transmission contract views loading and inheriting correctly, reducing the risk of display or configuration issues.
Original PR description
This PR removes empty replace possibly breaking view inheritence
Signature request date fields now follow the recipient partner's language settings instead of the company's language. This ensures customers see dates in the expected local format, reducing confusion during document signing.
Original PR description
Issue: - When we send a signature request to a partner with a different than the company language, the dates in the signature request are always filled in the company language. Steps To Reproduce: - Create a partner and set its language to a different language than the company language. (i.e. Traditional Chinese) - Create a signature request for this partner and put a date field in it - Send the signature request to the partner - open the request's link from the email, and click on the date feild, it will be filled with the company language. Solution: - in the sign controller, the `get_document_qweb_context` method used to set `today_formatted_date` based on the company language, this fix changes it to use the partner language instead. OPW-4566396
A bug in accounting reports has been fixed so reports remember which nested lines are unfolded when users expand sections. This helps users keep the expected report view and avoids confusing collapses while reviewing financial details.
Original PR description
The unfolded_lines option was not updated when a line was expanded using the expand function, if the expanded lines contained already unfolded child lines. This commit updates the unfolded_lines option correctly. Backport of ca1cf04f0410966981a341f569114511ae5a50fd
## Versions: 16.0 17.0 No fix needed for saas-17.2 as per https://github.com/odoo/odoo/commit/5542bfd48fad3b89e3e54c9534da2e4963a90d54 ## Issue: A `(Draft)` text appears on sale orders lines when a down payment is done from the `Point of Sale` app. This text keeps appearing during the entire process, even on the invoice. ## Expected: A down payment made from the PoS app should not be a draft as it has been paid. The trailing text should not appear. ## Steps to reproduce: - Activa
Original PR description
## Versions: 16.0 17.0 No fix needed for saas-17.2 as per https://github.com/odoo/odoo/commit/5542bfd48fad3b89e3e54c9534da2e4963a90d54 ## Issue: A `(Draft)` text appears on sale orders lines when a…
## Versions: 16.0 17.0 No fix needed for saas-17.2 as per https://github.com/odoo/odoo/commit/5542bfd48fad3b89e3e54c9534da2e4963a90d54 ## Issue: A `(Draft)` text appears on sale orders lines when a down payment is done from the `Point of Sale` app. This text keeps appearing during the entire process, even on the invoice. ## Expected: A down payment made from the PoS app should not be a draft as it has been paid. The trailing text should not appear. ## Steps to reproduce: - Activate Sales and Point Of Sale apps; - Ensure, in the PoS settings, the shop you will use has a down payment product setup (`Down Payment (POS)`; - Create a new `Quotation` from the `Sales` app with a product available in the PoS; - Got to the shop view (open a session) and click on the `Quotation/Order` button; - Select the lately created order and `Apply a down payment` with any value; - Proceed payment with any method and navigate to backend; - Go back to the quotation and look at the notebook. ## Cause: `(Draft)` text is added at the end of the down payment product's line as the `dp_state` is equal to `'draft'`. ## Fix: The problem has been correctly managed from saas-17.4 but needs more database fields: https://github.com/odoo/odoo/blob/0c0754b0fa9ee1f9efa20d1ae78a34df3dac5110/addons/sale/models/sale_order_line.py#L135-L145 opw-4380985 Forward-Port-Of: odoo/odoo#190892
When odoo.pivot.value is surrounded with an IF and the result of that IF has a value, AND the odoo.pivot.value isn't perfectly formed, in dashboard mode, when the user clicks on that value it creates a traceback. Reproducible on runbot: - sales > pivot - fold existing groups - group by user on the left and by customer on top - add a cell whose formula is `=if(false, ODOO.PIVOT(1,"amount_total","user_id",2,"partner_id", "#Error"), "test")` - Create a dashboard using this spreadsheet - cl
Original PR description
When odoo.pivot.value is surrounded with an IF and the result of that IF has a value, AND the odoo.pivot.value isn't perfectly formed, in dashboard mode, when the user clicks on that value it creates a traceback. Reproducible on runbot: - sales > pivot - fold existing groups - group by user on the left and by customer on top - add a cell whose formula is `=if(false, ODOO.PIVOT(1,"amount_total","user_id",2,"partner_id", "#Error"), "test")` - Create a dashboard using this spreadsheet - click on the test cell > traceback This fix is removing the "see records" menu from the cells that can't have a correct domain on their pivot values. Task: 4582219 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#198025
The base URL was being retrieved incorrectly in `_compute_short_url_host()` without considering the current company. This caused the short URL to always use the domain of the company logged into the database, rather than the domain of the selected company. This happens because the base URL was retrieved using `get_current_website()` from the `website` module, which does not consider the company context. As a result, the short URL adapts based on the domain of the last logged-in company, lead
Original PR description
The base URL was being retrieved incorrectly in `_compute_short_url_host()` without considering the current company. This caused the short URL to always use the domain of the company logged into the…
The base URL was being retrieved incorrectly in `_compute_short_url_host()` without considering the current company. This caused the short URL to always use the domain of the company logged into the database, rather than the domain of the selected company. This happens because the base URL was retrieved using `get_current_website()` from the `website` module, which does not consider the company context. As a result, the short URL adapts based on the domain of the last logged-in company, leading to inconsistent URLs. Steps to reproduce: 1. Context: The database has two companies, Company A and Company B, each with their own custom domains, Domain A and Domain B. 2. Log in to the database using Domain A. - Post a link via social marketing for Company A. The short URL will use Domain A. 3. Switch to the Company B. - Post the same link via social marketing for Company B. The short URL will now incorrectly use Domain A instead of B. While the short URL still redirects to the correct content, the domain in the short URL is inconsistent and depends on the last logged-in domain. OPW-4235176 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#194331
At some point, servers started to return `image/svg+xml; charset=utf-8` instead of `image/svg+xml` in the `content-type` header of SVG images. Because of this, dynamic SVGs were not properly handled anymore. This commit adapts the mimetype comparisons to cope for this extra `charset` info inside the mimetype. Steps to reproduce: - Drop an image block inside a website page. - Replace the image. - Search for e.g. "city". - Pick an undraw illustration. => The image was lost because its
Original PR description
At some point, servers started to return `image/svg+xml; charset=utf-8` instead of `image/svg+xml` in the `content-type` header of SVG images. Because of this, dynamic SVGs were not properly handled anymore. This commit adapts the mimetype comparisons to cope for this extra `charset` info inside the mimetype. Steps to reproduce: - Drop an image block inside a website page. - Replace the image. - Search for e.g. "city". - Pick an undraw illustration. => The image was lost because its `src` became `false`. Forward-Port-Of: odoo/odoo#198267
Issue: ------ Case: User Settings menu is basically used to handle created users but when clicking on the `New` button within the User Settings the form view corresponding to that model i.e; `res.users.settings` will be opened which is an inappropriate behavior. Whenever a User is created that user will be reflected within that menu. There's no meaning of having `New` button when no user is created to handle. Solution: ----------- Some users do not have a user settings yet, so it is a p
Original PR description
Issue: ------ Case: User Settings menu is basically used to handle created users but when clicking on the `New` button within the User Settings the form view corresponding to that model i.e;…
Issue: ------ Case: User Settings menu is basically used to handle created users but when clicking on the `New` button within the User Settings the form view corresponding to that model i.e; `res.users.settings` will be opened which is an inappropriate behavior. Whenever a User is created that user will be reflected within that menu. There's no meaning of having `New` button when no user is created to handle. Solution: ----------- Some users do not have a user settings yet, so it is a perfectly valid use case to create one. We should not artificially prevent acceptable behavior in technical/admin menus. Steps to reproduce: ------------------------ 1. Create a database in version 16.0. 2. Go to `User Settings`. 3. Click On `New` button. Try making changes and save. 4. An Invalid Field `User` error will Occur. This is because there's a many2One field i.e; `user_id` within the tree and form views which is basically an existing user. The `New` button will open a form view with no User which is a must. And will cause the Invalid field error when trying to save any change. Ref: https://github.com/odoo/odoo/blob/16.0/addons/mail/views/res_users_settings_views.xml#L24 Ref Screenshot:  Co-Authored By - @seb-odoo Forward-Port-Of: odoo/odoo#193400
Indonesia officially added new provinces in 2022. - Papua Barat Daya was forgotten in an old PR. - Papua Pengunungan was assigned ISO code PE, not PP. In 16.0, we just change the ISO code. The XMLID will be corrected in master. Codes: https://www.geonames.org/ID/administrative-division-indonesia.html Official Document: https://peraturan.bpk.go.id/Details/232726/uu-no-29-tahun-2022 Wikipedia in English: https://en.wikipedia.org/wiki/Provinces_of_Indonesia Original PR: odoo/
Original PR description
Indonesia officially added new provinces in 2022. - Papua Barat Daya was forgotten in an old PR. - Papua Pengunungan was assigned ISO code PE, not PP. In 16.0, we just change the ISO code. The XMLID will be corrected in master. Codes: https://www.geonames.org/ID/administrative-division-indonesia.html Official Document: https://peraturan.bpk.go.id/Details/232726/uu-no-29-tahun-2022 Wikipedia in English: https://en.wikipedia.org/wiki/Provinces_of_Indonesia Original PR: odoo/odoo#193103 Forward-Port-Of: odoo/odoo#199035
Starting from January 6th, 2025, USPS _silently_ migrated to a new developer portal (devloper`s`.usps.com instead of developer.usps.com). See: https://developer.usps.com/getting-started. The new portal also introduces new base URL for their endpoints (See: https://developers.usps.com/sites/default/files/2024-10/USPS%20API%20Cloud%20Enrollment.pdf). Users who registered after this date didn't manage to use Odoo shipping connector for USPS since it used the old endpoints. This commit updat
Original PR description
Starting from January 6th, 2025, USPS _silently_ migrated to a new developer portal (devloper`s`.usps.com instead of developer.usps.com). See: https://developer.usps.com/getting-started. The new portal also introduces new base URL for their endpoints (See: https://developers.usps.com/sites/default/files/2024-10/USPS%20API%20Cloud%20Enrollment.pdf). Users who registered after this date didn't manage to use Odoo shipping connector for USPS since it used the old endpoints. This commit updates the used endpoints so that it's compatible with the new portal. opw-4576028 Forward-Port-Of: odoo/enterprise#80152
Steps to reproduce: - With an MX company setup - Set a rate for a foreign currency - Create an invoice in foreign currency with just a line having 100% discount - Save, confirm and send - Check generated xml Issue: TipoCambio will be 1.0, but it should always report the applied currency exchange opw-4490679 Forward-Port-Of: odoo/enterprise#79862
Original PR description
Steps to reproduce: - With an MX company setup - Set a rate for a foreign currency - Create an invoice in foreign currency with just a line having 100% discount - Save, confirm and send - Check generated xml Issue: TipoCambio will be 1.0, but it should always report the applied currency exchange opw-4490679 Forward-Port-Of: odoo/enterprise#79862
**Issue:** The COA for the French localization has been updated in 2025. Some accounts have been replaced or removed and the reports have been updated with the new formulas. However, the reports from 2024 are still needed for those who need to print a report for 2024. **Solution:** Restore the old reports from 2024 as variants. opw-4566689 opw-4590293 opw-4572865 Forward-Port-Of: odoo/enterprise#79946
Original PR description
**Issue:** The COA for the French localization has been updated in 2025. Some accounts have been replaced or removed and the reports have been updated with the new formulas. However, the reports from 2024 are still needed for those who need to print a report for 2024. **Solution:** Restore the old reports from 2024 as variants. opw-4566689 opw-4590293 opw-4572865 Forward-Port-Of: odoo/enterprise#79946
recaptchav3 is enabled on most website forms by default but not on appointments. To mitigate bot attacks spamming free appointment bookings we enable the feature when website is installed. A similar change was recently applied at [1] [1] bafa915f85fb8fc6ca2ae7d194a4593cb2463c2e task-4335141 Forward-Port-Of: odoo/enterprise#74682
Original PR description
recaptchav3 is enabled on most website forms by default but not on appointments. To mitigate bot attacks spamming free appointment bookings we enable the feature when website is installed. A similar change was recently applied at [1] [1] bafa915f85fb8fc6ca2ae7d194a4593cb2463c2e task-4335141 Forward-Port-Of: odoo/enterprise#74682
Multiple problems can arise when a project has the documents feature enabled but no folder linked to it. This PR fixes two edge cases related to projects not having a folder. Task-4107728 Forward-Port-Of: odoo/enterprise#68688
Original PR description
Multiple problems can arise when a project has the documents feature enabled but no folder linked to it. This PR fixes two edge cases related to projects not having a folder. Task-4107728 Forward-Port-Of: odoo/enterprise#68688
Currently, an error may occur when we try to export the trial balance with the SAT (XML) format. This is because the account_group ID is used to browse the account, due to a more specific account_group. Steps to reproduce: 1. Install l10n_mx_reports. 2. Create an account_group with a more specific account, such as 401.01.01 - The 4, 401, and 401.01 groups are created with demo data. 3. Go to trial balance and try exporting with "SAT (XML)". 4. An error will occur (Missing Record) beca
Original PR description
Currently, an error may occur when we try to export the trial balance with the SAT (XML) format. This is because the account_group ID is used to browse the account, due to a more specific account_group. Steps to reproduce: 1. Install l10n_mx_reports. 2. Create an account_group with a more specific account, such as 401.01.01 - The 4, 401, and 401.01 groups are created with demo data. 3. Go to trial balance and try exporting with "SAT (XML)". 4. An error will occur (Missing Record) because the account_group ID is used to browse the account. This fix does two things: 1. It ensures that only account.account lines are considered. 2. It changes the line length condition from `= 4` to `>= 4` to handle more specific grouping. opw-4537859 Forward-Port-Of: odoo/enterprise#80128