Tuesday, September 23, 2025
18 changes · 17.0
Enhancements to existing features
The web interface library used by Odoo has been updated to a newer version. This helps keep the user interface foundation current and may bring small stability and compatibility improvements across web screens.
Original PR description
Update the OWL lib. Release notes: https://github.com/odoo/owl/releases/tag/v2.8.1 Forward-Port-Of: odoo/odoo#228092
Resolved issues and error corrections
Contacts in the Dominican Republic can now use valid 11-digit Cedula VAT identifiers, not only 9-digit RNC numbers. This prevents valid customer or company records from being incorrectly rejected during VAT checks.
Original PR description
**Issue** When inputting a VAT number with a length different from 9 digits, the check fails, even if the number is a valid Dominican RNC. **Steps to Reproduce** 1. Install Dominican localization and the VAT check module (base_vat), along with Contacts. 2. Go to Contacts, create a new contact for the Dominican Republic. 3. Insert "152-0000706-8" as the VAT. **Root Cause** The `check_vat_do` method only validated 9-digit RNC numbers via `stdnum.do.rnc.validate()`. 11-digit Cédula numbers are not supported. **Fix** - Updated `check_vat_do` to: * Validate 9-digit RNC numbers using `stdnum.do.rnc.validate()`. * Validate 11-digit Cédula numbers using `stdnum.luhn.validate()`. Opw-5004221 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Code cleanup and technical improvements
This change reorganizes how landed cost valuation adjustments are prepared so custom modules can extend that behavior more easily. It does not change day-to-day user workflows, but it improves maintainability and flexibility for businesses with tailored inventory costing needs.
Original PR description
Create 'cost adjustment stock valuation layer' and the preparing of its values with separate method to make it hookable for custom modules This was split from the initial PR https://github.com/odoo/odoo/pull/160527 cc @pfertyk --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Sign reminder process no longer fails when a document is sent without a “Valid Until” date. This keeps scheduled reminder emails running reliably and avoids error logs for affected signing requests.
Original PR description
Currently below error occurs when cron "Sign: Send mail reminder" is executed.
Error: `TypeError("'<' not supported between instances of 'bool' and
'datetime.date'") while evaluating 'model._cron_reminder()'`
### Steps to reproduce :-
- Open 'Sign' >> Go to 'Templates' >> Click 'Send' on a template.
- Set 'Valid Until' field as empty and 1 as the 'Reminder' >> click 'Send'.
- Run 'Schedule Action' (cron) **Sign: Send mail reminder** ( make sure it has
been 2/3 days since last reminder or change the date to 2/3 days from today.
- The error appears in the log.
This commit solves the above issue by making sure that `validity` is passed.
sentry-6168813276This fix prevents an error in the accounting reconciliation wizard when journal items are not available to identify a company. The system now uses the current company as a safe fallback, helping users continue reconciliation without interruption.
Original PR description
The issue occurs when the system attempts to get a 'company_id' from the move line in the account reconciliation wizard, but the move lines are not available at [1]. Link [1]: https://github.com/odoo/enterprise/blob/0b8820aadfcdfaff4df4bbd26c161951fa95b67d/account_accountant/wizard/account_reconcile_wizard.py#L122 To resolve this, Provide a current company_id as default value if move lines are not available in the account reconciliation wizard. Sentry-6237590490
This fixes an issue where Accounting reports could crash if a report expression used an invalid subformula with the Aggregate Other Formulas engine. Instead of showing an error, the report now handles the invalid setup safely, improving reliability for users opening financial reports.
Original PR description
Currently, a traceback is occurring when the user tries to open a The report contains a subformula in the report expression that does not match. To reproduce this issue: 1) Install `Accounting` 2)…
Currently, a traceback is occurring when the user tries to open a The report contains a subformula in the report expression that does not match. To reproduce this issue: 1) Install `Accounting` 2) Open the `Profit & Losses` report and open any `line` 3) Add the subformula as `sum` for any `report expression` 4) Make sure the `Computation Engine` for expression as `Aggregate Other Formulas` 5) Now open the above report from the `Accounting Reporting` Error:- ``` AttributeError: 'NoneType' object has no attribute 'groupdict' ``` This error occurs when the user gives a subformula to the engine type `Aggregate Other Formulas`. Because it tries to match and group the subformula as `currency_1`, `amount_1`, `criterium`. To do this we need a valid subformula. https://github.com/odoo/enterprise/blob/0611a56074616bd935b0a9e5e7db98b23d8184f0/account_reports/models/account_report.py#L3007-L3013 When the user gives an invalid subformula, the regex results as None. which leads to the above traceback. We can resolve this issue by returning unbound_value if the regex is None. sentry-6325843987
The Product Routes Report now handles manufacturing routes that do not have a source location set. This prevents users from seeing an error when opening the route diagram for products configured for manufacturing.
Original PR description
This error occurs when users view the Product Routes Report. Steps to Reproduce: - Install the `mrp` modules. - Open `Products`. - In the Inventory tab, enable `Manufacture` in Routes. - Clear the `Production Location` field. - Click View `Diagram` in Routes. ValueError: False is not in list This error occurs because, in `Warehouse > Routes`, when a rule is created with the Manufacture action, the Source Location field is not required. However, when generating the Product Routes Report, the system attempts to access this field even if it is empty, resulting in an error. This commit ensures the Product Routes Report view correctly Sentry-6487434464 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Studio now shows a clear user-facing error when someone duplicates a report that points to a template that does not exist. This prevents an unclear system crash and helps users understand what needs to be corrected in the report setup.
Original PR description
This error occurs when a user duplicates the report using Studio. Steps to Reproduce: - Install the `web_studio` and `hr` modules. - Go to `Reporting > Reports`. - Click New, set the Model Name to hr.employee, and enter a non-existent template name like hr.demo in the Template Name field. - Go back and click the Studio icon. - Navigate to Employees > Reports, duplicate the newly created report. `ValueError: Expected singleton: ir.ui.view()` This error occurs because the user attempts to duplicate a report in Studio that references a non-existent template. This commit ensures that if a user duplicates a report with a non-existent template name, a UserError is raised. Sentry-6528691775
This fix ensures timesheet reports correctly include related helpdesk ticket information when applicable. It resolves a prior report update that did not properly target the existing report section, helping users see the expected ticket context in exported or printed timesheet reports.
Original PR description
Description of the issue/feature this PR addresses: The previous commit attempted to extend the timesheet report to display tickets by using position="attributes" on a new . This approach does not work in Odoo reports because position="attributes" can only modify existing elements. There is no indication that the behavior of not displaying tickets was intentional, so this PR corrects that implementation. Current behavior before PR: The previous fix did not correctly locate the existing element for task/project info. Desired behavior after PR is merged: The existing is correctly found and updated to include show_ticket in its t-if.
The system now handles incorrectly written filter rules on relational fields more gracefully. Instead of showing a technical crash, users receive a clear validation message so they can correct the field setup.
Original PR description
Currently an error occurs when a syntactically invalid domain is added to any relational field. Steps to replicate: - Go to `Settings > technical > Fields` and click on New. - Make the field type as…
Currently an error occurs when a syntactically invalid domain is added to any relational field.
Steps to replicate:
- Go to `Settings > technical > Fields` and click on New.
- Make the field type as `Many2one` (any relational type would work).
- Add the domain as `[('x_isLaundy), '=', True)]`, which has a syntax error.
- Add other required fields and save.
Error:
`SyntaxError: unterminated string literal (detected at line 1) (, line 1)`
This error was caused by a `SyntaxError` raised during `safe_eval()` [1] evaluation of a malformed domain. Since the exception wasn't handled properly, it resulted in a traceback.
This commit resolves the issue by catching the `SyntaxError` raised during domain evaluation and converting it into a user-friendly `ValidationError`, preventing unhandled tracebacks.
[1] - https://github.com/odoo/odoo/blob/a3e9b4de2714bd0cc7831e924a0cce490f5da39e/odoo/addons/base/models/ir_model.py#L633-L636
sentry-6676988276
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prCreating a new website page with a title that looks like a filename, such as demo.xml, no longer triggers an error. This improves reliability for website editors and prevents a failed page creation flow when using common title formats.
Original PR description
Currently, an error occurs when creating a new page on the website. Steps to Reproduce: - Install the `website` module. - Go to `Pages` on website. - Click `New` and choose any template except Blank.…
Currently, an error occurs when creating a new page on the website. Steps to Reproduce: - Install the `website` module. - Go to `Pages` on website. - Click `New` and choose any template except Blank. - Enter demo.xml as the page title and click Create. `IndexError: list index out of range` This error occurs when creating a new page and the title includes a file extension. The _guess_mimetype function [1] uses the extension to determine and return the related template name. In [2], if the template does not contain a 'div' with id="wrap", the XPath query returns an empty list. When it tries to access the first element of this empty list, it raises an error. [1] https://github.com/odoo/odoo/blob/8ddc065c5d75750d8fe0736c2232888a543424fd/addons/website/controllers/main.py#L640 [2] https://github.com/odoo/odoo/blob/8ddc065c5d75750d8fe0736c2232888a543424fd/addons/website/models/website.py#L881 This commit ensures that it accesses the first XPath only if there is an element present in the list. sentry-6696313055 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Uploading an OFX bank statement with malformed date values now shows a clear validation error instead of causing an unexpected import failure. This helps accounting users understand that the file content is invalid and prevents a confusing system error during bank statement import.
Original PR description
This error occurs when an uploaded OFX statement file contains malformed date values. For example, the date string `89310133` is interpreted as `8931-01-33` in the `YYYYMMDD` format — but since day 33 is invalid, it causes an error. **Steps to replicate:** * Install `accountant` module with demo data * Accounting Dashboard> Bank>Dropdown>Import [File](https://drive.google.com/file/d/1qWd2mrf1Vh5ZgvDmng-dioNe1xwdfi7y/view?usp=sharing) `OfxParserException:unconverted data remains: 3` **Solution:** * Raise a `ValidationError` when an invalid date is encountered in the file. **Sentry-6715864025**
This fixes an issue that could cause a server error while handling responses from the Nilvera e-invoicing service in Turkey. Users should now receive the intended error message instead of an unexpected technical failure.
Original PR description
The http response object doesn't have a `code` attribute, this commit fixes this typo which has already been fixed in 19.0 as a part of #222869 task-5050516 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Membership invoices now open with the right sales invoice context, so membership products remain searchable on invoice lines even if they are not marked as purchasable. This prevents confusion when editing draft membership invoices and helps users complete invoicing without changing product settings.
Original PR description
**Steps to Reproduce:** 1. Create a new membership product from the Membership module. 2. Open any partner and go to the Membership page. 3. Click on Buy Membership and select the created product. 4.…
**Steps to Reproduce:**
1. Create a new membership product from the Membership module.
2. Open any partner and go to the Membership page.
3. Click on Buy Membership and select the created product.
4. Click on Invoice Membership.
5. Open the newly created draft invoice.
6. From the invoice line, open the product form (via the internal link).
7. Disable the Can be Purchased option and return to the invoice using breadcrumbs.
8. Add a new line in the invoice and search for the same product by its name.
**Observation:**
1. When Can be Purchased is enabled on the product, the product appears in the invoice line search.
2. When Can be Purchased is disabled, the product no longer appears in the search.
**Issue:**
In the product field domain defined in
https://github.com/odoo/odoo/blob/9ba5b41ef0252f4421ff6cdcd7c047b7c53706f4/addons/account/views/account_move_views.xml#L1022-L1029 the `default_move_type` context is `null`.
As a result, only the condition `[('purchase_ok', '=', True)]` is applied in the `name_search` domain.
**Solution:**
Pass the proper context value in the invoice action, ensuring the domain evaluates correctly and the product remains searchable.
**Note:**
The domain used in the following field
https://github.com/odoo/odoo/blob/9ba5b41ef0252f4421ff6cdcd7c047b7c53706f4/addons/account/views/account_move_views.xml#L1022-L1029
is evaluated by a following JavaScript function
https://github.com/odoo/odoo/blob/9ba5b41ef0252f4421ff6cdcd7c047b7c53706f4/addons/web/static/src/core/py_js/py_interpreter.js#L483-L489
rather than on the Python backend. Because the domain logic depends on dynamic
context evaluation performed client-side, there is no straightforward way to
retrieve or test the domain arguments dynamically within the `name_search`
method on the server. As a result, it is not feasible to write automated test
cases for this specific domain filtering scenario in the backend.
opw-5028789This fix prevents appointment slot refreshes from failing when no specific resource is selected. It helps users continue booking appointments smoothly by safely handling missing or empty resource selections before calculating available capacity.
Original PR description
When refreshing the slots, it's possible that the resource_selected_id is equal to None, False or just empty string. This was leading to some error when parsing it to an integer. This commit move the parsing into the method computing the max possible capacity after checking if we got a value. Related commit 3cca7e47ab58f8a7d4e9196dbf60f7068348216b task-5102895
This fix prevents synchronization error messages from causing a crash in the Romanian e-invoicing flow. Businesses using Romanian electronic invoicing get more reliable error reporting when communication issues occur.
Original PR description
Problem
---------
Currently, the 'error' message (in case of communication error) is stored in the 'answer' dict. However, the code verify for the 'error' key in the message dict itself.
Solution
---------
When checking if the 'error' key is present, check in the 'answer' dict rather than the message dict
The code is
```message = {**data, 'answer': {**data, 'error': ""}}```
The verifications were
```'error' in message ?```
and now they are
```'error' in message['answer'] ?```
opw-5046567
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prSales order invoiced amounts now ignore invoice note and section lines, matching standard accounting behavior. This prevents non-billable display lines from affecting invoiced amount calculations and related filters.
Original PR description
When computing the invoiced amount for a SO, ignore the invoice's lines of `display_type` equal to `line_note` and `line_section` This matches the accounting features which always ignore such lines. **Current behavior before PR** Method `_get_sale_order_invoiced_amount` includes display lines. **Desired behavior after PR is merged** Method `_get_sale_order_invoiced_amount` ignores display lines. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fleet vehicle manufacturers now show counts based only on active models, preventing archived models from inflating totals. Users can also filter vehicle models to find archived records when needed, improving data clarity without changing core workflows.
Original PR description
- Fixed count of models in manufacturer to count only active models. - Added 'Archived' search filter for 'model' model Task - 4921998 Forward-Port-Of: odoo/odoo#222353