Tuesday, September 23, 2025
30 changes · 18.0
Enhancements to existing features
The web interface’s underlying OWL library has been updated to a newer version. This helps keep Odoo’s user interface foundation current and may bring small stability and maintainability improvements without introducing a direct business process change.
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
Fixed an issue where importing certain electronic invoice files could fail if the file contained a zero base quantity. This makes invoice imports more reliable for customers receiving UBL/CII documents with that value.
Original PR description
**Steps to reproduce:** - Install Accounting - Go to "Accounting / Customers / Invoices" - Import a UBL file having a value of 0 for a `<cbc:BaseQuantity>` element **Issue:** The import fails due to a division by 0 at: `price_unit = (net_price_unit + rebate) / basis_qty` **Cause:** "basis_qty" is retrieved as followed: `basis_qty = float(self._find_value(xpath_dict['basis_qty'], tree) or 1)` If the element is not defined, it will fall back on 1. But if the element exists with a value of 0, the "_find_value" method will retrieve the string "0" which is not False and will not fall back on 1. Then it will become `0.0` once converted to float. opw-5062985 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an error that could appear when restaurant staff repeatedly edited a kitchen note and quantity before sending an order. The change helps keep point-of-sale order preparation workflows reliable and avoids unnecessary log errors during service.
Original PR description
Currently a `TypeError` is arising when user select a meal, add the 'Kitchen Note', change the quantity and hit 'Order'. Steps to reproduce this error: - Select a dish and add a 'Kitchen note', hit 'Order'. - Now edit the 'Kitchen note' and the quantity, hit 'Order'. - Again edit the 'Kitchen note' and the quantity, hit 'Order'. - The error appears in the logs. Error: `TypeError: 'NoneType' object is not subscriptable` This commit solves the above issue by checking if the `old_quantity` is not `None`. sentry-6013783573
The update prevents crashes when employee or working schedule timezone information is missing by safely using UTC as a fallback. This improves reliability in payroll and related workflows where missing timezone settings previously caused errors.
Original PR description
Currently a traceback occurrs from multiple places when there is no tz for employee and used in the `pytz.timezone` method.…
Currently a traceback occurrs from multiple places when there is no tz for employee and used in the `pytz.timezone` method.
https://github.com/odoo/enterprise/blob/517983ae9deec37795eb11522134a1f5ade31e9b/hr_payroll/wizard/hr_payroll_payslips_by_employees.py#L131
For instance, if there is no tz in resource_calendar_id, it leads to a traceback.
Error:
```
AttributeError: 'bool' object has no attribute 'upper'
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 2169, in dispatch
result = 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/web/controllers/dataset.py", line 35, in call_kw
return call_kw(request.env[model], method, args, kwargs)
File "odoo/api.py", line 517, in call_kw
result = getattr(recs, name)(*args, **kwargs)
File "addons/web/models/models.py", line 70, in web_save
self.write(vals)
File "home/odoo/src/enterprise/18.0/hr_payroll/models/hr_contract.py", line 429, in write
res = super().write(vals)
File "addons/hr_work_entry_contract/models/hr_contract.py", line 453, in write
contract._recompute_work_entries(date_from, date_to)
File "home/odoo/src/enterprise/18.0/hr_payroll/models/hr_contract.py", line 441, in _recompute_work_entries
self._recompute_payslips(date_from, date_to)
File "home/odoo/src/enterprise/18.0/hr_payroll/models/hr_contract.py", line 453, in _recompute_payslips
all_payslips.action_refresh_from_work_entries()
File "home/odoo/src/enterprise/18.0/hr_payroll/models/hr_payslip.py", line 601, in action_refresh_from_work_entries
payslips._compute_worked_days_line_ids()
File "home/odoo/src/enterprise/18.0/hr_payroll/models/hr_payslip.py", line 1141, in _compute_worked_days_line_ids
slip_tz = pytz.timezone(slip.contract_id.resource_calendar_id.tz)
File "odoo/_monkeypatches/pytz.py", line 129, in timezone
return original_pytz_timezone(name)
File "__init__.py", line 183, in timezone
if zone.upper() == 'UTC':
```
To resolve this issue we can give a default value of `UTC` is there is no name. which makes the code more robust.
sentry-6134147853, 6119911834This fix prevents an error when users view or return to inventory quantity records that are missing location, lot, package, or owner details. The system now uses a default display name in those cases, helping users continue inventory updates without interruption.
Original PR description
Currently, an error occurs when computing a display name for stock quant. Step to produce: - Install the `stock` module(without demo data). - Go to inventory settings, enable Packages, Quality,…
Currently, an error occurs when computing a display name for stock quant. Step to produce: - Install the `stock` module(without demo data). - Go to inventory settings, enable Packages, Quality, Quality Worksheet, Reception Report, Variants, Units of Measure, Product Packagings, Lots & Serial Numbers, Display Lots & Serial Numbers on Delivery Slips, Expiration Dates, and Dropshipping. - Disable the Barcode Scanner. - After that, enable 'Display Lots & Serial Numbers on Invoices' in the Valuation section - Create a product and enable the 'Track Inventory' option. - In the product form view, click on On Hand in the breadcrumbs to navigate to the stock quantity list view - Create a new record to update the quantity. - Click on the 'View' button, remove the location, and try to come back to update quantity list view. `TypeError: sequence item 0: expected str instance, bool found` This error occurs because we compute the display name of stock quant and it is derived from location_id, lot_id, package_id, or owner_id. If none of these values are present in stock quant then the system tries to concate the False (bool) value with a string at [1] and an error occurs. Link [1]: https://github.com/odoo/odoo/blob/be6b327c17435947fc3f10d30fc8c4730c182aed/addons/stock/models/stock_quant.py#L585-L592 To resolve this issue, Assign a default display name of stock quant if none of the values of fields (location_id, lot_id, package_id, owner_id) are available. Sentry-6165002037 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Accounting report send wizard no longer crashes when users remove all recipients before sending or editing the email template. This prevents an unexpected error and lets users continue their workflow even when recipients are optional.
Original PR description
Currently, a traceback is occurring when the user tries to send a report by removing the partner in the wizard. To reproduce this issue: 1) install `Accounting` 2) Open the Partner Ledger report 3) Change the Report, Account to `Customer Statement` and `Payable` respectively 4) Click the `Send` button, and a send wizard will be opened 5) Remove the `Recipients` and navigate to the mail template from the wizard 6) In Email Configuration, enable the `Default Recipients` Error:- ``` KeyError: False ``` This traceback is occurring because the user removed the `mail_partner_ids` which is indeed not a required field. This leads to the traceback from the below line when accessing the `partner.id` from the mail_field_values. https://github.com/odoo/enterprise/blob/28b6a5d30274f4265c978433b8d02b758d9a032e/account_reports/wizard/account_report_send.py#L92-L96 sentry-6348424386
CodaBox connection management now shows a clear user-facing error when the selected accounting firm has no VAT number. This prevents a confusing technical crash and helps users correct the missing company information before continuing.
Original PR description
The system fails to retrieve vat number of accounting firm when computing `l10n_be_codabox_fiduciary_vat` field value Steps to Produce: 1. Install the `l10n_be_codabox` module and switch to `BE Company CoA` company. 2. Set Accounting firm without vat for BE Company CoA 3. Goto setting > Accounting section > CodaBox & SODA 4. Click `Manage Connection` or refresh icon of CodaBox Connection Error: `TypeError: expected string or bytes-like object, got 'bool'` Solution: Raise `UserError` if value of `account_representative_id.vat` is False Sentry - 6499169614
Users installing modules now receive a clean, understandable error if they upload a file that is not a valid ZIP archive. This prevents a technical crash message and improves the module installation experience.
Original PR description
The error could occur when a user uploads a non-ZIP or malformed ZIP file during module installation. The `zipfile.ZipFile` call raises `BadZipFile` when the file is invalid, but this was not properly caught in all cases. `Error: 'BadZipFile: File is not a zip file'` Solution: -Wrapped the `zipfile.ZipFile(BytesIO(zip_data), 'r')` and similar elements inside a `try...except` block to catch `BadZipFile` and raise a clean `ValidationError`, preventing unhandled exceptions and improving UX. sentry-6066860008
The PDF Quote Builder now blocks empty files before they are uploaded. This prevents users from hitting an error when configuring quotation headers or footers and keeps the setup flow smoother.
Original PR description
Currently, a error is encountered on uploading an empty file in a `PDF Quote Builder` . **Steps to reproduce:** - Install `Sales` - `Sales>Configuration>Settings` - Under `Quotations & Orders>PDF Quote builder>Headers/Footers`, upload an empty file or try this [demo_file](https://drive.google.com/file/d/1NePURnYY3EK63vXM_uz8weJZwDbUbHfc/view?usp=sharing) **Error:** `EmptyFileError: Cannot read an empty file` **Root Cause:** The error occurred because the system attempts to read the uploaded file at [1] triggered by [2]. If the uploaded file is empty, it raises an `EmptyFileError`. [1] - https://github.com/py-pdf/pypdf/blob/5735cb742a45a503e8eb7e409067f7c3d4cb9158/PyPDF2/pdf.py#L1691 [2] - https://github.com/odoo/odoo/blob/9463bfeb58fb40176ecf1131bac6627a1627d02c/odoo/tools/pdf/_pypdf2_1.py#L18 This commit ensures that users cannot upload empty files. sentry-6519503224,6519471276
Purchase bills in the Indian GSTR-2B workflow now return to a clean reconciliation state when reset to Draft. This prevents old return-period links or exceptions from carrying over, helping teams reconcile the bill correctly from the beginning.
Original PR description
When a purchase invoice (bill) is reset to Draft: - Reset GSTR-2B reconciliation status to "pending" - Unlink from GST return period - Clear any existing exceptions This ensures that the bill returns to its initial stage for proper reconciliation. Task ID: 5095582 Forward-Port-Of: odoo/enterprise#95026
Email Marketing now handles incorrectly encoded pasted images more gracefully when editing an email template. Instead of failing with a technical crash, the system can inform the user that the image content is invalid, helping prevent corrupted images from being used in mass mailings.
Original PR description
When user edits mail template html and pastes an image tag with invalid encoding it throws an error. **Steps to reproduce:** * Install Email marketing and activate developer mode. * Email…
When user edits mail template html and pastes an image tag with invalid encoding it throws an error. **Steps to reproduce:** * Install Email marketing and activate developer mode. * Email marketing>New>Mail Body> Start From Scratch>click `</>` icon * Paste any improper image element which doesn't have proper base64 encoding, for example: `<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU 5ErkJgg'/>` * Enter any Subject name and save. `binascii.Error: Invalid base64-encoded string: number of data characters (113) cannot be 1 more than a multiple of 4` **Solution:** * It would be better to let the user know about the error than to let them mass mail corrupted image element. * This can be done and handled by a try and except statement when the image element added is not proper. Sentry-6495526846 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an unexpected error when users customize reports in Studio. It makes report editing more reliable by safely handling missing internal comparison data instead of interrupting the user workflow.
Original PR description
Currently, `KeyError: None` might occur when customizing the `Reports ` in **studio**. - The `KeyError` can occur in the `diff` method when the `DIFF_ATTRIBUTE` is absent in the `new_tree`. - This happens because the code at [1] attempts to access `self.map_id_to_node_old[new_tree.get(DIFF_ATTRIBUTE)]` without verifying if `new_tree.get(DIFF_ATTRIBUTE)` is `None`. [1]- https://github.com/odoo/enterprise/blob/c6148cd50e7446e43b3f327a4c25e7c0ffa03446/web_studio/controllers/keyed_xml_differ.py#L239 - This commit ensures the code handles cases where `DIFF_ATTRIBUTE` is missing and preventing KeyError. sentry-6430937782
Fixes an issue where automated cleanup of old Ecuador withholding wizard records could fail when related withholding lines still existed. This prevents background terminal errors and keeps scheduled maintenance running smoothly without affecting users in the interface.
Original PR description
Foreign key error occurs when a cron job deletes a `withhold (transient model)` still linked to a `withhold.line`. The error appears in the terminal, not the UI. To reproduce, ensure withhold records…
Foreign key error occurs when a cron job deletes a `withhold (transient model)` still linked to a `withhold.line`. The error appears in the terminal, not the UI. To reproduce, ensure withhold records in `l10n_ec_wizard_account_withhold` are old enough to be removed by `Auto-vacuum`. Refer to [this](https://github.com/odoo/odoo/blob/e062c9b5773ed0710503c13627e60f8233fcd0a5/odoo/models.py#L7493C1-L7493C87) to understand how transient models are cleaned by the `Auto-vacuum` process. **Steps to reproduce:** * Install `l10n_ec_edi` and `accountant` * Change company to `EC company` * `Accounting>Customers>Invoices>New` * Confirm invoice with customer as `EC company` and `Payment method (SRI)` as Credit card * Add Withhold > Set document number to `001-001-123456789` > Add withhold lines * `Create and Post`(error will occur when cron tries to delete transient model transient model after couple of hours.) `psycopg2.errors.ForeignKeyViolation:update or delete on table 'l10n_ec_wizard_account_withhold' violates foreign key constraint 'l10n_ec_wizard_account_withhold_line_wizard_id_fkey' on table 'l10n_ec_wizard_account_withhold_line'` **Solution:** * Unlink withhold lines first and then let normal unlink take place. **Sentry-6253783256**
This update adjusts spreadsheet-related testing assets to correct an issue in the FRGI test setup. It helps keep spreadsheet functionality more reliable by ensuring the relevant tests run as expected.
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
This fixes company filtering by country, which previously did not work because the country field could not be searched. Businesses using country-specific localizations, such as Belgium or Switzerland, can now apply company restrictions by country as intended.
Original PR description
As the company country_id field was computed and not searcheable, it was not possible to restrict the company domain per country. This is needed in some l10n, like BE or CH. This commit implements the search method for the country_id field of the company. Done as part of task-5096037 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
This fixes an issue where the command palette could crash when a task status field had no available options, such as in some Field Service task workflows. Users can now open command search safely; unavailable status actions are simply hidden instead of causing an error.
Original PR description
**Steps to reproduce:** - Installed industry_fsm (Field Service) module - Navigate the menu Field Service -> Configuration -> Project - Create a new project - Then Navigate the menu My Tasks -> Tasks…
**Steps to reproduce:** - Installed industry_fsm (Field Service) module - Navigate the menu Field Service -> Configuration -> Project - Create a new project - Then Navigate the menu My Tasks -> Tasks - Create a new task with the new created project - Then using the keyboard shortcut ctrl + k for command search, an error occurs **Cause:** - When the `stage_id` statusbar had no possible values, `this.getAllItems()` returned an empty array. - The command `isAvailable` unconditionally accessed `this.getAllItems().at(-1).isSelected`, which is undefined, causing a crash.[see](https://github.com/odoo/odoo/blob/17.0/addons/web/static/src/views/fields/statusbar/statusbar_field.js#L147-L148) **Fix** - Add safe check in the command action so it does not attempt to select a non-existent "next" item. **Result** - The command palette no longer crashes when the `stage_id` field has no available items. Instead, the command is simply unavailable. opw-5084130 upg-3130405 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#227440
Merging timesheet entries linked to the same helpdesk ticket now keeps that ticket connection intact. This prevents support work records from becoming detached from the related customer issue, and blocks merges when selected entries belong to different tickets.
Original PR description
…helpdesk ticket **Steps to reproduce** - Register 2 timesheet lines on 1 helpdesk ticket - Go to the timesheets app and select these 2 lines - Go to Actions -> Merge timesheets Issue: the timesheets are merged but unlinked from the helpdesk ticket. **Change** Preserve the link to the helpdesk ticket when merging timesheets. An error is raised if attempting to merge timesheets not having all the same `helpdesk_ticket_id` value. opw-5086090
This fixes an issue where changing the address of a Czech company with demo data could fail with a validation error. Demo accounting dates are now aligned so company details can be saved normally without disrupting document numbering checks.
Original PR description
## [FIX] l10n_cz: prevent error with misaligned accounting date and sequence number of demo moves #### Description of the issue/feature this PR addresses: Editing CZ Company address while having demo…
## [FIX] l10n_cz: prevent error with misaligned accounting date and sequence number of demo moves #### Description of the issue/feature this PR addresses: Editing CZ Company address while having demo data throws Validation Error #### Current behavior before PR: When trying to change address of CZ Company while l10n_cz with demo data is present an error popup is displayed and it's not possible to to save the changes. Steps to reproduce: - Install l10n_cz with demo data - Open CZ Company in form view - Change address (e.g. change city Praha -> Brno) - Click Save #### Desired behavior after PR is merged: The address changes are saved without any error. #### Solution: This change adds `taxable_supply_date` date values for CZ demo moves that are compatible with `invoice_date` values to make sure that accounting date values are the same on each recomputatation and do not lead to new sequence numbers that are not aligned with the previous ones which would cause errors being raised by sequence mixin. Related to: #226152 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The Belgian POS fiscal reporting screens no longer show the warning "THIS IS NOT A VALID VAT TICKET" on invoices and daily reports. This avoids confusion by keeping the warning only where it belongs: on POS receipts that are not final VAT tickets.
Original PR description
- Remove the message "THIS IS NOT A VALID VAT TICKET" from the invoices and POS daily reports views. This message is only necessary on POS receipts that are not final TVA tickets. task-id: 5013860
Creating a mail blacklist entry from a website form no longer fails with an unexpected error when the email field is missing. Instead, Odoo now shows a clear user-facing error, improving reliability for website form submissions.
Original PR description
Currently, an error occurs when creating a blacklist entry from the website. Steps to Reproduce: - Install the `website_crm_iap_reveal`, `website_mass_mailing` and `web studio`. - Go to `Website` > any page, click `Edit`, and drag and drop a `Form` onto the page. - Select the form, in `Action` dropdown, choose `More models` and select `Mail Blacklist`. Save the changes. - Click the Submit button. `KeyError: 'email'` This error occurs when creating a blacklist entry from the website and the email field is missing. When it tries to access the email key in value[1] while creating the record, it raises a KeyError. [1] https://github.com/odoo/odoo/blob/d83801027c9a88b6e4db8166b6e2aad41ed760b9/addons/mail/models/mail_blacklist.py#L31 This commit ensures that if the email is not present in the value, a UserError is raised. sentry-6708162583 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an error when users open sales order line details with invoice lines from a product form dialog. It ensures the accounting matching widget uses the current record context when a search context is unavailable, avoiding an unexpected crash in this workflow.
Original PR description
…in a dialog Steps to reproduce ================== Prerequisites: Having a product with an SO and an Invoice confirmed. Steps: - Open Product Variant Form - Open Studio - Add new O2M to SOL: Product (Sale Order Line) - Edit subview form - Add invoice_lines - Quit Studio - Click on SOL on Product view → It crashes => TypeError: can't access property "context", ctx.env.searchModel is undefined Cause of the issue ================== In form view dialogs, we don't have a search model Solution ======== We should use the context from the current record opw-4921186
Automation rule setup now avoids carrying an internal archived-record setting into later selection dialogs. This prevents archived contacts or users from appearing where they should not, making configuration cleaner and less confusing.
Original PR description
**Before** - the active_test context key is part of the main base_automation action (base_automation_act), but this context key stays in the context further, leading to unwanted filtering in i.e. the…
**Before** - the active_test context key is part of the main base_automation action (base_automation_act), but this context key stays in the context further, leading to unwanted filtering in i.e. the action_server_ids.resource_ref search view dialog. - Steps to reproduce: - have base_automation installed - create an automation rule targeting the res.users model - add an Update server action targeting the Partner field - in the resource_ref autocomplete, click on Search More... - the search view dialogs displays archived records **After** - we chose to instead have a default filter in the base_automation_act action to include archived records by default. As the context key to activate the default filter starts with 'search_default_', it is already cleared from the context when opening the form view (standard behavior). - when you reproduce the same steps as before, the archived records are no longer displayed in the search view dialog. **Additional Note** This fix requires to upgrade the base_automation module. opw-4886487
Employees and managers can now enter a checkout time directly from the Attendance Gantt popup for open attendances. This fixes a display issue that hid the checkout field when it was empty, reducing extra navigation and manual correction steps.
Original PR description
The Gantt popup form explicitly set `check_out` invisible when it was empty, which prevented users from manually entering a checkout for an open attendance. This commit removes the overriding xpath so that the form simply inherits the standard `hr_attendance_view_form` behavior, where the `check_out` field is always visible and editable. Users can now set a manual checkout directly from the Gantt modal. task-5026978
Archived or trashed documents are now correctly hidden when users search for document values while setting up automation actions. This prevents users from accidentally selecting removed documents, while still allowing archived automation rules to remain visible where intended.
Original PR description
This PR addresses an issue where trashed files in documents would still appear when clicking on 'search more' when searching for documents.document in a scheduled action's action. The issue is that…
This PR addresses an issue where trashed files in documents would still appear when clicking on 'search more' when searching for documents.document in a scheduled action's action. The issue is that the base_automation_act view sets active_test context to False. This context is propagated to view_base_automation_form and results in the context for the field action_server_ids to be active_test = False. The fix for this issue will just be setting active_test to True for the action_server_ids field. This will make it such that the 'search more' action will no longer display anything archived but archived automation rules will still be displayed which was probably the original intention of setting active_test to False in base_automation_act. Steps to reproduce bug on empty DB: 1) Install base_automation and documents modules. 2) Create a new automation rule targeting the documents module. Make sure to add a trigger. 3) Click on 'Add an action' in the page 'Actions To Do'. 4) In the wizard under action details, set the targeted field to 'folder' (folder_id). Leave the action as 'Update'. 5) Click on the 'Choose a value' drop down. 6) Click on 'Search more'. 7) Notice the number of documents that show up. The numbers on the top right hand side of the wizard should be 1-y/x where x is the total number of documents. 8) Go to the documents module and select any document. 9) Move the document to the trash with the actions button. 10) Repeat steps 4-7. Notice how the number of documents did not change. Behavior after bug fix: Upon completing step 10 of steps to reproduce on empty DB, the number of documents will be one less than what it was originally since we trashed one of the documents. task-4886487 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes an automated test that could fail when Czech localization was installed. It makes the test use the actual payment reference generated by the system, improving build reliability without changing business functionality.
Original PR description
test_document_data_for_bank_journal_with_show_payment_option was failing in builds with l10n_cz installed because - we set move_sales_2.payment_reference = '' in setUpClass and without l10n_cz it stays empty - but with l10n_cz installed it gets recomputed because of precompute=True on taxable_supply_date (which is a stored computed field that triggers an extra write on account.move when the company is in CZ, and that write causes the compute graph to run again, and _compute_payment_reference fills the value back in) this commit solves this issue by not making assumptions about the payment_reference value and would use it as is in the generated data validation build_error-231479
This fixes an issue where Ctrl+Backspace behaved differently in Firefox and Safari compared with Chrome when editing empty or adjacent paragraphs. Users now get consistent text deletion behavior across supported browsers, reducing editing surprises and accidental content changes.
Original PR description
**Current behavior before PR:**
In Firefox or Safari, `<p>abc def</p><p>[]<br></p>` => `ctrl + backspace` ends up with `<p>abc []</p>` which is different o/p than Chrome (`<p>abc def[]</p>`).
This happens because Firefox's Selection.modify("extend", "backward|forward", "word") behaves differently than Chrome when the cursor is at the start or end of a block (or in an empty block). This behavior breaks the output when pressing ctrl + backspace.
**Desired behavior after PR:**
This PR ensures that in such case deletion behavior is same across browsers as Chrome. In other words `<p>abc def</p><p>[]<br></p>` => `ctrl + backspace` should be `<p>abc def[]</p>` .
task-5055135
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prMembership invoices now keep the right invoice context when opened, so membership products remain searchable on invoice lines even if they are not marked as purchasable. This prevents users from being blocked when editing draft membership invoices after changing product purchase 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-5028789
Forward-Port-Of: odoo/odoo#225230This fix corrects a typo that affected how a lock-date warning message was displayed when editing report external values. The message now appears as a properly formatted list, making it easier for users to read and understand what is blocking the change.
Original PR description
[FIX] account_reports: typo in error message typo in generation of error message saying that lock dates are blocking the modification of a report external value See odoo/enterprise#92949
Website page templates with highlight effects now keep the correct simplified highlight setup when selected from the preview. This prevents visual highlight issues from being carried into newly created pages, improving consistency for website editors.
Original PR description
Starting from [1], the code from the "Snippets Preview" and the "New Page Templates Preview" was adapted to be able to build a highlight using its simplified format when provided in XML. The goal of this PR is to fix the new page DOM when a template with highlights is selected. The DOM will be simply cloned and used for the created page, so we need to reset the inner highlights to their minimal format. [1]: https://github.com/odoo/odoo/commit/4a29fa66003ce1f42a7011bc56fc019f34a887f5 task-4215788
Refreshing appointment time slots could fail when no resource was selected because the system tried to read an empty value as a number. This fix handles empty selections safely, so customers can refresh available appointment slots without errors.
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 Forward-Port-Of: odoo/enterprise#95144