Daily updates from Odoo
Navigate
Branch
Monday, August 4, 2025
69 changes
2 changes
Resolved issues and error corrections
This fixes an error that could appear when users changed settings tied to a module after that module had been uninstalled. Users can now discard or interact with those settings without hitting a crash, improving reliability in system configuration.
Original PR description
When the user uninstalls the module and still tries to access the fields of that module in settings, a KeyError will be generated. Steps to reproduce the error: - Go to settings > enable Use a Gmail…
When the user uninstalls the module and still tries to access the fields of
that module in settings, a KeyError will be generated.
Steps to reproduce the error:
- Go to settings > enable Use a Gmail Server
- Uninstall google_gmail
- Enter a value for ID > Discard
Traceback:
```
KeyError: 'google_gmail_client_identifier'
File "odoo/http.py", line 2254, in __call__
response = request._serve_db()
File "odoo/http.py", line 1830, in _serve_db
return self._transactioning(_serve_ir_http, readonly=ro)
File "odoo/http.py", line 1850, in _transactioning
return service_model.retrying(func, env=self.env)
File "odoo/service/model.py", line 134, in retrying
result = func()
File "odoo/http.py", line 1828, in _serve_ir_http
return self._serve_ir_http(rule, args)
File "odoo/http.py", line 1835, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2060, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 220, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 742, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "addons/web/controllers/dataset.py", line 38, in call_kw
return self._call_kw(model, method, args, kwargs)
File "addons/web/controllers/dataset.py", line 34, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "odoo/api.py", line 458, in call_kw
result = getattr(recs, name)(*args, **kwargs)
File "addons/web/models/models.py", line 871, in onchange
defaults = self.default_get(missing_names)
File "odoo/addons/base/models/res_config.py", line 464, in default_get
classified = self._get_classified_fields(fields)
File "odoo/addons/base/models/res_config.py", line 424, in _get_classified_fields
field = self._fields[name]
```
sentry-4636111851
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThe website editor now safely handles unsupported shape files instead of triggering an error. This prevents a specific editing issue from interrupting users when an unexpected file type is encountered.
Original PR description
The error arises because ``file_open`` is called with a file path that includes a ``.css`` extension, which is not supported in this context where a ``.svg`` file is expected. Error: ``ValueError: Unsupported file: actuator;/static/shapes/env;.css`` This commit adds a try-catch block to handle a ValueError when an unsupported file is added. sentry-5163461799 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
29 changes
New functionality added to Odoo
VoIP calls can now be recorded in the browser and sent for automatic transcription after the call ends. This gives users a transcript directly on the call record, making it easier to review conversations without manually taking notes.
Original PR description
This PR attempts to stay consistent with the following road-map:  0th commit you see (is it still here) is the common transcription backbone (that is yet to be merged) : `[IMP] ai: setting up basic backend for audio transcription` commit 1st commit introduces grabbing and saving audio from the voip calls 2nd is adding a cron processing the audio attachments. Related tasks task-4532108
Users can now insert an audio transcription component in the HTML editor to record microphone audio and see the transcript appear in real time. When recording stops, the system adds a summary and also supports manually entered notes, helping teams capture and organize spoken information more easily.
Original PR description
This commit introduces a new transcription component that can be inserted in the html editor. This component allows the user to start a recording of his microphone. The transcription is made in real time in real time. When the recording is stopped, a summary of the transcription is added. The component also allows the user to input notes manually. task-4791084
Users can now search and interact with Odoo data using everyday language from the command palette. This makes it easier to find relevant records and open key views such as lists, kanban boards, pivot tables, and graphs without needing to know exact filters or navigation paths.
Original PR description
Implement natural language search functionality which allows users to search and interact with Odoo data using natural language queries through the "/" namespace in the command palette, which triggers an AI chatbox for continued interaction. Initially, this feature is limited to automatically opening four view types: list, kanban, pivot, and graph views. task-4582289
Enhancements to existing features
This update makes accounting, reporting, localization, and field service sales flows recognize a new subsection line type. It helps documents and reports keep sectioned content organized consistently without treating subsection headings like regular transaction lines.
Original PR description
This commit adapts various sale-related apps to the addition of the line_subsection display type added inside the corresponding models in https://github.com/odoo/odoo/pull/221229 Part of task-4920305 Co-authored-by: Michaël Mattiello <mcm@odoo.com> Co-authored-by: Julien Carion <juca@odoo.com>
The Studio Exporter now uses a more precise tooltip for the attachment option. This helps users better understand what the setting does before exporting customizations.
Original PR description
**Purpose:** The current tooltip of the attachment bool in Studio Exporter lacks precision. **Spec:** The attachment tooltip needs to be modified to provide more precise information. task-4939258
The sales planning shortcut now opens generated shifts grouped by resource, so users can assign them directly. This removes a confusing view setup that previously blocked planning from the 'To Plan' button.
Original PR description
Before this commit, when SO, contained a product configured to generate shifts, is confirmed, a `To Plan` stat button is displayed in the form view of that button. The problem is when the user clicks on that button, he will go to gantt view of shifts grouped by role > resource and he will not be able to plan any shifts. This commit makes sure the user can plan the shifts generated inside that gantt view. To do that, the default group by will be `Resource`.
Point of Sale users now get a clearer message when the Belgian fiscal blackbox is disconnected from the IoT Box. They can retry order validation or clocking in and out directly from the dialog, reducing interruption and support needs.
Original PR description
We improved the dialog telling the user its blackbox is disconnected from the IoT Box. We added a retry button to allow retrying validation of an order and clocking in/out. Community PR: odoo/odoo#221345 Task: 4978644 Forward-Port-Of: odoo/enterprise#91419
Revised analytical budgets now automatically include the current date in their name. This makes it easier to distinguish multiple budget revisions and improves traceability for budget tracking.
Original PR description
In this PR: - When an analytical budget is revised, append the current date to the revised budget's name in the format: `<original name> REV <YYYY-MM-DD>`. - This improves traceability and clarity when multiple revisions are created. task-4781780
The Discuss sidebar search bar now remains fixed at the top while users scroll, making it easier to find conversations without losing access to search. This improves day-to-day navigation in messaging, especially for users with many chats or WhatsApp conversations.
Original PR description
Part of task-4967071
Sales team members can now add notes when entering forecasted commission targets. This gives managers and colleagues more context behind the numbers, making forecast discussions clearer and more informed.
Original PR description
Before: * Sales team members could enter their forecasted targets, but had no way to explain the reasoning behind them. * There wasn’t any place to leave comments or context for the numbers they submitted. After: * A Notes field has been added to the commission list view. * Team members can now write additional details when entering their forecasted targets. Impact: * Makes it easier for team members to understand the thinking behind each forecast. task-4876539
Website administrators now have a central menu listing important website pages that can be customized. This makes it easier to find and edit key appointment and helpdesk pages without manually searching through URLs.
Original PR description
* = website_appointment, website_helpdesk, appointment Before this commit: Users previously had no centralized place to find website content pages. As a result, they had to manually explore URLs, making it challenging to identify important content routes. After this commit: A menu under Site > Technical Pages displays displaying a list of website routes that have been explicitly marked as discoverable via the `list_as_website_content` routing attribute. This helps users easily identify and access pages they can edit. To add a page to the list, developers simply need to add `list_as_website_content` in the route definition. task-4712084
Resolved issues and error corrections
The Preparation Display menu now appears when the restaurant preparation display feature is installed. This prevents users from hitting an error while setting up or exploring demo data and makes the feature easier to access.
Original PR description
Steps to reproduce: --- - Install `point_of_sale` module(without demo) - Point of Sale > Orders > `Preparation Display` - Create new and Load Demo Data(Explore Demo Data) Traceback: --- `AttributeError: The method 'pos.config.load_onboarding_restaurant_scenario' does not exist` In this commit: --- The `Preparation Display` will be visible in the main menu if the `pos_restaurant_preparation_display` module is installed.
This fixes an error that could stop HR from completing an offer after a new hire signed it. The process now avoids closing an incomplete draft contract for new employees while still closing previous contracts correctly for existing employees.
Original PR description
Steps: - Go to Recruitment > create/select an applicant > Create Offer - Sign the offer as the applicant > Sign as HR responsible. Issue: - Validation Error: 'Start date must be earlier than contract end date.' Reason: - When a new employee signs, a contract version is created without start/end dates. - On HR sign, the old version is ended (with end_date) as per earlier fix [#88915], but if the old version has no start_date then it breaks the constraint. Fix: - Only set end_date on old version if start_date exists (for existing employee). - For existing employees, the old contract closes cleanly with end date. - For new hires, we skip setting end_date to avoid constraint issues. task-4948131
This update keeps several Odoo Enterprise areas working reliably with Python 3.13 and Debian Trixie. It adjusts tests and message checks so routine upgrades of underlying software do not create false failures, helping maintain platform stability.
Original PR description
Forward-Port-Of: odoo/enterprise#91149 Forward-Port-Of: odoo/enterprise#90352
Inventory users can now open the map view for receipts and delivery orders even when batch transfer features are not enabled. The change removes a dependency on an optional batch transfer field, preventing an error that blocked access to the map view.
Original PR description
When a user without enabling 'Batch, Wave & Cluster Transfers' from settings, tries to open the map view for any stock transfer operations (e.g., Receipts, Delivery Orders), a error is raised.…
When a user without enabling 'Batch, Wave & Cluster Transfers' from settings, tries to open the map view for any stock transfer operations (e.g., Receipts, Delivery Orders), a error is raised. **Steps to Reproduce:** - Install Inventory App. - Navigate to 'Receipts' or 'Delivery Orders'. - Switch to map view. **Error:** `ValueError: Invalid field 'batch_sequence' on model 'stock.picking'` **Root Cause:** Since [this commit](https://github.com/odoo/enterprise/pull/78373/commits/fddb39104d675af2784559fe2f7cb28f8dc6120b), the `stock.picking.view.map` view has a hardcoded `default_order` attribute that sorts by `batch_sequence` as shown at [1]. This field is only added to the `stock.picking` model when the `stock_picking_batch` module is installed. This creates an invalid view definition, where this optional module is not present, causing an error. **Solution:** This commit resolves the issue by removing the `default_order='batch_sequence'` from the stock picking map view at [1]. This ensures the map view no longer depends on the `stock_picking_batch module`. [1]- https://github.com/odoo/enterprise/blob/5e0380513899f199340620d8ce17eff5b5b6aec3/stock_enterprise/views/stock_picking_map_views.xml#L8 sentry-6732756118 Forward-Port-Of: odoo/enterprise#90399
This update prevents an error when users manually enter a tracking reference for a Sendcloud delivery. Instead of showing a technical crash, Odoo now handles the missing Sendcloud parcel data gracefully and can display a proper user-facing error.
Original PR description
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3.…
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3. Create a sales order with a deliverable product 4. Confirm the sale order 5. Go to the delivery 6. Manually enter a random tracking reference. 7. Make sure carrier is set to the Sendcloud delivery method 8. Click on "tracking," or get back to the sales order (click "preview"). 9. A traceback occurs. **Issue:** `A TypeError: 'bool' object is not subscriptable` when accessing sendcloud_parcel_ref, which is expected to be a list or JSON but is instead a boolean. **Causes:** The code assumes the presence of valid Sendcloud parcel reference data, but manually entering a tracking reference bypasses the [_send_shipment](https://github.com/odoo/enterprise/blob/6ecf0af6b6874460d300ede6cc7c092927607810/delivery_sendcloud/models/sendcloud_service.py#L102) method that populates this field. As a result, sendcloud_parcel_ref can remain False. https://github.com/odoo/enterprise/blob/df924ef8adffb3e42419a44ecf22fec3059917c4/delivery_sendcloud/models/delivery_carrier.py#L196 **Solution:** Return None if there is no Sendcloud parcel reference, which will raise a UserError from the below line https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L288 Co-Author By - alsh@odoo.com opw-4894677 Forward-Port-Of: odoo/enterprise#89444
Manufacturing users who are not HR users can now open the Shop Floor app without an access rights error. The app now looks up an employee only when a barcode is scanned, avoiding restricted employee data access while preserving barcode identification on the shop floor.
Original PR description
**PROBLEM** If a user is in the mrp.group_mrp_user group, but does not belong to hr.group_hr_user, he can't access the shop floor app. **STEP TO REPRODUCE** 1. connect with a user which is a user of manufactring, but not a user of hr. 2. try to go on the shop floor app and notice there is an access right error. **CAUSE** When connecting to the shop floor app, we are trying to get the barcode field on all employee (because we need them if we want to identify an employee on the shop floor app using their barcode). This was added in this commit: https://github.com/odoo/enterprise/commit/b3fb0073a15adcc799a5681284f0cfd2308764b8 The barcode field is only accessible to member of hr.group_hr_user. **FIX** Instead of getting the barcode of all employee using `get_all_employee()`, we do a rpc call to query the employee the barcode belong to. opw-4905206 Forward-Port-Of: odoo/enterprise#89436
This update corrects missing module dependencies so related live chat and WhatsApp stock features install and reinstall reliably. It helps prevent nightly validation failures and reduces the risk of deployment issues caused by modules loading in the wrong order.
Original PR description
- `ai_website_livechat` hooks on an element added by `ai_website` but does not depend on that module, breaking uninstall/reinstall nightly (https://runbot.odoo.com/runbot/build/86142380) - `whatsapp_stock` hooks on an element added by `stock_enterprise, but does not depend on that module, breaking uninstall/reinstall nightly (https://runbot.odoo.com/runbot/build/86142941)
Installing Payroll on a new Australian database no longer crashes when pay schedule information is missing. The system now safely uses a monthly default so payroll setup can complete reliably.
Original PR description
When installing the payroll app with a new db initialized in Australia, we would get a traceback because the schedule pay is False at some point. This was due to the compute of schedule pay which did not handle the case where the structure type is not set. This fixes the issue by checking if the structure type is set to set the schedule pay and adding a default value to monthly. Ticket: 4974520 Forward-Port-Of: odoo/enterprise#91255
Updated automated tests so they create and manage records only with the permissions they are supposed to have. This improves confidence that business workflows in payroll, accounting, field service, and payments respect access controls and remain reliable.
Original PR description
Tests need to configure their ACLs properly.
The Preparation Display no longer shows a blank screen when using demo data. The fix handles missing customer notes safely so restaurant staff can open and review preparation orders without interruption.
Original PR description
Steps: - Initialize a database with demo data - Open the demo Preparation Display - Blank screen appears due to an error cause: - Preparation lines have false as the customer note value in the demo data. Fix: - Added a fallback to an empty string when the customer note is defined. Task: 4988252
Rejecting an UrbanPiper order in Point of Sale now works without causing an error screen. This keeps staff workflows smooth when declining test or real incoming orders and ensures the POS returns to a usable state afterward.
Original PR description
Steps to reproduce: --- - Configure UrbanPiper in any POS configuration. - Open this POS and place a test order. - Attempt to reject the order. Issue: --- - A traceback occurs when rejecting the order. Cause: --- - The `removeOrder` function was being called unnecessarily, even though it is already handled by `deleteOrders`. Fix: --- - Removed the redundant call to `removeOrder`. - Additionally, called `afterOrderValidation` and `setSelectedOrder` to properly reset the state after rejection. task-4965076 Forward-Port-Of: odoo/enterprise#91525 Forward-Port-Of: odoo/enterprise#91116
French VAT XML filings now place grid 26 refund requests in the correct field. This prevents reimbursement amounts from being omitted or sent in the wrong place when businesses submit VAT returns.
Original PR description
The French VAT report line for grid 26 ("Repayment of credit requested on form n°3519") uses code `box_26_external`, but the XML generator only mapped `box_26` to the `JB` tag.
As a result, the reimbursement amount was missing or incorrectly placed in the XML file.
This commit maps `box_26_external` to `JB` to ensure the correct tag is used when the user fills in grid 26.
opw-4931275
Forward-Port-Of: odoo/enterprise#90940This update improves the accounting audit workflow by making new working files easier to create and audit checks easier to follow. It also fixes status changes so validated checks remain usable when an audit is moved between ongoing and done.
Original PR description
Task https://www.odoo.com/odoo/project/967/tasks/4840028 was requested to merged very quickly and not everything could be done on time. This PR fixes/adds several things.
POS orders invoiced after session closing are now included correctly in GSTR1 HSN reporting. This helps ensure Indian tax return data remains complete after certain database migrations or session closing scenarios.
Original PR description
The issue occurs when a POS session closing entry is generated without grouping by HSN + UOM, which can happen after a database migration from an older version. Before this PR: POS orders were included only if they were **not invoiced** and had no **reversed_move_ids** (which is set when the invoice is created after closing the session). After this PR: POS orders are included if they are **not invoiced** **or** if they have **reversed_move_ids** (invoiced after session close). This ensures that reversed POS orders are properly processed in the GSTR1 HSN computation. OPW: 4931360
Payment links for recurring sales orders now use the next invoice amount instead of factoring in past payments. This prevents customers from seeing incorrect payment amounts on already-invoiced subscriptions.
Original PR description
Before this commit,when a payment link was generated for a recurring SO already invoiced, the default values of amount and amiunt_max would take into account all previous transactions. As a result, the amount would be badly computed as recurring order have many transactions (at least once or each period). This commit ensure to use the next invoice amount. taskid: 4352396 Forward-Port-Of: odoo/enterprise#83934
Audit report PDFs now prepare currency data before calculating figures like revenue and net accounting result. This prevents an internal error when users print audit reports and helps ensure the report values are generated correctly.
Original PR description
The method for generating the PDF of an audit report currently crashes when computing the template variables "revenue" and "net accounting result". This issue arises because the underlying method…
The method for generating the PDF of an audit report currently crashes when computing the template variables "revenue" and "net accounting result".
This issue arises because the underlying method used to compute these values runs raw SQL queries that perform a JOIN operation on the `account_currency_table`. However, this table is not created automatically by the system: It must be explicitly initialized by calling the method `_init_currency_table`.
This commit updates the code to ensure that `_init_currency_table` is called before invoking the methods that compute the total revenue, the net accounting result, etc. This should prevent the crash and allow the template variables to be computed correctly.
Steps to reproduce the issue on the runbot:
1. Open the Accounting App
2. In the navbar, click on "Accounting" > "Audit Reports"
3. Create a new audit report
4. Fill the form and save
5. Click on the "Print" button of the kanban card.
=> A new page should open displaying an internal error.
In the log of the runbot, we have the following log:
```
File "/data/build/enterprise/account_reports/models/account_report.py",
line 3899, in _compute_formula_batch_with_engine_domain
self.env.cr.execute(query)
File "/data/build/odoo/odoo/sql_db.py", line 426, in execute
self._obj.execute(query, params)
psycopg2.errors.UndefinedTable: relation "account_currency_table" does not exist
LINE 10: LEFT JOIN account_currency_table
```
Task-4840940Live chat AI setup now uses a simpler prompt format that works beyond a single AI provider. This helps keep AI live chat compatible with future provider options and avoids format-related issues.
Original PR description
Previously, preprompts were added as objects of the form {'rule': ..., 'content': ...}. However, this format is specific to OpenAI API. The task 4915266, [PR](https://github.com/odoo/enterprise/pull/90124) has changed the format from an object to a string to be extensible and to support providers other than OpenAI.
Thus, this commit adapts the preprompt of livechat channels to the new format.Corrected a small formatting issue in the Sign app's date filter so it displays with the proper spacing. This makes the filter text clearer for users working with signature requests.
38 changes
New functionality added to Odoo
Adds standard Profit and Loss and Balance Sheet reports for the Vietnamese localization. This helps companies operating in Vietnam produce localized financial statements more directly in Odoo.
Original PR description
Add the P&L and the BS for the vietnamese localization task-2492680
Adds a new connector to bring Tokopedia Shop sales into Odoo. Businesses can import orders from multiple accounts, match them to existing products, and keep delivery and stock information synchronized for seller-fulfilled orders.
Original PR description
* Import orders from multiple accounts * Orders are matched with Odoo products based on their internal reference (item_id or SKU ID in Tokopedia | Shop) * Support for both Fulfillment by TikTok/Tokopedia | Shop (FBT), Fulfillment by Seller (FBS): * FBT: Importing the completed orders * FBS: Delivery information is fetched from Tokopedia | Shop, track and synchronize the stock level to Tokopedia | Shop Task ID: 3690836
Enhancements to existing features
The eInvoicing format choices shown on customer account settings have been renamed to be easier to understand in each country context. This helps users choose the right invoice format without relying on unclear technical labels, reducing confusion during customer setup.
Original PR description
Renamed the selection labels for invoice_edi_format field to make them easier to understand based on the user's country context when choosing format inside customer's account tab. This improves the usability of the dropdown when selecting an eInvoicing format, especially for users in localizations where the technical name was unclear or confusing. 4889699 shzi
The Vietnamese localization now includes default accounts that distinguish between short-term and long-term financial items. This supports newer financial reports that need this split, helping businesses produce more accurate local accounting reports with less manual setup.
Original PR description
With the addition of financial reports where the distinction between short and long term is done, we add new default accounts to cover these needs. task-2492680 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Resolved issues and error corrections
This change restores the ability to edit or remove images and other media inside areas where surrounding text editing is disabled. It helps users manage image layouts such as figures with captions more reliably in the HTML editor.
Original PR description
Backport relevant commits from PR [1], as well as commit [2]. This allows us to use the editable media feature in 18.0. [1]: https://github.com/odoo/odoo/pull/209228 [2]: https://github.com/odoo/odoo/pull/186917/commits/1c7e05ca26a7fe5db4f7b5aa69c56c5811d20256 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change splits lengthy editor list tests into smaller checks so they are less likely to fail when test infrastructure is slow. It does not change product behavior, but helps keep automated validation more stable and reduces false failures during releases.
Original PR description
Those tests were too long to be grouped in a single `it` as it would sometime hit the time limit when the runbot was too slow. Putting each of them in separate `it` significantly reduces the likelihood of the issue to occur. runbot-230411 Forward-Port-Of: odoo/odoo#221197
This fix corrects the invoicing action used in several localized Point of Sale flows so orders can be marked for invoicing properly. It prevents failures caused by calling a non-existent function, helping affected country-specific POS setups process invoices reliably.
Original PR description
In commit https://github.com/odoo/odoo/commit/bfe2a0aea699439480990bb192bfeea7df2117e2, the method `setToInvoice` was mistakenly called on `pos.order`, but this method does not exist. The correct method name is `set_to_invoice`. opw-4992393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Customers can now choose shipping options at checkout when their cart includes combo products, as long as the individual combo items have weights. The fix also prevents shipping calculation errors on orders with zero-quantity lines such as down payments.
Original PR description
Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a shipping connector; 4. add combo product to cart; 5. go to…
Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a shipping connector; 4. add combo product to cart; 5. go to checkout; 6. attempt to select shipping connector as delivery method. A similar message appears when trying to add a delivery method to a backend order if the order has downpayment lines. Issue ----- > The estimated shipping price cannot be computed because the weight is missing for the following product(s): Foo Cause ----- The combo product doesn't have a weight, as it's not a discrete item, but a collection of multiple items. The shipping connectors haven't been updated yet to account for this, and still expect every non-service product to have a weight. Solution -------- When looking for lines without weight, filter out products of type `combo` (similar to how `service` products are handled) using a new `_get_invalid_delivery_weight_liens` helper method, added to `sale.order.line`. Also ignore lines where `product_qty` is zero, e.g. `display_type` lines & down payment lines. Enterprise PR: https://github.com/odoo/enterprise/pull/91243 opw-4940973
Fixes an issue where creating a sales order item from a project task could leave the company blank, preventing product taxes from appearing. This helps ensure billable project work uses the correct company and tax information during sales item creation.
Original PR description
## Short functional explanation of the error When clicking on "create and edit" on a Sales Order Item field in a task, the company field is left blank. As a result, the taxes linked to the product…
## Short functional explanation of the error When clicking on "create and edit" on a Sales Order Item field in a task, the company field is left blank. As a result, the taxes linked to the product don't appear. ## Reproduction Steps 1. Install the modules sales, timesheet and project. 2. Make sure that you have at least 2 different companies in the settings. 2. Click on the project app and create a new project. Check the Billable and Timesheets boxes. 3. Create a task and click on it. Set a customer: the field "Sales Order Item" should appear. 4. Click on the "Sales Order Item" field. Type random letters and click on "create and edit". 5. Select a product that has at least one tax. ### Expected behavior The company field should be filled as soon as we click on the create and edit button, and the taxes field should be filled with the taxes of the product as soon as we select said product. ### Unexpected behavior The company and taxes field remain empty. ## Origin of the issue Some fields were set at "default_." __ opw-4904861 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#221342
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log int
Original PR description
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct…
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log into to one of the demo Argentinean Companies: (AR) Responsable Inscripto 4. Create a customer invoices of type "B" 5. Go to the partner and change the Language to Spanish 6. Return to the invoice and print the PDF 7. Check that the VAT Content section is not translated. ### **Current behavior before PR:** <img width="572" height="407" alt="image" src="https://github.com/user-attachments/assets/e28e609e-2cd2-4ace-9509-f969692ec893" /> ### **Desired behavior after PR is merged:** The "VAT Content section should appear as "IVA Contenido" when printing the report in Spanish. opw-4938520 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#219912
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log in
Original PR description
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct…
Before this change, the VAT Content section in Argentinean Legal PDF was always shown as "VAT Content" although the user has Spanish as its language. With this change will show the correct translation: "IVA Contenido" when printing the PDF report in Spanish. ### **Description of the issue/feature this PR addresses:** Missing Spanish translation of "VAT Content" column in the Argentinean Legal PDF Report 1. Install Argentinean - Accounting module 2. Install Spanish language 3. Log into to one of the demo Argentinean Companies: (AR) Responsable Inscripto 4. Create a customer invoices of type "B" 5. Go to the partner and change the Language to Spanish 6. Return to the invoice and print the PDF 8. Check that the VAT Content section is not translated. ### **Current behavior before PR:** <img width="572" height="407" alt="image" src="https://github.com/user-attachments/assets/1f3e7556-2ffc-4cb4-8c61-9bee4248650c" /> ### **Desired behavior after PR is merged:** The "VAT Content section should appear as "IVA Contenido" when printing the report in Spanish. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an accounting error when dropshipped products are returned to an internal subcontracting location. Stock value is now increased correctly, helping keep inventory valuation and financial reports accurate.
Original PR description
…ml internal dropship return **Problem:** when the subcontracting setting is active, the return of a dropshipped product (not necessarily subcontracted) to the internal subcontracting location will…
…ml internal dropship return **Problem:** when the subcontracting setting is active, the return of a dropshipped product (not necessarily subcontracted) to the internal subcontracting location will create an account move that credits "stock valuation" instead of debitting it **Steps to reproduce:** - enable the "Anglo-Saxon Accounting","Multi-steps routes" and "Subcontracting" settings - create a storable product with dropshipping route and a vendor - in 'general information' write a non null cost - make sure the product category's inventory valuation' is 'automated' - create a new quotation for this product, confirm it and confirm the linked purchase order - click on the dropship smart button and validate the picking - click on return and select 'Physical Locations/Subcontracting Location' as the return location - validate and click on the valuation smart button - on the only stock valuation layer for this move, click on the book shaped widget **Current behavior:** the account move credits Stock Valuation and debits stock interim (received) **Expected behavior:** As we are returning the product to stock it should increase the value of the stock valuation account. Therefore, it should debit stock valuation and credit stock interim (received) **Cause of the issue:** If the mrp_subcontracting_dropshipping module is active, and if we call _is_dropshipped_return on a stock move which is the return (to the subcontracting location) of a dropshipped move : the method will return true. https://github.com/odoo/odoo/blob/b34cebcf0c142d92affdb642525f066d431b7ca3/addons/mrp_subcontracting_dropshipping/models/stock_move.py#L29-L35 Therefore, inside _account_entry_move, _is_in will be false (contrary to if mrp_subcontracting_dropshipping is not installed or if the destination is another internal location) https://github.com/odoo/odoo/blob/b34cebcf0c142d92affdb642525f066d431b7ca3/addons/stock_account/models/stock_move.py#L580 The aml vals will be computed inside _prepare_anglosaxon_account_move_vals https://github.com/odoo/odoo/blob/b34cebcf0c142d92affdb642525f066d431b7ca3/addons/stock_account/models/stock_move.py#L596 Here the fact the destination location is internal does not change the fact that it should debit the stock valuation account (meaning it should used acc_valuation as the second parameter of _prepare_account_move_vals) if the cost is positive. https://github.com/odoo/odoo/blob/b34cebcf0c142d92affdb642525f066d431b7ca3/addons/stock_account/models/stock_move.py#L610-L614 opw-4894755 Forward-Port-Of: odoo/odoo#221009
Sending reports for gamification challenges in Individual Goals mode no longer fails when optional suffix information is missing. This prevents an error from blocking report emails, making challenge reporting more reliable for users.
Original PR description
[FIX] gamification: prevent key error exception
To reproduce:
=============
1. Navigate to Settings > Gamification Tools > Challenges.
2. Create a new challenge or open any existing active challenge.
3. Set the Display Mode to Individual Goals, and then click on Send Report.
Problem:
=========
Accessing line['full_suffix'] directly raised an exception
when the key was missing, causing the template rendering to fail.
https://github.com/odoo/odoo/blob/cd5f29b8b50ef4228be8f58a02bb328548208f77/addons/gamification/data/mail_template_data.xml#L175C1-L175C92
Solution:
=========
Use line.setdefault('full_suffix', '') to ensure the key exists with
a default empty string, preventing errors and allowing the template
to render smoothly.
opw-4909617.Creating a new warehouse could fail if a previously required stock location had been deleted. This fix lets the warehouse creation continue safely instead of blocking users with an error.
Original PR description
Currently, an error occurs when a user tries to create a new warehouse, but the referenced stock location (record: **Physical Locations**) has been deleted. **Steps to reproduce:** - Install the…
Currently, an error occurs when a user tries to create a new warehouse, but the referenced stock location (record: **Physical Locations**) has been deleted. **Steps to reproduce:** - Install the `stock` module without the demo data. - Enable **Multi-Step Routes** in Inventory settings. - Delete all Stock Rules and then the existing warehouses. - Navigate to `Inventory > Reporting > Locations` and delete the **Physical Locations**. - Try to create a new warehouse. **Error:** `ValueError: External ID not found in the system: stock.stock_location_locations` Here, an error occurs when the system tries to fetch `stock.stock_location_locations` during warehouse creation [1], but the record has been deleted, resulting in a parse error. [1] - https://github.com/odoo/odoo/blob/834eff6e770280e911bb99e2abab4ea42d4ca8ff/addons/stock/models/stock_warehouse.py#L123-L125 This commit prevents the error by assigning `False` to `location_id`, if the reference is missing. Sentry - 6577063404
The delivery package type dropdown now respects the sequence set by users instead of defaulting to creation order. This makes package selection more predictable for inventory teams and aligns barcode and delivery workflows with configuration settings.
Original PR description
#### Step to reproduce: - Go to Inventory > Configuration > Settings and enable Packages - Go to Inventory > Configuration > Package Types - Inverse the order of two packages types. The goal is for…
#### Step to reproduce: - Go to Inventory > Configuration > Settings and enable Packages - Go to Inventory > Configuration > Package Types - Inverse the order of two packages types. The goal is for the sequence order to differ from the id order. (you can display id with studio) - Go to Inventory > Overview > Delivery Orders - Create a new delivery order - Add a line - In 'Additional Info' add a Carrier - Go to Barcode > Operations > Delivery Orders - Select the delivery order (you might need to remove filters) - With the 'Add Product' button add a product - Click on 'Put in Pack' - A 'Package Details' wizard should have opened. In this wizard there is a field 'Delivery Package Type'. #### Current behavior: - In the delivery package type dropdown list, packages are ordered by id #### Expected behavior: - In the delivery package type dropdown list, packages should be ordered by sequence #### Cause of the issue: As no order was defined, stock.package.type was ordered by id which is the default behavior opw-4824064 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220327
Loading appraisal sample data no longer fails when a previously deleted employee skill type is referenced. This helps HR users continue setting up sample appraisal content without being blocked by missing skill configuration data.
Original PR description
Currently, an error is produced when loading sample data if a referenced skill type record in the skill level has been deleted by the user. **Steps to Reproduce:** - Install the `hr_appraisal` module…
Currently, an error is produced when loading sample data if a referenced skill type record in the skill level has been deleted by the user.
**Steps to Reproduce:**
- Install the `hr_appraisal` module without demo data.
- Navigate to `Employee > Skills Types` and delete the `Languages` record.
- Load the sample data for appraisal.
- Observe the error.
`ValueError: ParseError('while parsing /home/odoo/src/odoo/saas-18.2/addons/hr_skills/data/scenarios/hr_skills_scenario.xml:19...`
Here, the error occurs because the method at [1] attempts to load the `hr_skills_scenario.xml` file that references a deleted `skill_type_id` [2], leading to a parsing error.
[1] - https://github.com/odoo/odoo/blob/547327f30d2d4bf778b9d358dbea4b133d55188a/addons/hr_skills/models/hr_employee.py#L49
[2] - https://github.com/odoo/odoo/blob/547327f30d2d4bf778b9d358dbea4b133d55188a/addons/hr_skills/data/scenarios/hr_skills_scenario.xml#L23
This commit ensures that all the referenced data is loaded properly, preventing errors due to missing references.
Sentry - 6533879252This fixes a save error when chart of accounts default taxes belonged to companies no longer selected on the account. Users now get a clear validation message instead of a system error, helping prevent incorrect multi-company accounting setup.
Original PR description
Currently, an error is produced on creating/saving the record of the chart of account if the company of any tax belongs to a company which company is not in the allowed Companies. **Steps to…
Currently, an error is produced on creating/saving the record of the chart of account if the company of any tax belongs to a company which company is not in the allowed Companies. **Steps to reproduce:** - Install the `accountant` and `l10n_be` modules. - Activate the **IN Company** and keep **YourCompany** as the default. - Navigate to `Accounting > Configuration > Accounting > Chart of Accounts`. - Open the new form view of the model by clicking the **view** button. - In **Companies** field, select the **IN Company**. - Select the **5% GST** tax in **Default Taxes** field. - Now, remove the **IN Company** from the **Companies** field. - Attempt to save the record. **Error:** `AttributeError: 'account.account' object has no attribute 'company_id'` Here, the `_check_company` method at [1] verifies that all relational fields (such as tax groups) belong to the selected companies. While building the user error message, it assumes that all involved records (e.g., `account.account`) have a `company_id` field. However, `account.account` does not define `company_id`, which results in an attribute error. [1] - https://github.com/odoo/odoo/blob/887f3fa98f6172dc5d35f9981d43d6ccb4cf86dc/odoo/models.py#L4396 This commit added constraint that raises a **UserError** if any tax in the **Default Taxes** field belongs to a company not included in the selected **Companies**. This prevents errors during the company check. Sentry - 6636043482
This fixes an error that could appear when users clicked the Optimize SEO button while viewing a livechat page. Instead of trying to edit SEO settings on pages that do not support them, Odoo now safely disables that option, avoiding disruption for website editors.
Original PR description
Currently, an error occurs when clicking the optimize SEO button for the livechat page. **Steps to reproduce:** - Install the `website_livechat` module. - Add menuitem with url…
Currently, an error occurs when clicking the optimize SEO button for the livechat page. **Steps to reproduce:** - Install the `website_livechat` module. - Add menuitem with url `/livechat/channel/yourwebsite-com-1` as `livechat`. - Go to the **Home** page and publish it using the `Published` button (shows `Optimize SEO` popup). - Change the page to `livechat` and click the `Optimize SEO` button before it disappears. - Observe the error. **Error:** `ValueError: Invalid field 'website_meta_title' on 'im_livechat.channel'` The error occurs because the system attempts to update the default `fields` [1] on the current model at [2] who doesn't have the fields. This commit ensures that if any required SEO fields are missing from the model, the system will return early with `can_edit_seo` set to `False`, thereby preventing the error. [1] - https://github.com/odoo/odoo/blob/c87acdcfa48b1d8aa66bb5d27d58e3edb70a86ba/addons/website/controllers/main.py#L810 [2] - https://github.com/odoo/odoo/blob/c87acdcfa48b1d8aa66bb5d27d58e3edb70a86ba/addons/website/controllers/main.py#L824 Sentry - 6330105753 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents the Mail app from crashing when follower-related data is unexpectedly unavailable. Instead of stopping with an error, the system now skips the affected empty result and continues processing, improving reliability for users.
Original PR description
Currently, an exception is raised when `_read_format`, returned an empty list due to MissingError encountered - [1]. This issue was caused by attempting to access the first element `(data[0])` without checking if the list was empty. error: `IndexError: list index out of range.` This commit resolves the issue by properly handling empty lists and skipping further processing in such cases. [1] - https://github.com/odoo/odoo/blob/2a79d7d06d77d808cab00440bdac3c1e05c7bc1b/odoo/models.py#L4033 [2] - https://github.com/odoo/odoo/blob/2a79d7d06d77d808cab00440bdac3c1e05c7bc1b/addons/mail/models/mail_followers.py#L527 sentry-6021917973
This fixes an error that could occur for Indian companies when a user removed the VAT number and then clicked the GST warning update button. The change prevents the crash and keeps the company record workflow usable even when VAT is left blank.
Original PR description
Currently, a traceback is occurring when the user clicks on the update button of GST warning after removing the vat. To reproduce this issue: 1) Install l10n_in 2) Open the Indian company 3) Change…
Currently, a traceback is occurring when the user clicks on the update button of GST warning after removing the vat. To reproduce this issue: 1) Install l10n_in 2) Open the Indian company 3) Change the VAT to get the GST warning 4) After getting the GST warning remove the VAT and click the `update it` button Error:- ``` TypeError: 'bool' object is not subscriptable ``` On company, VAT is not a required field, so the user can indeed remove it. When the user removes the vat and clicks on the `update it` button from GST warnings, the `action_update_state_as_per_gstin` method triggers. https://github.com/odoo/odoo/blob/c96d2b1d1ee917b1c665842010c56c23df91ccd3/addons/l10n_in/models/res_partner.py#L99-L101 From the above method we try to access the vat value. Here in our case, the `VAT` value is False. So it leads to the above traceback. We can resolve this issue by adding check, which makes the code more robust. sentry-6151570042 Forward-Port-Of: odoo/odoo#190840
Fixes an error that could appear when a survey question was removed and replaced during a live session, then a participant refreshed the completed survey page. This keeps live survey sessions stable for users even when survey content is edited mid-session.
Original PR description
This error occurs when we create a live session, modify a question at the end of the survey, and then refresh the page. Steps to reproduce: --- - Install ``survey`` module - Create new Survey > Add a…
This error occurs when we create a live session, modify a question at the end of the survey, and then refresh the page. Steps to reproduce: --- - Install ``survey`` module - Create new Survey > Add a question > Click on ``Create Live Session`` - Complete the survey(wait on Thank You page) - Now go to the previous tab remove the question and add another question - Now refresh another tab (Thank You page) Traceback: --- ``ValueError: False is not in list`` We encounter the error at [1] because ``page_or_question`` is empty. Its value comes from the ``_is_last_page_or_question`` method, where ``survey.session_question_id`` is also empty. This happens because when a question is removed, ``survey.session_question_id`` becomes empty, and when a new question is added, the ID for that question is not retrieved. [1]- https://github.com/odoo/odoo/blob/e35d2a0c08f69ad1d122e07726786450e4c30b5a/addons/survey/models/survey_survey.py#L810 sentry-6043084559 --- 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 load recruitment sample data after all recruitment stages have been deleted. The sample data import now skips the missing stage reference, allowing the process to complete instead of showing a traceback.
Original PR description
When the user clicks on Load sample data button after deleting the stages, A traceback will appear. Steps to reproduce the error: - Install ``hr_recruitment`` module - Go to Recruitment >…
When the user clicks on Load sample data button after deleting the stages,
A traceback will appear.
Steps to reproduce the error:
- Install ``hr_recruitment`` module
- Go to Recruitment > Configuration > Stages > Delete all stages
- Go to Recruitment > Applications > By Job Positions > Load sample data
Traceback:
```
ValueError: External ID not found in the system: hr_recruitment.stage_job3
ParseError: while parsing /home/odoo/src/odoo/addons/hr_recruitment/data/scenarios/hr_recruitment_scenario.xml:94, somewhere inside <record id="scenario_applicant_macm_enrique" model="hr.applicant">
<field name="candidate_id" ref="scenario_candidate_enrique" />
<field name="priority">2</field>
<field name="linkedin_profile">www.example.linkedin.com/in/enrique.jones</field>
<field name="job_id" ref="job_marketing" />
<field name="user_id" ref="base.user_admin" />
<field name="medium_id" ref="utm.utm_medium_direct" />
<field name="department_id" ref="dep_marketing" />
<field name="salary_expected">2900</field>
<field name="stage_id" eval="ref('stage_job3ob3', raise_if_not_found=False)" />
<field name="create_date" eval="DateTime.today() - relativedelta(months=2)" />
<field name="date_last_stage_update"
eval="DateTime.today() - relativedelta(days=1)" />
</record>
```
This commit resolves the error by ``raise_if_not_found=False`` for the field if the stage is missing.
sentry-6530485438
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prBusinesses using branch companies can now use warehouses and stock locations from those branches without triggering company mismatch errors. This fixes issues when setting up store pickup, dropshipping, and related stock flows across parent and branch companies.
Original PR description
*: stock_dropshipping, website_sale_collect Versions -------- - 18.0+ Steps ----- 1. Create a branch company; 2. switch to branch company; 3. create a new warehouse; 4. create a new delivery method; 5. select "Pick up in store" as provider; 6. add warehouse as pick-up location; 7. replenish stock of a published product in the warehouse; 8. go to product's eCommerce page; 9. select store as a pick-up location. Issue ----- > Invalid Operation: Incompatible companies on records Cause ----- The `warehouse_id` field of `sale.order` has `check_company` set to `True`. When `_check_company` gets called, it will throw an error if the `warehouse_id` belongs to a different company than the order. Solution -------- Add `check_company_domain_child_of` to `models`, and use it for `stock.warehouse` and `stock.location` to allow for companies to use warehouses & locations of their branch companies. opw-4777937
Changing a blog cover image or its visual filter no longer causes the underlying cover template to be saved by mistake. This prevents unwanted page template changes and keeps website content editing more reliable.
Original PR description
Since summernote was replaced by the editor, the record cover template becomes `o_dirty` and therefore gets saved when a cover image is changed. This commit solves this by marking the record cover components readonly inside the DOM. Steps to reproduce: - install website_blog - set a blog cover image or specify its filter - save => The `record_cover` template was saved with the modifications, thus combining `t-att-style` and `style` attributes. task-jke Forward-Port-Of: odoo/odoo#219013
This fix prevents an error when a user removes the company from a new expense form. The expense workflow now checks that a company is present before looking up its currency, avoiding a crash and keeping expense entry usable in multi-company setups.
Original PR description
This error occurs when the user removes the company from the expense form view. Steps to reproduce: - Install ``hr_expense`` modules - Create another Company - Now open a new expense and remove the ``Company`` Traceback: ``ValueError: Expected singleton: res.currency()`` At [1], the company is not set, and we are attempting to retrieve the currency ID from it. This commit resolves the issue by ensuring that the company is present before proceeding. [1]- https://github.com/odoo/odoo/blob/408fbf8efbbfbc47c3171d9ee082e3831016f6db/addons/hr_expense/models/hr_expense.py#L341-L355 sentry-6112771029 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an error when a user tries to return a stock receipt that was deleted in another browser tab. Instead of crashing, the stock return flow now handles the missing receipt more safely, improving reliability in multi-tab usage.
Original PR description
The error occurs because we are deleting stock picking from one tab and trying to return that picking from another tab. Steps to reproduce: --- - Install ``sale_stock`` module - Go to receipt > open one receipt(state: Draft or Ready) - Now duplicate that tab > delete that receipt from one tab and click on 'Return' button in another tab Traceback: --- ``ValueError: Expected singleton: stock.picking()`` At [1], we are facing an error because we are accessing the ``_can_return`` method but don't have a stock picking ID. [1]- https://github.com/odoo/odoo/blob/f613b87c38d208730ba2470e0a26a110c2089b66/addons/stock/wizard/stock_picking_return.py#L104 sentry-6012377745 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users who reset their Google Calendar account more than once will now see a clear, user-friendly warning instead of a technical crash message. This helps reduce confusion and support effort when the calendar authentication token has already been removed.
Original PR description
This error occurs when a user resets their Google Calendar account. As a result, the authentication token disappears, and if they attempt to reset the account again, an error is triggered. Steps to reproduce: --- - Install `google_calendar` module - Set Google Calendar Credentials in settings. - Go to Calendar and Sync with Google - Users > Mitchell Admin > Calendar - `Reset Account` > `Confirm` (keep the selections as default) - Again `Reset Account` > `User's Existing Events: Delete from Both` Stack Trace: --- AttributeError: An authentication token is required Due to an AttributeError, users are seeing an error message in the stack trace instead of a user-friendly notification. sentry-6311340556 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Creating a new website page no longer fails if an existing custom template page has missing or incomplete page structure. This helps website editors continue managing pages even when earlier custom code contains mistakes.
Original PR description
This error occurs when trying to create a new page after previously creating a custom page that contains missing or incomplete code, leading to unexpected behavior. Steps to reproduce: --- - Install the `Website` module. - Navigate to Website > Site > Pages and create a new Blank Page (Test). - Site > Properties > Enable `Is a Template` > Save & Close - Open Page (Test) Settings, remove `id="wrap"` or `Add custom code` in Architecture, and save. - Return to `Pages` and click `New`. Traceback: --- IndexError: list index out of range At [1], this error occurs because the html_tree fails to find `id="wrap"` in the `<div>` element of the custom code added by the user in the architecture while creating a new page. https://github.com/odoo/odoo/blob/aed6c283951929a8ba504fe3166838db566ed735/addons/website/controllers/main.py#L696 sentry-6390821119 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an error that could interrupt notifications when todo activities are created or updated. Users linked to overdue activities will now be notified reliably, reducing disruption in activity follow-up workflows.
Original PR description
An UnboundLocalError was occurring due to referencing the variable `activity` before it was assigned a value. Traceback : --- ``` UnboundLocalError: cannot access local variable 'activity' where it…
An UnboundLocalError was occurring due to referencing the variable `activity` before it was assigned a value.
Traceback :
---
```
UnboundLocalError: cannot access local variable 'activity' where it is not associated with a value
File "odoo/http.py", line 2416, in __call__
response = request._serve_db()
File "odoo/http.py", line 1942, in _serve_db
return self._transactioning(
File "odoo/http.py", line 2006, 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 1973, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2224, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 335, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 741, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "addons/rpc/controllers.py", line 177, in jsonrpc
return dispatch_rpc(service, method, args)
File "odoo/http.py", line 397, in dispatch_rpc
return dispatch(method, params)
File "odoo/service/model.py", line 85, in dispatch
res = execute_kw(db, uid, *params[3:])
File "odoo/service/model.py", line 108, in execute_kw
return execute(db, uid, obj, method, *args, **kw or {})
File "odoo/service/model.py", line 115, in execute
res = execute_cr(cr, uid, obj, method, *args, **kw)
File "odoo/service/model.py", line 99, in execute_cr
result = retrying(partial(call_kw, recs, method, args, kw), env)
File "odoo/service/model.py", line 137, in retrying
result = func()
File "odoo/service/model.py", line 62, in call_kw
result = getattr(recs, name)(*args, **kwargs)
File "<decorator-gen-44>", line 2, in create
File "odoo/orm/decorators.py", line 317, in _model_create_multi
return create(self, [arg])
File "addons/mail/models/mail_activity.py", line 303, in create
activity.user_id._bus_send("mail.activity/updated", {"activity_created": True})
```
The error occurs at [1] because `activity` is used in the `_bus_send` call without being properly initialized within that scope.
This commit will resolve the above error by passing `todo_activities` instead of `activity`, ensuring that all users linked to overdue activities are properly notified.
[1]- https://github.com/odoo/odoo/blob/f82f768729d897fa54b04789f4e0637ed1bb27f4/addons/mail/models/mail_activity.py#L306-L308
sentry-6273716627
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prFixes an issue where customers could see an error when editing portal information if no invoice sending method was configured. This keeps the portal form usable and avoids a confusing interruption for users.
Original PR description
When there is no invoice sending method and the user tries to edit information in the portal, a traceback will appear. Traceback: ``` QWebException: Error while render the template TypeError: object of type 'NoneType' has no len() Node: <div class="row m-0 p-0" t-if="len(invoice_sending_methods) > 1"/> ``` https://github.com/odoo/odoo/blob/14ddd49c52f0030f7dbad7d4889f4edf1b74ae39/addons/account/views/account_portal_templates.xml#L260 When there is no invoice sending method, ``invoice_sending_methods`` will be None. So, It will lead to the above traceback. sentry-6015474981 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Fixes an issue where refusing a job application while selecting a duplicate application could cause an error instead of completing the refusal. This helps recruiters process duplicate applications smoothly without interruptions.
Original PR description
When the user refuses the application with its duplicate application, a traceback will appear. Steps to reproduce the error: - Go to Recruitment > All Applications > Create 2 applications with the…
When the user refuses the application with its duplicate application,
a traceback will appear.
Steps to reproduce the error:
- Go to Recruitment > All Applications >
Create 2 applications with the same candidate
- Open that application > Refuse > Select refuse reason >
Select other Duplicate application > Refuse
Traceback:
```
AttributeError: 'hr.applicant' object has no attribute '_get_similar_applicants_domain'
File "odoo/http.py", line 2364, in __call__
response = request._serve_db()
File "odoo/http.py", line 1891, in _serve_db
return self._transactioning(
File "odoo/http.py", line 1954, 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 1921, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "odoo/http.py", line 2168, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "odoo/addons/base/models/ir_http.py", line 330, in _dispatch
result = endpoint(**request.params)
File "odoo/http.py", line 728, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "addons/web/controllers/dataset.py", line 40, in call_button
action = 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/hr_recruitment/wizard/applicant_refuse_reason.py", line 75, in action_refuse_reason_apply
duplicate_domain = self.applicant_ids._get_similar_applicants_domain()
```
https://github.com/odoo/odoo/blob/e4a4806e5c58c599815204a73c78a228ee230613/addons/hr_recruitment/wizard/applicant_refuse_reason.py#L75
``_get_similar_applicants_domain`` method is removed in this commit 9359d08d331beac389fde0e6c82c895341f7dbc5 but still used here.
So, it will lead to the above traceback.
sentry-5986653915
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prShipping carriers can now calculate delivery options for orders containing combo products when the individual items have weights. This prevents checkout or sales order errors that incorrectly treated the combo bundle itself as missing weight, and also avoids false errors on zero-quantity lines such as down payments.
Original PR description
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest} Versions -------- - 18.0+ Steps ----- 1. Have a combo product Foo; 2. ensure the combo items have a weight set; 3. enable & publish a…
\* = bpost, dhl{,_rest}, easypost, sendcloud, ups, usps{,_rest}
Versions
--------
- 18.0+
Steps
-----
1. Have a combo product Foo;
2. ensure the combo items have a weight set;
3. enable & publish a shipping connector;
4. add combo product to cart;
5. go to checkout;
6. attempt to select shipping connector as delivery method.
A similar message appears when trying to add a delivery method to a backend order if the order has downpayment lines.
Issue
-----
> The estimated shipping price cannot be computed because the weight is missing for the following product(s): Foo
Cause
-----
The combo product doesn't have a weight, as it's not a discrete item, but a collection of multiple items.
The shipping connectors haven't been updated yet to account for this, and still expect every non-service product to have a weight.
Solution
--------
When looking for lines without weight, filter out products of type `combo` (similar to how `service` products are handled) using a new `_get_invalid_delivery_weight_liens` helper method, added to `sale.order.line`.
Also ignore lines where `product_qty` is zero, e.g. `display_type` lines & down payment lines.
Community PR: https://github.com/odoo/odoo/pull/221696
opw-4940973When a task is moved to a different project, its attached documents are now moved to the correct project workspace as well. This keeps files organized in the right place and avoids users finding task documents in an old project's workspace; private projects move documents to the internal workspace.
Original PR description
- 16.0 ### Steps to reproduce: - Install document and project. - Create a project and task. - Add a document to the task. - Change the task's project to another project. - Open the attached document from the task. ### Issue: You will observe that the document is not in the new project's workspace. It's still present in the older project's workspace ### Solution: Update the document's folder on the change of the task's project. task-4389443 Forward-Port-Of: odoo/enterprise#91510 Forward-Port-Of: odoo/enterprise#75481
Spanish Model 349 tax reports now calculate rectification amounts using linked credit notes only, so payments no longer incorrectly reduce the reported value. This improves compliance accuracy for businesses filing Spanish tax declarations and ensures BOE exports match the required rectification rules.
Original PR description
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on…
# How to reproduce the issue With l10n_es fiscal position: - Create a bill in a previous period (e.g., amount 1000). Partially credit note this bill for 500. - Register a partial payment of 250 on this bill. - In the tax report, go to model 349. Under the Rectificationes section, the new rectified value will be 250. This is incorrect, as the rectifications in this report should only reflect the value of the original move from a past period after applying the credit note. Payments or other transactions should not impact this report. This commit adjusts the computation of the report (and the BOE export) to ensure that, instead of using `amount_residual` (which includes payments and other transactions), the report uses the sum of the credit notes linked to the move included in the rectification report. Also changed the test test_mod349_credit_note. The rectification section is supposed to show the adjusted amount after rectification. In the test a bill of 400 is fully refunded. Instead of 400, the report should show 0. (https://www.boe.es/buscar/doc.php?id=BOE-A-2010-5098 in TIPO DE REGISTRO 2: REGISTRO DE RECTIFICACIONES. in 153-165 Numérico Base Imponible Rectificada section) opw-4895636 Forward-Port-Of: odoo/enterprise#90174 Forward-Port-Of: odoo/enterprise#89431
This fix prevents an error when users manually enter a tracking reference for a Sendcloud delivery. Instead of showing a technical crash, the system now handles the missing Sendcloud parcel details gracefully and can display a proper user-facing message.
Original PR description
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3.…
**Steps to reproduce:** 1. Install delivery_sendcloud. 2. Create a new shipping method (Inventory -> Configuration) - Provider: sendcloud - Put the public and secret key - Assign Delivery Product 3. Create a sales order with a deliverable product 4. Confirm the sale order 5. Go to the delivery 6. Manually enter a random tracking reference. 7. Make sure carrier is set to the Sendcloud delivery method 8. Click on "tracking," or get back to the sales order (click "preview"). 9. A traceback occurs. **Issue:** `A TypeError: 'bool' object is not subscriptable` when accessing sendcloud_parcel_ref, which is expected to be a list or JSON but is instead a boolean. **Causes:** The code assumes the presence of valid Sendcloud parcel reference data, but manually entering a tracking reference bypasses the [_send_shipment](https://github.com/odoo/enterprise/blob/6ecf0af6b6874460d300ede6cc7c092927607810/delivery_sendcloud/models/sendcloud_service.py#L102) method that populates this field. As a result, sendcloud_parcel_ref can remain False. https://github.com/odoo/enterprise/blob/df924ef8adffb3e42419a44ecf22fec3059917c4/delivery_sendcloud/models/delivery_carrier.py#L196 **Solution:** Return None if there is no Sendcloud parcel reference, which will raise a UserError from the below line https://github.com/odoo/odoo/blob/17.0/addons/stock_delivery/models/stock_picking.py#L288 Co-Author By - alsh@odoo.com opw-4894677 Forward-Port-Of: odoo/enterprise#89444
Fixes an error that could block recruiters from posting jobs to Monster when the saved username contains non-ASCII or accented characters. This makes the Monster integration more reliable for users with international credentials.
Original PR description
This error occurs when non-ASCII characters are included in the username for the Monster credentials. Steps to reproduce: --- - Install `hr_recruitment_integration_monster` module - In the settings, add the Monster credentials, and enter non-ASCII characters in the Username - Recruitment > Applications > Job Boards Post > Publish on jobs Board > Add required fields > Post Traceback: --- TypeError: comparing strings with non-ASCII characters is not supported This commit resolves the above error by encoding the string to bytes, as consteq does not support non-ASCII characters in string comparison. sentry-6554749046
Fixed an issue where editing a signing template could replace popup titles with placeholder text. This keeps reused signing templates clear and prevents incorrect field labels from appearing in future documents.
Original PR description
### Steps to reproduce:
- Create a document using a sign template.
- Add a new field or modify the placeholder of an existing one.
- Validate the changes.
- Notice title is replaced by the value entered in placeholder.
### Issue:
After editing a template that has already been used in a signed document, the title of each sign item popup is unexpectedly replaced with the value
entered in the placeholder for that item. This corrupts the template and results
in incorrect title of sign itme being shown when the template is reused.
### Cause:
The issue occurs because the title was being updated with the placeholder of that particular sign item.
### Solution:
Added a prop for title of sign item in SignCustomPopover so that we can make the title as name of the sign item or the type like ('Name', 'Text', 'Signature') rather than the placeholder of the sign item.
---
task-4872963
Forward-Port-Of: odoo/enterprise#90348Opening budget line reports for a budget with no lines no longer causes an error when viewing the theoretical percentage measure. Instead, the value is shown as zero, allowing users to continue analyzing budgets without interruption.
Original PR description
When we create a new budget without any budget lines and then attempt to calculate the ``theoretical_percentage`` in the budget lines, an error occurs. Steps to reproduce: - Install the ``account_budget`` module - Create a new budget and make ``Budget Lines`` empty - Now select that newly created budget and click on ``Budget Lines`` button - Go to the ``Pivot`` view and click on the ``Measures`` button - Click on the ``Theoritical Percentage`` Traceback: ``ZeroDivisionError: division by zero`` This error occurred at [1] because no ``records`` were found in the budget lines, as they were left empty when the budget was created. This commit will fix the error by checking the length of the records. If it is zero, will return zero. [1]- https://github.com/odoo/enterprise/blob/e4aec10fc1dd6a40e29f34c3aed71dc17b9ff2c6/account_budget/models/budget_line.py#L185-L186 sentry-5795601874