Daily updates from Odoo
Navigate
Branch
Wednesday, August 27, 2025
24 changes
3 changes
Resolved issues and error corrections
This fixes a checkout issue where changing a product image layout in the website editor could make the Add to Cart and wishlist buttons stop working. The storefront now finds the correct product form even when the page layout places the button outside its usual position, helping customers complete purchases reliably.
Original PR description
## Version saas-18.4+ ## Steps to reproduce - Open the shop; - Select any product; - Open the Editor: - Select the product's main image; - Change the image width to either `100 percent` or `None`,…
## Version
saas-18.4+
## Steps to reproduce
- Open the shop;
- Select any product;
- Open the Editor:
- Select the product's main image;
- Change the image width to either `100 percent` or `None`, then save;
- Click on `Add to cart`.
## Issue
Commit bbb2d98d9ab97ce729d59b9858b63daccf5434e2 introduced a UI update that reorganizes the layout of the product configurator, placing the `Add to cart` button next to the form rather than below it.
Although the button remains inside the form in the original template, using the Editor to adjust the layout can result in the button being saved outside the `<form>` element in the final DOM.
This breaks the logic that relies on `closest('form')` to locate the surrounding form, since the button is no longer a descendant of the form element.
## Solution
Find the first product form relative to the button, since it may be a sibling rather than an ancestor in the DOM.
opw-4942986
See also:
- https://github.com/odoo/enterprise/pull/90631This fix prevents certain IoT-connected printers from disappearing when their connection method briefly changes during availability checks. Businesses can keep printing reliably because the system recognizes the printer by its IP address and preserves the existing print queue entry.
Original PR description
Some printers (`lpd...PASSTHRU`s for example) tend to disappear when checking available printers list. They are often switching between one time `lpd...PASSTHRU` and the second time `socket...` protocols. As we get ip addresses for printers, we now check if the new protocol still correspond to the same printer, and if so, we keep the old one. As the printer will still be in the cups queue list, it will still be able to print through it.
This fix prevents users from seeing an error when they complete a scheduled activity linked to an approval rule that has since been deleted. It keeps the activity workflow stable in Web Studio by safely handling cases where no approval rules remain.
Original PR description
An error occurs when a user attempts to mark a scheduled activity as done after the associated approval rule has been deleted. **Steps to Reproduce:** 1) Install Sales and Web Studio modules. 2) Log…
An error occurs when a user attempts to mark a scheduled activity as done after the associated approval rule has been deleted. **Steps to Reproduce:** 1) Install Sales and Web Studio modules. 2) Log in as Admin and use Studio to add an approval rule to the Sale Order’s Preview button. >- Set Allowed Group to Access Rights. >- Set Responsible User to Mitchell Admin. 3) In the Incognito Tab, login as Demo, open the same sale order and click on preview to create activity in chatter. 4) Delete the Approval Rule in the original tab. 5) Switch back to Demo and click Mark Done under Planned Activity in chatter. **Error:** `SyntaxError: syntax error at or near ')'` `LINE 1: SELECT id FROM studio_approval_rule WHERE id IN () FOR UPDAT. ^` **Root Cause:** The error occurs because the SQL query at [1] includes an empty tuple of rule IDs `(all_rule_ids)`. An empty `IN ()` clause in SQL results in a syntax error. [1]- https://github.com/odoo/enterprise/blob/7ea45724e7689a0df11d20ace9c562788f5d19e3/web_studio/models/studio_approval.py#L366 **Solution:** This commit avoids the error by ensuring that the SQL query only runs when `all_rule_ids` is not empty. sentry-6306636466 Forward-Port-Of: odoo/enterprise#86982
21 changes
Security fixes and vulnerability patches
This change updates the signing flow to rely on the standard attachment access check when documents are used. It helps keep document permissions consistent across signing and document management, reducing the risk of people accessing files they should not see.
Original PR description
odoo/odoo#219015
Enhancements to existing features
Thread action placement in live chat, helpdesk, and WhatsApp messaging has been simplified by removing the old sidebar-specific logic. This should make chat and discussion actions more consistent across different messaging views while reducing internal complexity.
Original PR description
This was added for contextual elligibility of showing of action in sidebar vs discuss top-right thread actions and chat window actions. This commit replaces the `sidebarActions` to explicit code in `condition`. The slight difference of sequences with partition has been considered with dynamic sequence based on conditions for "sidebar". This change also removes `partition` and `contextual action` that were defined to work in tandem with `sidebar` concept.
Manufacturing teams can now generate and manage multiple serial numbers from a single manufacturing order instead of creating separate orders. This simplifies production workflows for serialized products and improves visibility in Shop Floor and Barcode apps, including clearer display when many serial numbers are involved.
Original PR description
Allow Manufacturing Order to produce multiple serial numbers.
The accounting interface now shows the journal selection field only when the accounting app has multiple journals available and the user needs to choose one. This reduces unnecessary clutter when there is only one option, while still making the choice visible when it matters.
Original PR description
Improves journal field visibility for better user experience: - Shows journal field when `account_accountant` is installed and multiple journals are available for selection - Hides journal field when only one journal is available (no selection needed) - Completely hidden when only `account` module is installed Before: Journal field only visible when `accountant` module is installed. After: Journal field is visible when `account_accountant` module is installed and multiple journals are available. Related PR : https://github.com/odoo/odoo/pull/222209 Task : 4988183
Several Odoo dashboards now include carousel-style navigation, making it easier for users to browse dashboard content in a more focused way. This improves the dashboard experience across accounting, CRM, helpdesk, payroll, recruitment, marketing automation, manufacturing, purchasing, and rental reporting areas.
Original PR description
This commit updates the dashboards to include the new carousel feature. Part of task: 4851982
Appointment questions can now be reused across different appointment types, making setup and translation easier to maintain. Phone number collection is now managed as a configurable question, so businesses can choose whether each appointment requires or omits it, while required questions are more consistently enforced during booking.
Original PR description
MAIN CHANGES ============= 1. Make questions easier to (re-)use across similar appointments (translations, update, consistency...) by making the field a m2m. 2. Also make appointments more flexible…
MAIN CHANGES ============= 1. Make questions easier to (re-)use across similar appointments (translations, update, consistency...) by making the field a m2m. 2. Also make appointments more flexible by adding a new 'phone' question_type and moving the phone from an hard-coded template input to an appointment.question record (and data). Appointments can now be phone-less. 3. Give configuration flexibility on questions, with new `is_default` and `is_reusable` boolean fields. `is_default` will make the question added to all new appointment_types, and if `is_reusable` is false, it will not be available when adding new questions on the appointment type form. OTHER CHANGES ============== - Improve the form view of appointment.question and add a small selection badge widget with icons. - The appointment question model is now also ordered by id to improve determinism. - Add the data appointment_question_phone, default question and reusable. - Partner matching is the same when a phone question is used. The first phone question (in terms of order - sequence) is the one to be used, also for prefilling partner data, or updating partner if appropriate. - Add an `active` field on the appointment.question model. - Enforce mandatory questions on controller side OTHER COMMIT ============= Before applying the changes above, improve the question answer handling in the controller by removing heavy regex and use a lighter solution based on existing questions and answers. UPGRADE ======== - relational table is created and populated between appointments and questions. - questions without `question_type` are deleted, and related records due to `cascade ondelete` - `is_reusable` is false for existing questions, despite True by default for future records. This allows a 'clean sheet' on migration, as existing questions will not be reusable on all appointments. - `is_default` is false for existing questions - Add new 'phone' data question and link it to all existing appointments. Also give it the lowest sequence so that it appears at the top of questions, as it was before. A test is also added. See UPG PR: https://github.com/odoo/upgrade/pull/7691 Task-4655040
Belgian 281.50 tax reporting now includes sportsman activity information, helping businesses meet reporting requirements for these payments. The update also separates first names for natural persons in XML exports to better match official specifications.
Original PR description
## IMP] l10n_be_reports: 281.50 add sportsman activities The aim of this commit is to cover the sport activities part of the 281.50 reports. Context: During the initial dev we ignored that feature as it wasn't our main focus. Now, the feature matured and some customer needs it. Task-id: 4919018 ## [IMP] l10n_be_reports: 281.50 handle natural person first name The aim of this commit is to comply with the 281.50 official specs by handling the first name of natural person and setting it in the xml. Before this commit: We don't handle first name and we set the whole partner.name as the name. After this commit: We handle first name and assume it is everything after the last ', ' separation. Task-id: 4919018
Users can now access the Ask AI natural language query feature directly from the main command palette using CTRL+K, instead of needing to switch to the slash command area. This makes AI assistance more discoverable and reduces extra steps, while caching also helps avoid unnecessary background requests.
Original PR description
This commit allows access to the ask ai command (natural language query feature) from the default namespace (CTRL+K) for better UX. After this commit, Ask AI agent can now be access from both the "/" and default namespace. To accomplish the feature, we need to override the `setCommands` of the CommandPalette component because it has special handling of "default" commands -- it filters out the commands not similar to the searchValue. However, we want the Ask AI command to be always there (showing as well the searchValue). So, when we see that the set of filtered commands has zero items, that's the time we insert the Ask AI command. We are also now caching the Ask AI agent to avoid unnecessary rpc calls. See illustration: https://youtu.be/lJWY8RC4V5I
Creating recurring prices on subscription products is now more straightforward: users add fixed prices directly in the list instead of going through an extra pricing dialog. The pricing screen is also clearer by hiding non-fixed price entries that could appear misleading and by reordering the Pricelist and Plan fields.
Original PR description
From this PR onwards, when adding a new recurring price on a product, the usual dialog window with the choice for complex pricing isn't shown anymore. The list view is used to add new prices and it defaults to a fixed price. The position of the Pricelist and of the Plan has also been inverted. Task: 5021972
The Belgian POS blackbox connection now retries detection and records clearer logs when identification fails. This helps reduce cases where certified fiscal hardware is not recognized correctly, making troubleshooting faster and operations more reliable.
Original PR description
This PR adds a retry mechanism and a logger to better identify and prevent cases where a blackbox isn't correctly identified as such Forward-Port-Of: odoo/enterprise#92489
Resolved issues and error corrections
The scheduled subscription invoicing process now looks beyond the initial batch before deciding whether more work should be triggered. This prevents eligible subscriptions from being skipped when earlier records in the batch are not ready to invoice, helping invoices run on time.
Original PR description
Change was introduced here https://github.com/odoo/enterprise/pull/82340 that caused the cron trigger to not be activated if any of the 31 in the batch of subscriptions found was not to invoice. This is problematic because there could be other subscriptions that meet the domain requirements and the to invoice requirements that are not being seen because the limit is on the search before we check invoiceability. Added a limit to _get_subscriptions_to_invoice instead of on the search in order to take into account both filters for next cron triggers. opw-4850884 Forward-Port-Of: odoo/enterprise#92690 Forward-Port-Of: odoo/enterprise#89787
Appointment video call redirection now works correctly when several calendar events are processed at once. This prevents an error that could block or break video call link setup for multiple appointments.
Original PR description
When computing `videocall_redirection`, the method `get_base_url()` was called directly on a recordset containing multiple `calendar.event` records. Since `get_base_url()` expects a singleton, this raised the error: Traceback: --- `ValueError: Expected singleton or no record: calendar.event(4, 6, 1, 5)` This commit ensures the computation is done per record, avoiding the singleton issue and allowing correct videocall redirection values to be set on multiple events. Reference review: https://github.com/odoo/enterprise/pull/53569#discussion_r1543135425 sentry-6819406171 Forward-Port-Of: odoo/enterprise#92717
Fixes an error that could occur when setting a Pricer Sales Pricelist on a product variant. Users can now update this field without interruption, including while working with newly created product records.
Original PR description
Steps to Reproduce: ---------------------------------- - Open the product variant form - Set the Pricer Sales Pricelist field - Traceback Issue: ---------------------------------- - `TypeError: ProductPricelist._compute_price_rule() takes 3 positional arguments but 4 were given` Cause: ---------------------------------- - `_get_product_price()` was calling `_compute_price_rule()` with positional args instead of named quantity - If the product record is not yet created (`product._origin` is False), it skips price computation logic Fix: ---------------------------------- - Pass `quantity=1.0` explicitly to `_compute_price_rule()` to resolve the argument mismatch - Handle case where `product._origin` is False by falling back to `product` itself Task-4888983 Forward-Port-Of: odoo/enterprise#92702 Forward-Port-Of: odoo/enterprise#88321
This fixes a crash that could happen when a user marked a planned activity as done after its related Studio approval rule had been deleted. Users can now complete those activities without being blocked by an error, improving reliability in approval workflows.
Original PR description
An error occurs when a user attempts to mark a scheduled activity as done after the associated approval rule has been deleted. **Steps to Reproduce:** 1) Install Sales and Web Studio modules. 2) Log…
An error occurs when a user attempts to mark a scheduled activity as done after the associated approval rule has been deleted. **Steps to Reproduce:** 1) Install Sales and Web Studio modules. 2) Log in as Admin and use Studio to add an approval rule to the Sale Order’s Preview button. >- Set Allowed Group to Access Rights. >- Set Responsible User to Mitchell Admin. 3) In the Incognito Tab, login as Demo, open the same sale order and click on preview to create activity in chatter. 4) Delete the Approval Rule in the original tab. 5) Switch back to Demo and click Mark Done under Planned Activity in chatter. **Error:** `SyntaxError: syntax error at or near ')'` `LINE 1: SELECT id FROM studio_approval_rule WHERE id IN () FOR UPDAT. ^` **Root Cause:** The error occurs because the SQL query at [1] includes an empty tuple of rule IDs `(all_rule_ids)`. An empty `IN ()` clause in SQL results in a syntax error. [1]- https://github.com/odoo/enterprise/blob/7ea45724e7689a0df11d20ace9c562788f5d19e3/web_studio/models/studio_approval.py#L366 **Solution:** This commit avoids the error by ensuring that the SQL query only runs when `all_rule_ids` is not empty. sentry-6306636466 Forward-Port-Of: odoo/enterprise#86982
Employee appraisal skill records now keep important extra information, such as the justification text, when skill levels are changed or copied. This prevents appraisal details from being unintentionally erased and helps maintain a complete employee evaluation history.
Original PR description
Allow models that inherit the hr_individual_skill mixin to specify additional fields to be included/preserved/carried-over when writing/creating new skill records. This was already an issue in the `hr_appraisal_skill` module where the `Justification` field was not included when copying/creating new skills. As a result, the field was "erased" on every skill level change task-4984689 Forward-Port-Of: odoo/enterprise#91772
Reopening a selection or numeric global filter in spreadsheets now replaces the current side panel instead of opening an extra one. This creates a more consistent editing experience and avoids confusing duplicate panels for users working with spreadsheet filters.
Original PR description
This commit aligns the behaviour of reopening the global filter side panel with the imp introduced in commit: https://github.com/odoo/enterprise/pull/92483/commits/60ceb8bd1188fdd14fdf72bac46a445e688f3683 Current behavior before PR: - Reopening a selection/numeric global filter side panel showed the previous behaviour (opening a new panel instead of replacing it). Desired behavior after PR is merged: - The same behaviour as in the commit applied: reopening side panel from a child now replaces the current one instead of opening a new side panel. Task: 5034264
Fixes an issue where adjusting the checkout time from the weekly Attendance view could save the current time instead of the time selected by the user. This helps keep employee attendance records accurate when managers edit checkout times in the Gantt interface.
Original PR description
Steps to Produce: - Go to the Attendance interface and select week. - Drag the second half of the column to adjust checkout. - Save the change. Issue: - Dragging on half cell deletes the checkout value from the context. - As a result, the system sets the checkout time to the current time instead of the dragged value. - This leads to incorrect attendance records. Fix: - Ensure the checkout value remains in the context when dragging the cell. - Preserve the modified checkout time so it reflects the user's intended change instead of defaulting to the current time. Task-4958060 Forward-Port-Of: odoo/enterprise#93092 Forward-Port-Of: odoo/enterprise#91119
Fixed an issue in Odoo Sign where initials selected in the Add Initials dialog could be added but not shown on multi-page PDFs. Users now see their initials immediately on the document, whether applied to one page or all pages.
Original PR description
Issue: * When uploading a multi-page PDF and choosing an option in the `Add Initials` dialog, the initials were not visible. * This happened because the old `postRender` used to call `refreshSignItems`, but that code was removed in a recent refactor. Fix: * Call `refreshSignItems()` directly after inserting the initials. * Ensures initials appear immediately whether added on one page or across all pages. Impact: * Users now see their initials properly rendered on the document after making a choice in the dialog.
This fix prevents the Point of Sale from showing an error when an order is unavailable while checking the amount due. It helps cashiers continue their workflow smoothly in edge cases where order data is missing.
Original PR description
Before this commit, accessing the order amount caused an error if the order was not defined. opw-5027426 Forward-Port-Of: odoo/enterprise#92928 Forward-Port-Of: odoo/enterprise#92736
Code cleanup and technical improvements
This update completes leftover cleanup from a broader date handling migration across several Odoo apps. It keeps underlying views and website data aligned with the new approach, reducing maintenance risk without changing day-to-day business workflows.
Original PR description
odoo/odoo#221348
The Knowledge and Web Studio areas were updated to use the new video permission setting behind the scenes. Users can still add videos in Knowledge through the existing embedded media flow, so there is no expected change in day-to-day behavior.
Original PR description
This commit adapts code to the replacement of the `allowMediaDialogVideo` option with `allowVideo`. For the knowledge module, inserting video will still be available (only) via an embedded component, so no functional changes are introduced. task-4384948