Wednesday, October 25, 2023
124 changes · master
Security fixes and vulnerability patches
Website forms now include a signature so Odoo can confirm that submitted forms were generated by the website itself. This helps prevent people from sending unexpected or unauthorized form fields to the website form handler, improving data integrity and security for website submissions.
Original PR description
This commits add a signature to the website_form. The purpose of this modification is to allow the controllers to be able to verify that the form was originally generated from the view. This prevent the end user to submit arbitrary values to the website_form controller. In this commit, email_cc and email_bcc are treated as the same fied as it holds the same function This does not offer protection against submission replay. Previous versions of the form are not invalidated by editing the view. If one need to completely reset that protection and invalidate the previously generated website_form, the only solution is currently to change the database secret.
New functionality added to Odoo
This update introduces a new shared identity concept to better separate contact details from users, partners, visitors, and employees. It also cleans up older contact and messaging code so future customer communication features can be built more consistently and reliably.
Original PR description
Enhancements to existing features
Website administrators can now add a new language directly from the theme settings, opening the language setup wizard from the same place they manage website appearance. Language display options are simplified when only one language is available, with improved defaults and new display choices that better support responsive website layouts.
Original PR description
This adds a button to add language in theme tab. When clicked, opens the "add a language" wizard. If the website has only one language, the options to enable language in header & footer are hidden. When a user add a language, the default behavior is Header : dropdown & Footer : inline. Inline mode for the header is no longer accepted for responsive reason. Also provides two more rendering options : Language Code and Flag + Language Code. task-3457554
Resolved issues and error corrections
The mail reaction menu now closes automatically when the last reaction is removed. This prevents users from seeing an empty menu and makes the messaging experience feel cleaner and less confusing.
Original PR description
Currently, if all reactions are deleted from reactions menu, the menu remains open. This commit force it close in case of having no reactions. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Features or functions removed from Odoo
Removed an outdated live chat code override that was accidentally left behind after a related field was removed. This is a minor internal cleanup that helps keep the live chat module consistent and easier to maintain, with no expected change for users.
Original PR description
Follow-up of https://github.com/odoo/odoo/pull/138330 The computed field was removed during dev from the base module but the override was left by mistake.
Code cleanup and technical improvements
This update reorganizes automated Point of Sale test tours to make them easier for developers to maintain. It does not change customer-facing POS behavior, but it helps reduce future maintenance effort and supports more reliable testing across POS-related modules.
Miscellaneous changes
Before this commit, when using a livechat chatbot from visitor and selecting a chatbot option, there was the following traceback: ``` UncaughtPromiseError > SyntaxError Uncaught Promise > JSON Parse error: Unterminated string SyntaxError: JSON Parse error: Unterminated string parse@[native code] updateSession ``` This happens because the session cookie had incorrect format for its content. This was caused by a history prop whose content had the character "→". When setting the cookie,
Original PR description
Before this commit, when using a livechat chatbot from visitor and selecting a chatbot option, there was the following traceback: ``` UncaughtPromiseError > SyntaxError Uncaught Promise > JSON Parse…
Before this commit, when using a livechat chatbot from visitor and selecting a chatbot option, there was the following traceback: ``` UncaughtPromiseError > SyntaxError Uncaught Promise > JSON Parse error: Unterminated string SyntaxError: JSON Parse error: Unterminated string parse@[native code] updateSession ``` This happens because the session cookie had incorrect format for its content. This was caused by a history prop whose content had the character "→". When setting the cookie, the stringified object is only partially inserted until this "→", which made the content non-JSON parseable as the string is incomplete. This commit fixes the issue by replacing all occurrences of the character "→" by a whitespace, so that the setting of the cookie works and insert the whole stringified object as intended. Note that this "→" is used for data that is not used in the context of livechat chatbot for the visitor, therefore this alteration of the content has functionally no effect. opw-3527969 Forward-Port-Of: odoo/odoo#139564
Task ID-2477479 (identity task) Followup of Task ID-2070632 (channel members main task) Followup of Task ID-2419762 (channel members followup task) COM PR odoo/odoo#67395 ENT PR odoo/enterprise#17617 UPG BR odoo/upgrade#2382
Users can now receive an email when a new device signs in to their account, helping them spot unexpected access sooner. Alerts are adjusted for two-factor authentication and trusted devices to avoid unnecessary notifications in common safe cases.
Original PR description
Description of the issue/feature this PR addresses: No way to know if someone logs into your account. Current behavior before PR: Prior to this, there was no way of knowing when a new device logged into your personal account. Desired behavior after PR is merged: Adding the new version of the authenticate function, user's will now automaticly receive a mail containing informations on a new connection made to their account. This system uses a mail template sent automaticly on a new connection if the user did not activate 2FA or if his device is not in the trusted devices of his account except if his 2FA method is mail where no mail will be sent even if his device is not trusted. task-3191567 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now translate chatter messages directly in Odoo when a Google Cloud Translation API key is configured. This helps teams understand foreign-language messages without leaving the app, while stored translations reduce repeated translation costs.
Original PR description
Description of the issue/feature this PR addresses: Users can add their Google Cloud Translation API Key in settings to enable the translation feature for chatter messages. Current behavior before PR: Users have to leave Odoo and use another app or chrome extension to understand message written in a foreign language. Desired behavior after PR is merged: Message translation occurs within Odoo. Task-3338165
Project users can now filter the Gantt view to quickly find tasks with scheduling conflicts. This makes it easier to spot and resolve planning issues without manually scanning all tasks.
Original PR description
Before this commit: no filter for conflict tasks After the commit: a filter is added for conflict task task- 3514831
Spanish tax template data has been clarified and updated, including new or adjusted tax definitions where needed. This should reduce confusion for companies using Spanish localization and improve consistency in electronic tax reporting setup.
Original PR description
Changes for taxes in template data were requested because they were confusing or new taxes needed to be created. List of changes applied: https://www.odoo.com/web#id=3395186&menu_id=4720&cids=1&action=333&active_id=967&model=project.task&view_type=form --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Improves the experience of creating website pages from templates by making more content blocks show accurate previews while dragging or selecting them. It also cleans up related setup code and avoids unnecessary external map loading during tests, making the feature more reliable without changing the core page-building workflow.
Original PR description
This PR contains multiple improvements related to new page from template: - generalize default content for blocks so that they also appear during drag'n'drop (instead of patching them specifically so that they work for the "new page" feature) - simplify code: remove double dialog opening guard, remove async Promise executor - remove some useless XML in templates Related: https://github.com/odoo/design-themes/pull/726 task-3555325
Users can now manage notification behavior separately for each Discuss channel, including muting channels for a chosen period or limiting alerts to mentions. This helps reduce noise while keeping important messages and action counters visible.
Original PR description
New fa-bell icon to manage notifications according to that channel only Options: Mute (+choose time period): No longer see the unread status: the bold text disappears and the channel name fades out. As if you are not a channel member anymore. Receive messages but without sound + only need action counter (grayed). Add a crossed-out bell icon next to the channel or user name to indicate that the channel is muted All messages: all messages sound + need action counter @Mentions: only mention sounds + need action counter Nothing (Discord-like): No sound + need action counter By default: all messages task-3328665 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update reorganizes part of the sales and stock workflow so rental-related deliveries can be supported more cleanly. It is an internal improvement that helps prepare the system for better rental picking behavior without changing day-to-day screens for most users.
Original PR description
Refactored _action_launch_stock_rule to create _create_procurement_group. Needed for rental pickings. task 3109952 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Odoo no longer uses a separate down payment product or related settings, reducing setup complexity and avoiding errors from treating down payments like regular products. Down payments now follow consistent tax and accounting behavior across Sales and Point of Sale, improving fiscal accuracy.
Original PR description
- Removes down payment products and it's related settings. - Previously one down payment was created per tax(es), now it's one dp per tax(es)/account combo. - Align POS down payment behavior on SALE Enterprise: https://github.com/odoo/enterprise/pull/46978 Upgrade: https://github.com/odoo/upgrade/pull/5317 Task 3254314
The Print Labels option now appears only for products where labels are relevant: storable and consumable items. This reduces confusion by hiding the option for non-physical products such as event tickets, booths, or courses.
Original PR description
Before this commit, the "Print Labels" button shows for all products except services. However, this button does not make sense for event_booth, event_ticket, course, ... products So we only show this button for storable and consumable products. Task-3390587
Website editors can now apply customizable highlight effects to selected text, replacing the older underline toggle with a richer highlight menu. This makes it easier for users to emphasize key content visually, with controls for highlight style, color, and thickness directly in the editor.
Original PR description
The goal of this PR is to replace the "Toggle underline" option [1] from the website's text editor by a new "Highlight effects" option which should allow applying some highlights on the selected text…
The goal of this PR is to replace the "Toggle underline" option [1]
from the website's text editor by a new "Highlight effects" option which
should allow applying some highlights on the selected text and setting
their color & thickness.
For this purpose, the JS code used for text animations will be updated
to be more generic and handle text highlights too. Moreover, The "Text
Highlight" options will be applied by adding a SVG to the targeted text
element (allowing to adjust their `stroke` and `stroke-width`).
To simplify adapting highlights when the text content is updated,
we follow this generic structure:
```XML
<span class="o_text_highlight">
<span class="o_text_highlight_item">
line1-textNode1 [line1-textNode2,...]
<svg.../>
</span>
[<br/>]
<span class="o_text_highlight_item">
line2-textNode1 [line2-textNode2,...]
<svg.../>
</span>
...
</span>
```
Rendered line breaks in text nodes are detected using range client
rectangles (see: `text_processing.js` > `splitNodeLines()`), and the
highlights are updated on window resize...
We also need to adjust highlight SVGs to fit an updated text in "edit
mode" (mainly using editor's commands), a `MutationObserver` is used
for this purpose (we only redraw the SVG for each text unit).
A simple SVG path generator was implemented in this PR (see:
`text_processing.js` > `drawPath()`) to build highlights. It applies a
list of SVG path commands according to text dimensions in a specific
mode (E.g. on "pattern" mode, we repeat the same elementary path to fit
targeted text node...).
Remarks:
- The `--text-highlight-width` and `--text-highlight-color` properties
are used to control the highlight effect's thickness and color.
- We build the highlight option preview in the same way as text content.
To achieve this, a hack was used (we open the `<we-select/>` first since
we need the right `getBoundingClientRect()` dimensions to correctly draw
highlight SVGs).
[1]: Also, the text editor "Toggle strikethrough" option will be moved
to the list of highlight effects in the new option.
task-3285817 (rd-website)
task-3269759 (rd-design)
Co-authored-by: Chrysanthe(CHGO) chgo@odoo.comOdoo’s website headers have been redesigned with a new set of layout choices and configurable elements such as social links, calls to action, and header text. Mobile navigation is simplified around an off-canvas layout with new alignment options, helping businesses create more modern and consistent website experiences across devices.
Original PR description
This PR redesigns all headers and improves and adapts some related features. **New Header redesigns:** All previous header designs have been removed in favor of the new redesigned set of headers.…
This PR redesigns all headers and improves and adapts some related features. **New Header redesigns:** All previous header designs have been removed in favor of the new redesigned set of headers. **New Elements feature:** This new feature allows the user to select the elements he wants to display in the header (e.g. social links, call to action, ...) **Mobile menu feature:** Since we decided to keep the mobile version with an "off canvas" layout, the Mobile Menu feature has been removed. **Alignment feature:** This feature has been adapted to match the new headers. **Mobile Alignment Feature:** Since the mobile header layout is always "off canvas", this feature allows the user to choose the menu alignment for the mobile version. Requires: - https://github.com/odoo/design-themes/pull/651 - https://github.com/odoo/upgrade/pull/5214 task-3060986 task-3474743 Co-authored-by: Brieuc-brd [brd@odoo.com](mailto:brd@odoo.com) Co-authored-by: robinlej [role@odoo.com](mailto:role@odoo.com) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The media dialog now keeps a stable size while images and documents load, making it easier for users to browse without accidental clicks or unexpected scrolling. Clearer scrolling and loading indicators, plus a disabled Add button until media is selected, help users understand what action is available next.
Original PR description
When using the media dialog, the dialog always seems glitchy as its size is always changing with the loading files. This behavior is not really convenient as it can make the user click on unwanted…
When using the media dialog, the dialog always seems glitchy as its size
is always changing with the loading files. This behavior is not really
convenient as it can make the user click on unwanted images. Another
"issue" of the current media dialog is that when loading more images,
the dialog auto-scrolls to the "Load More" button, which can make the
user miss new images and he therefore needs to revert the scroll. A last
issue encountered by the users is that some of them think that the "Add"
button in the footer is used to upload files from their device, while it
only adds the selected media to the page.
This commit improves the UX of the media dialog:
- The dialog height is now fixed and has the same size as when it is
fully filled by images.
- The top bar with the search input now stays at the top when scrolling.
- There is now a small footer under the attachments (for the Images and
Documents tabs only) and containing the following:
- When there is content to scroll, a small circle with an arrow that
scrolls one row when clicking on it.
- When there is nothing to scroll, the "Load More" button which will
load more images. When new images are loaded, if we can scroll, the
small arrow is displayed again.
- When there is nothing to scroll and to load anymore, the "All
images/documents have been loaded" text.
Note that the main goal of this footer is simply to indicate to the user
when there is still content to scroll and when he can load more files.
In order to solve the "Add" button issue, this commit also enables and
disables this button, depending on whether some media are selected:
- if a media is already selected, we can click on the button;
- if not, the button is greyed out and we cannot click on it.
task-3441587Journal item reconciliation identifiers were simplified to make accounting navigation and matching clearer. Full matches now use simpler numeric references, while partial matches use a consistent P-based format, reducing reliance on sequence setup.
Original PR description
This commit contains some misc improvements based on the 16.0 overall improvements regarding navigation and Journal Items
in account.full.reconcile, 'name' field has been removed, and the replacement for matching_number will be the SQL id instead (no more sequences)
For full reconciliations, the matching number now don't have an 'A' prefix
For partial reconciliations, the matching number will have a format of 'P{id}'
community-PR: odoo/odoo#138140
enterprise-PR: odoo/enterprise#48980
task-id: 3530458Projects can now mark timesheets as manually billable even when they are not linked to a specific sales order line. This helps businesses handle shared services such as training sessions more accurately, so consultant time can be tracked and reflected correctly in billing and reporting.
Original PR description
**Before this commit:** An internal use case of training cannot be handeled with the current ux. Basically, training is sold to customers. It is given by a consultant who needs to timesheet their time. With the current implementation, each training would generate 1 SO per customer per training. This makes it impossible to timesheet because the consultant cannot split nor multiply their time per person attending the training. Because of that, timesheets cannot be billable which leads the reporting to be inaccurate. **After this commit:** A billable project has an option 'billable manually', its timesheets are considered billed manually when the option is set. task-3565762
Several user-facing buttons, actions, and notifications have been reworded across Discuss, Web, Calendar, CRM, and related tour screens. This makes common actions such as leaving conversations, deleting filters, stopping synchronization, and assigning leads easier to understand and reduces ambiguity for users.
Original PR description
This PR changes the wording of actions and notifications in the modules listed below: 1) Discuss (Leave Conversation) 2) Web (Delete Filter, Get View - Close, Tours - Close and property field access warning) 3) Calendar (Stop Synchronization, Configure, and Discard) 4) CRM (Assign Leads) 5) POS (replaced `this.env._t` with `_t`) **Task**-3390780
The invoicing flow from Projects is clearer, with updated warning messages when required conditions are not met. Sales order lines now show the related company alongside an individual customer, making it easier for users to recognize the correct customer before invoicing.
Original PR description
This commit's purpose is to ease the the flow of invoicing from the project app. The warning message when the user tries to invoice without fulfilling the condition has been updated. When the customer of an SOL is a person and belongs to a company, the company is now also shown on the sol, in addition of the name of the customer. The idea is that the user is more keen to recognize the company than just the name of the person. task-3251615
Currency exchange rates are now cached for the duration of a transaction, reducing repeated database lookups when many conversions are processed. This should improve performance in accounting, sales, projects, and related workflows without changing normal user behavior.
Original PR description
Most of the time, rates are computed in a loop by using `<res.currency>._convert`. This leads to a lot of round trips with the database. This PR is caching the value for a whole transaction. In order to do that, the non stored field `rate` has new (missing) contextual dependencies: the arguments of `_get_conversion_rate`. This allows to move the actual computation of the rate to the computed field, and `_get_conversion_rate` is now only a proxy to avoid playing with the context manually; also kept for backward compatibility. Other solutions were considered: * `ormcache`, but we want to avoid creating multiple caches and reduce the possibility to have inter dependent caches. * managing a local cache everywhere, which is cumbersome and error prone * a helper for the previous option by using a converter factory, but it is still an issue when the convert function is called from multiple call functions because the cache isn't shared then.
The customer portal has been redesigned with a fresher look, clearer cards, pictograms, and layouts that adapt better across screen sizes. This improves consistency with the newer Odoo backend and makes important portal information easier for customers to scan and use.
Original PR description
This PR introduces a general redesign of the Portal user interface in order to give it that fresh and sleek vibe we also introduced in the backend. A list of the different changes can be found below.…
This PR introduces a general redesign of the Portal user interface in order to give it that fresh and sleek vibe we also introduced in the backend. A list of the different changes can be found below. It includes redesign of some elements as much as layout modification, or element additions. --- # Main key changes ### Introducing pictograms It is now a common practice to use pictograms across the UI when it comes to illustrate a concept related to a module but not the module itself. With the new cards layout, we implemented these pictograms to illustrate what each card is about and provides the user some context. <img width="885" alt="image" src="https://github.com/odoo/odoo/assets/128030743/e9746085-0e9a-4b68-bea2-e21f514e8b3b"> ### Layout and design update With this PR, portal is receiving several design changes, as the card layout on the home page as mentioned earlier. We also changed the general UI, removing custom `background-color` and aiming to something clean and sleek in the same vibe as what we introduced in the backend. ### Improved responsiveness With this new fluid layout, Portal gets a better responsiveness and benefits from a better layout at all media query, with different structures, always showcasing the essential information. ### SCSS files revamp We also took that opportunity to clean our SCSS files and remove custom declarations that were not needed anymore. We tend to reduce the amount of custom CSS and making use of our BS or Odoo classes. task-3046004 Co-authored-by: fdamhaut (FLDA) <flda@odoo.com> Co-authored-by: stefanorigano (SRI) <sri@odoo.com>
This update removes an older internal error-handling helper and replaces it with standard handling across several Odoo apps. It helps make browser-side errors more consistent and easier to maintain without changing business workflows.
Original PR description
This commit removes the promise extension which added the function `guardedCatch`. It was used to filter server and connection errors from javascript errors. Instead of using guardedCatch, we should use catch and check if the reason is a server or connection error if needed and re-throw the error if it's not handled. task: 3439226 Enterprise: https://github.com/odoo/enterprise/pull/48451
Odoo can now better process field visibility and editability rules that use set comparisons, supporting recent changes to how these rules are written. This helps views validate correctly and makes these conditions easier to edit in tools such as Studio.
Original PR description
The PR https://github.com/odoo/odoo/pull/104741 have recently modify how the modifiers required, readonly,
invisible, and column_invisible are defined. They are now given by Python expressions instead of domains. This will require at some point to migrate domains like [("user_ids", "in", [1, 2])] to equivalent Python expressions. For simplicity, we have chosen to translate those kind of domains using set intersections. For the last example, we get "set(user_ids).intersection([1, 2])".
In the present PR, we
- make py_js support sets and some basic set operations (e.g. intersection) (second commit)
- make easy the edition of simple set intersections in the ExpressionEditor (third commit)
- allow views to be validated if they contain fields attributes involving sets (fourth commit). This is useful in Studio for
example.
Co-authored-by: Mathieu Duckerts-Antoine <dam@odoo.com>
Co-authored-by: Christophe Matthieu <chm@odoo.com>New restaurant point-of-sale configurations now start with a default floor plan and one table, making setup faster for restaurant users. Demo and test data are adjusted so this default setup does not interfere with existing sample scenarios or automated checks.
Original PR description
In this commit a new default floor plan is added along with one table when creating a new restaurant pos_config. It ensures that the default floor is removed for the demo data and for the tests.
This change simplifies warehouse picking by combining reserved and picked quantities into one field and adding a clear picked/not picked marker. It reduces confusion for users during stock operations while ensuring the system does not overwrite quantities that staff have already confirmed as picked.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now change how product documents are shown to customers directly from the kanban view, without opening each document form. This makes document visibility management faster for sales and website teams working with product pages.
Original PR description
Currently, users who want to change the visibility of product's documents need to open their form view and edit it. This new widget allows users to quickly edit the way a document is displayed to their customers from the product's documents kanban view.
Analytic reporting now lets teams assign and compare values across multiple plans, such as country and product type, on the same accounting line. This makes pivot reports more flexible and gives businesses clearer cross-dimensional insight into costs and revenue across companies.
Original PR description
Purpose ======= Make it possible to compare analytic values between plans by inputting up to one account per plan on each line. For instance, if we have 2 plans: "Country" and "Product Type", with…
Purpose ======= Make it possible to compare analytic values between plans by inputting up to one account per plan on each line. For instance, if we have 2 plans: "Country" and "Product Type", with the following accounts | Country | Product Type | | ------- | ------------ | | BE | Drinks | | LU | Food | And the following invoices: * 1000€ of drinks in Belgium * 2000€ of food in Belgium * 3000€ of food in Luxemburg We want to be able to display the following pivot tables: | | Drinks | Food | Total | | --- | ------ | ---- | ----- | | BE | 1000 | 2000 | 3000 | | LU | 0 | 3000 | 3000 | | Tot | 1000 | 5000 | 6000 | | | Total | | ------ | ----- | | Food | 5000 | | * BE | 2000 | | * LU | 3000 | | Drinks | 1000 | | * BE | 1000 | | Total | 6000 | Implementation ============== * Each analytic plan corresponds to one field on `account.analytic.line` * The fields are added dynamically in the views. * `account.analytic.plan` doesn't have a `company_id` field anymore, meaning that all the companies have access to all the plans. This means that the applicability fields and lines are now company dependent, and those can be used to know which fields/plans to display for which company. * There can no longer be one "Project" plan per company, even if the accounts of that project can still be owned by only one company. * There is now only one method to get the default (or "Project" plan), which is `_get_plan_columns` task-3497653
Peppol invoice handling now uses clearer business statuses, making it easier to see whether invoices are ready, queued, pending, completed, canceled, or in error. Sales journals and customer invoice screens also gain shortcuts and filters to quickly find invoices ready to send, while demo-mode sending and phone number prefill are improved.
Original PR description
# Invoice states Structure `peppol_move_state` according to the following logic: 1. Ready to Send / Invoices confirmed addressed to partners that are Peppol valid and not in one of the other…
# Invoice states Structure `peppol_move_state` according to the following logic: 1. Ready to Send / Invoices confirmed addressed to partners that are Peppol valid and not in one of the other statuses. Default behavior upon posting such an invoice. 2. Queued / In case of asynchronous sending only, the instruction to send has been given via the Send & Print but the cron wasn't run yet. It is still possible to cancel the sending. 3. Pending Reception / Too late to cancel, synchronous or asynchronous sending makes it now impossible to cancel the sending 4. Canceled / Once asked explicitly by the user. It's instant. 5. Done / Upon confirmation or delivery received from the AP 6. Error / Upon confirmation of a notification of error received from the AP # Journal Dashboard Add an action on sale journals to open invoices that are ready to be sent via Peppol # Other improvements - Peppol ready filter in Customer Invoices view - Rename `PEPPOL state` to `Peppol status` for consistency - Pre-fill valid phone numbers in `account_peppol_phone_number` field - Fix async sending in demo mode --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Free self-service orders are now automatically marked as paid when customers are set to pay after each order. This prevents checkout confusion and avoids validation errors when a zero-value order has no payment method selected.
Original PR description
*: pos_online_payment_self_order,pos_restaurant,pos_self_order Previously, when self order was set to "pay after each" and a user ordered an order with a total of $0.00, the order was not automatically set to paid status, as is the case with point_of_sale. Now, when the self order is set to "pay after each" and an order with a total of $0.00 is placed, it will be automatically paid. Minor fixes: - A props has been removed from `ReceiptHeader` because it was causing an error in debug mode. - In point_of_sale, when an order was placed with a total of $0.00, an error was raised during validation because no payment method was selected. Now, before checking this payment method, we first check whether it exists.
This update adds extra information fields used when importing industry-specific modules. It helps Odoo better recognize and handle these modules during import, making module management more complete and reliable.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change makes it simpler to define products and their variants directly in XML data files. It reduces the need for complex technical workarounds when preparing product catalogs, making setup and module data maintenance more reliable.
Original PR description
before this commit: =================== you can not create xml record for product.template and product.product and link them for same product if you like to achieve it you need to do it like ```…
before this commit:
===================
you can not create xml record for product.template and product.product and link them for same product if you like to achieve it you need to do it like
```
<record id="product_template_1" model="product.template">
<field name="name">Box</field>
.
.
.
<field name="list_price">8000.0</field>
</record>
<record id="product_template_attribute_line_1" model="product.template.attribute.line">
<field name="product_tmpl_id" ref="product_template_1"/>
<field name="attribute_id" ref="product_attribute_color"/>
<field name="value_ids" eval="[(6, 0, [ref('product.product_attribute_value_1'), ref('product.product_attribute_value_2')])]"/>
</record>
<function model="ir.model.data" name="_update_xmlids">
<value model="base" eval="[{
'xml_id': 'product.product_template_attribute_value_1',
'record': obj().env.ref('product.product_template_attribute_line_1').product_template_value_ids[0],
'noupdate': True,
}, {
'xml_id': 'product.product_template_attribute_value_2',
'record': obj().env.ref('product.product_template_attribute_line_1').product_template_value_ids[1],
'noupdate': True,
},]"/>
</function>
<function model="ir.model.data" name="_update_xmlids">
<value model="base" eval="[{
'xml_id': 'product.product_product_red',
'record': obj().env.ref('product.product_template_1')._get_variant_for_combination( obj().env.ref('product.product_template_attribute_value_1')),
'noupdate': True,
}, {
'xml_id': 'product.product_product_4b',
'record': obj().env.ref('product.product_template_1')._get_variant_for_combination( obj().env.ref('product.product_template_attribute_value_2')),
'noupdate': True,
}]"/>
</function>
```
after this commit:
==================
you can create product.tempalte and product.product from xml file and link it manully by attribute value
like
```
<record id="product_template_1" model="product.template" context="{'create_product_product': False}">
<field name="name">Box</field>
.
.
.
<field name="list_price">8000.0</field>
</record>
<record id="product_template_attribute_line_1" model="product.template.attribute.line" context="{'create_product_product': False}">
<field name="product_tmpl_id" ref="product_template_1"/>
<field name="attribute_id" ref="product_attribute_color"/>
<field name="value_ids" eval="[(6, 0, [ref('product_attribute_value_blue'), ref('product_attribute_value_red')])]"/>
</record>
<record id="product_template_attribute_value_1" model="product.template.attribute.value">
<field name="attribute_line_id" ref="product_template_attribute_line_1"/>
<field name="product_tmpl_id" ref="product_template_1"/>
<field name="attribute_id" ref="product_attribute_color"/>
<field name="product_attribute_value_id" ref="product_attribute_value_blue"/>
</record>
<record id="product_product_blue" model="product.product">
<field name="product_tmpl_id" ref="software_reseller.product_template_1"/>
.
.
.
<field name="product_template_variant_value_ids" eval="[(6, 0, [ref('product_template_attribute_value_1')])]"/>
</record>
<record id="product_template_attribute_value_2" model="product.template.attribute.value">
<field name="attribute_line_id" ref="product_template_attribute_line_1"/>
<field name="product_tmpl_id" ref="product_template_1"/>
<field name="attribute_id" ref="product_attribute_color"/>
<field name="product_attribute_value_id" ref="product_attribute_value_red"/>
</record>
<record id="product_product_red" model="product.product">
<field name="product_tmpl_id" ref="software_reseller.product_template_1"/>
.
.
.
<field name="product_template_variant_value_ids" eval="[(6, 0, [ref('product_template_attribute_value_2')])]"/>
</record>
```
Description of the issue/feature this PR addresses:
Current behavior before PR:
Desired behavior after PR is merged:
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis update removes confusing internal details from some access-related error reports. It helps support and technical teams see the real cause of a problem faster, without misleading cache-related messages in the traceback.
Original PR description
Currently if a record is not in the cache it raises a `CacheMiss` the handling of which leads to loading the record from the database (or something). If an issue occurs during that loading, because the loading is an `except` scope the cache miss gets linked with the new one via > During handling of the above exception, another exception occurred: This is both noise (the cache miss is not actually relevant) and misleading, because the wording makes it look like an unrelated error occurred during handling. - move the loading of the record out of the `except` to limit the scope of the `KeyError` and avoid "inheriting" it - try to `from None` a few specific errors to remove implicit linkage, as the new error should have all relevant information, the key error / cache miss is just an implementation detail
Product properties now live at the general product template level instead of on individual product variants. This aligns property management with how products are structured, reducing confusion between variant attributes and product-level properties.
Original PR description
Purpose: --------- [This commit]( https://github.com/odoo/odoo/commit/70043822103638f651a521bd2da36cfdfd86245e) added the properties field on the product.product template. However, the product.template model is more suitable to hold these properties as the product.product model already has attributes which are quite similar to properties. Task-3570286
The customer portal order details page is being aligned with subscription flows, making it easier to reuse and extend across sales and subscription-related experiences. It also improves how editable order lines and discounts are handled when customers adjust options, supporting a smoother self-service process.
Original PR description
- Refactor the "details" part of the portal view to unify with subscription as well as add different id "hooks" for inheritance. - Add function to allow line editability to be overriden. - fix: allow the discount computation to be triggered when adding an option line if the option line doesn't already have a discount. task-id : 3186629 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Accounting dashboards now guide users more directly to bills that need payment or are overdue. The updated journal item views, filters, and column layout make it easier to review due dates, discounts, and register payments for multiple items.
Original PR description
Description of the issue/feature this commit addresses: Currently, the payment registration for vendor bills is kinda hard to figure. Noticing which bills are overdue, which require a payment is not…
Description of the issue/feature this commit addresses: Currently, the payment registration for vendor bills is kinda hard to figure. Noticing which bills are overdue, which require a payment is not made so easy by the interface and could be improved. Also there is no way to register a payment for multiple lines at a time which could improve the UX. --- Desired behavior after the commit is merged : On the dashboard, all the buttons in the "Customer Invoices" and "Vendor Bills" have been renamed to remove the "Invoices" and the "Bills" inside them. The buttons "Bills to Pay" and "Late Bills" which now are "To Pay" and "Late" (see above) redirect to the Journal Items with specific filters to show only the necessary lines. The order of the columns in the Journal Items has been changed and their visibility has been changed too. The default filters of the Journal Items when coming from the dashboard buttons has been changed. Payable has been replaced by Purchases. Filters, Group by and Search by options have been added for the Due Date and the Discount Date fields in the Journal Items. --- task-3516496 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Users can now select multiple vendor bill journal items and register payments for them in one flow, reducing manual effort. Aged Payable report amounts are clickable and open the related journal items, making it easier to identify overdue bills and act on them.
Original PR description
Description of the issue/feature this commit addresses: Currently, the payment registration for vendor bills is kinda hard to figure. Noticing which bills are overdue, which require a payment is not made so easy by the interface and could be improved. Also there is no way to register a payment for multiple lines at a time which could improve the UX. --- Desired behavior after the commit is merged : This commit makes it now possible when in the Journal Items to select multiple lines and register a payment for them which would create one payment per line selected. When inside the Aged Payable report, all amounts are clickables and send the user to the Journal Items with the proper filter to see what lines are part of that amount. When in the Journal Items, the "Create Asset" option was available in two places. It has been removed from the drop-down "Actions" button and kept in the header. --- task-3516496
Customers can now manage more subscription actions directly from the portal, including renewing, changing quantities, and closing subscriptions when allowed by the business. The subscription portal is also aligned with the sales portal experience, making access and navigation more consistent.
Original PR description
- Inherit portal view from sales: Make the subscription portal_view inherit from sales instead
of reimplementing from scratch.
- self-service portal:
+ Add self-service option to the subscription portal. 3 Settings can be set up on the sale order template:
+ user_extend : Allow the user to create renewal order for his subscription
+ user_quantity : Allow the user to modify the line quantity of subscription before the first invoice or create an upsell if the subscription has already been invoiced.
+ user_closalble : Allow the user to close the subscription.
- Make Pause pause again!
- Change the url of subscription from `/my/subscription/<access_token>` to `/my/subscriptions?access_token=<access_token>`
- Cleanup
3186629Users now see a specific message when a Codabox connection cannot be recreated because consent still exists on Codabox's platform. This helps them understand that they must manually revoke the consent in Codabox before trying again, instead of seeing a generic error.
Original PR description
Steps to reproduce: - Create a first connection with Fidu Vat and Company Vat - Revoke it - It is correctly deleted from IAP - However the consent still exists on Codabox. - A generic error was presented to the user Now we display a specific error message to the user so that it can revoke its consent from Codabox's platform. Codabox does not provide an API for us to do it for the user, it must do it manually.
The timesheet app now includes billing time targets for most demo employees, so the billing leaderboard displays meaningful sample data. The update also improves the leaderboard header layout and places related settings in the correct category, making demos and configuration clearer.
Original PR description
This PR adds a billing time target for most demo employees, as without it, they don't appear in the billing leaderboard. It also fixes a small visual bug related to the leaderboard: the timer header doesn't have a fixed height when the leaderboard is activated depending on whether or not there is data for it. Task-3570491
Deferred reports no longer show comparison options that can create misleading, non-contiguous period results. This helps users avoid confusing totals and makes deferred report figures easier to interpret.
Original PR description
We hide these comparison filters because in the case of deferred, we want to work with contiguous periods. Comparing with non-contiguous periods may result in weird behaviours such as: 1. Non-contiguous period Total = 1200 to defer from 1/1 to 12/31 Reference period = Sept Comparison with Feb | Total | Before | Feb | Sept | Later | |-------|--------|-----|------|-------| | 1200 | 100 | 100 | 100 | 300 | As we can see, the sum of the columns doesn't add up to the total column 2. Overlap periods Total = 1200 to defer from 1/1 to 12/31 Reference period = Sept Comparison with Aug -> Oct | Total | Before | Aug -> Oct | Sept | Later | |-------|--------|------------|------|-------| | 1200 | 700 | 300 | 100 | 300 | As we can see, the sum of the columns doesn't add up to the total column Therefore we hide these filters as they will lead to confusing values task-id 3566725
Brazilian AvaTax requests now send each line's unit price and quantity in addition to the existing tax information. This prepares the integration for future electronic invoicing needs while keeping the current tax calculation behavior unchanged.
Original PR description
Although not strictly needed for tax calculation, it doesn't hurt and will be necessary for EDI later. Since adding it cleanly requires a change in function signature we already do it now. This decreases the likelihood of somebody relying on this exact function signature in other code.
The spacing between appointment details and table visuals on restaurant floor plans has been reduced. This makes the point-of-sale floor view cleaner and easier for staff to read at a glance.
Original PR description
There used to be a big gap between the appointment information and the table on the pos_restaurant floor_plan. We've now reduced this gap.
Recruitment resume scanning now recognizes skills made up of multiple words as complete phrases instead of splitting them into separate terms. This improves candidate profile accuracy and helps recruiters better identify relevant qualifications from OCR results.
Original PR description
Current behavior: skills with more than one word were not detected and it would search for each word in the skill as a separate skill Improved behavior: skills are now checked as a whole in the ocr results regardless of how many words described the skill Task: https://www.odoo.com/web#id=3563681&cids=1&menu_id=4720&action=333&active_id=2068&model=project.task&view_type=form
This update aligns several business features with improved analytic accounting behavior across companies. It helps reporting, budgets, timesheets, manufacturing, subscriptions, and inter-company flows use analytic accounts more consistently after core accounting changes.
Original PR description
Adapt for the changes in community, mostly in tests: * remove `company_id` from `account.analytic.plan` * read the right fields for accounts on `account.analytic.line` opw-3497653
This update removes older appraisal survey views and records that were only needed during a previous backport. It keeps the appraisal survey setup cleaner and easier to maintain without changing day-to-day business workflows.
Original PR description
Following this backport https://github.com/odoo/enterprise/pull/45465 , we cleanup in this PR the views and records that had to be added in stable and remove the old ones
Customers can now book more than one appointment for the same time slot when needed. This supports real-life cases like reserving appointments for multiple family members, booking several courts, or adding extra seats to an existing reservation.
Original PR description
Allow users to book multiple appointments at the same timeslot. Examples: - I book an appointment to the hairdresser for my 2 sons - I organize my own Tennis tournament and need a few courts - I already booked a table but am trying to book another one for some extra friends ... Task-3512250
The customer portal interface has been redesigned to look fresher and align better with the updated Odoo backend and website experience. The update adds consistent pictograms and improves layouts and responsiveness across portal pages for appointments, helpdesk, documents, subscriptions, sign, knowledge, and field service flows.
Original PR description
This PR introduces a general redesign of the Portal user interface, in order to give it that fresh and sleek vibe we also introduced in the backend. For the full list of the changes, please have a look at the linked pull request below. Community: - https://github.com/odoo/odoo/pull/138077 task-3046004 ---- # Main key changes ### Introducing pictograms As on the linked pull request, we introduce pictograms to illustrate concepts that are related to a module without being directly the module itself. These pictograms are already used accross the backend and other applications, which improves the consistency. ### Design & responsiveness updates + SCSS file revamp As mentioned on the other pull request, this PR introduces several changes to the Portal UI and layout. We also cleaned our SCSS files to turn these custom declarations into BS and Odoo classes. For a detailed list and explanation of all the changes, please have a look at the linked pull request.
This change removes an outdated error-handling helper and updates affected areas to use the standard approach for handling failed operations. It helps keep the platform easier to maintain while preserving expected behavior for server and connection issues.
Original PR description
This commit removes the promise extension which added the function `guardedCatch`. It was used to filter server and connection errors from javascript errors. Instead of using guardedCatch, we should use catch and check if the reason is a server or connection error if needed and re-throw the error if it's not handled. task: 3439226 Community: https://github.com/odoo/odoo/pull/137702
The wording of two Knowledge app buttons has been updated to make their actions clearer for users. This minor improvement helps users better understand where content will be moved when organizing articles.
Original PR description
This PR changes the wording of the buttons listed below: -Move to Workspace -Move to Private Task-3390780
Journal item matching numbers are now shown with color-coded tags, making reconciled entries easier to scan and distinguish. The update also aligns accounting report navigation and journal item behavior with recent usability improvements.
Original PR description
This commit contains some misc improvements based on the 16.0 overall improvements regarding navigation and Journal Items Matching numbers are now color-coded in the Journal Items view to improve readability In Journal Items view, if the matching number cell have a value, then a color tag will be assigned depending on the value in that cell community-PR: odoo/odoo#138140 enterprise-PR: odoo/enterprise#48980 task-id: 3530458
Task dependency links are now visible in broader task planning views such as My Tasks and All Tasks, not only within an individual project. Users also get clearer visual feedback when dependencies cannot be created because a target project has dependency tracking disabled, making planning across projects easier and less error-prone.
Original PR description
impacted modules: - web_gantt - project_enterprise Currently, the dependencies between tasks is only displayed in the Gantt view of a given project of the option 'Task dependency' is enabled on that project. This PR extends the display of task dependencies to the views "My Tasks" and "All Tasks". Implemented functionalities: - display the dependencies arrows and connectors in the 'my tasks' menu - display a red fa-ban icon if the user tries to connect a task to another one that belongs to a project on which the feature is disabled - hide the connectors on the tasks that are in a project on which the feature is disabled On top of that some improvements are also proposed in web_gantt. When a pill or a connector is dragged in the Gantt view: - When a pill is dragged: handles and connector creators of hovered pills are not displayed. - When a connector is dragged: handles and of hovered pills are not displayed. task-3092632
Project smart scheduling now handles tasks even when no hours were planned, reducing manual adjustment and making batch scheduling across projects more reliable. Time off warnings are also clearer when multiple assignees are unavailable for the same dates, and related leave detection has been corrected so requested time off is not missed.
Original PR description
- Before this commit : - When a task has mutliple assignees and that those assignees have planned/requested holidays during the same period, the warning message repeats itself : "Mitchell Admin has…
- Before this commit :
- When a task has mutliple assignees and that those assignees have
planned/requested holidays during the same period, the warning
message repeats itself : "Mitchell Admin has requested time off
from the 06/13/2023 to the 06/16/2023. Marc Demo has requested time
off from the 06/13/2023 to the 06/16/2023.". This is a bit heavy to
read and could be simplified when the holdiays planned dates are the
same.
- When the user uses the magnifier button in the gantt
view of project to schedule non-scheduled tasks, only the tasks with
planned hours are smart scheduled. The tasks without planned hours
are simply put the same day at the same time.
- After this commit :
- When a task has mutliple assignees and that those assignees have
planned/requested holidays during the same period, the message will
be : "Mitchell Admin, Marc Demo have requested time off from the
06/13/2023 to the 06/16/2023.
- Smart scheduling takes into account the non-planned hours tasks.
It does so by scheduling first all the selected tasks with planned
hours, and then schedules all the tasks without planned hours by
putting fictive planned hours for these tasks that depend on the
scale of the gantt view. The confimation wizard that appeared when
the scheduled tasks were outside of the gantt view scale has been
removed and replaced by a toast notification.
####### Precisons ######
- The smart scheduling now works even when selecting multiple tasks
(batching) EVEN if they belong to different projects. The tasks
are scheduled one projects after another, prioritizing the tasks
with allocated or remaining hours. For example, if we have project A
with task AA (allocated_hours = 2h) and task AB (allocated_hours
= 0h) and we have project B with task BA (allocated_hours = 3h) and
task BB (allocated hours = 0h), then the scheduling priority order
will be AA => BA => AB => BB.
- The precision in "week" and "month" scale is the one defined by
default (half-day) or the one selected in the studio.
- The precision in "day" scale is always a half-day
- The precision in "year" scale is always one month
- The scheduling of non-allocated hours tasks should follow the
following behaviour :
- A half day is always concening the working hours between
00:00:00 AM and 12:00:00 AM OR 12:00:00 AM and 12:00:00 PM.
The working hours inside those intervals don't matter for the
scheduling of non-allocated hours tasks. The task is also
planned only when the working hours in the half-day are fully
available. For example, if we are in "week" scale and the
precision is "half-day" then the task will be planned at the
first half day fully available (without conflicts with other
tasks).
- Another example in "year" scale : we trigger the smart
scheduling for a non-allocated hours task A in march. There is
another task B already planned until the 10th of march. Task A
will then be planned at the next full free interval => April.
task-3330290Knowledge templates can now include dynamic elements such as databases and links to related articles, so teams can start from more realistic and useful examples. This makes it easier for users to explore advanced Knowledge features without manually rebuilding connected content after applying a template.
Original PR description
# Purpose Currently, the templates of Knowledge only contain static HTML with text, images, tables, lists, etc. Now, we would like to include templates featuring databases and article links. It will…
# Purpose Currently, the templates of Knowledge only contain static HTML with text, images, tables, lists, etc. Now, we would like to include templates featuring databases and article links. It will then be possible to showcase more advanced features of Knowledge. Unfortunately, these elements refer to an article and require an article id to work properly. For the article links, for instance, we need to provide the id of the articles we want to open. When applying a template, the system will generate new articles with new ids. To ensure that the links will redirect the user to the right article, we have to update the ids stored in the document and provide the ids of the newly generated articles. As the templates are static and the ids are dynamic, we cannot properly integrate those elements in a template. This commit aims to eliminate that limitation by providing a magic `ref` function that people can use in their templates to refer to an external record. People will then be able to easily integrate databases and article links in their templates. This commit will also introduce new templates containing databases and article links. People can then use those templates to try out the more advanced features of Knowledge and understand the power of Knowledge with real world examples. ## Technical aspects To streamline our code base, we will merge the model `knowledge.article` with `knowledge.article.template`. That way, the articles and the templates will always be consistent. By merging the two models, we will not have to duplicate the logic and the views for the template preview. It will also not be necessary to: transform the favorites set on the embedded views, update the default values set in the context, etc. when turning a template into an article. During the development, we considered different approaches to tackle the existing limitations of the static templates: 1. We considered making the ids optional by introducing fallback mechanisms. The idea was to use the id of the active record when no id was provided. This would have allowed the integration of embedded view of article items without providing any id. However, the approach was very limited: it was not possible to list the article items of another article or insert an article link. 2. We considered patching the generated template with `lxml` to update the ids stored in the document. The solution didn't work very well: In some cases, it was not possible to know if the ids should be transformed or not as the ids could refer to another model. 3. We considered turning the static templates into dynamic templates using `QWeb`. The solution was checking all the boxes but we preferred not to allow non-admin users creating templates and using `QWeb` because the rendering engine relies on the `safe_eval` function which can potentially have undiscovered security flaws. To not take any risk, we prefer not to use that approach. For all these reasons, we prefer including a magic `ref` function in the templates and post-process the template to replace the `ref` function call with the appropriate id. With that approach, people can explicitly tell which id should be dynamically transformed. task-3334717
The website help center has been refreshed with updated icons and a responsive card layout. This makes support resources easier to browse across desktop and mobile devices, improving the customer self-service experience.
Original PR description
Design the new website helpdesk page with the new icons and a responsive card-layout. task-3486276 | Before | After | | -- | -- | |  |  |
The Knowledge cover image selection dialog now fits the updated media experience with a consistent height and clearer loading controls. Users can more easily browse available cover images, see when more images can be loaded, and know when all options have been shown.
Original PR description
In PR [1], the media dialog has been improved in order to make the UX better. This commit adapts the `KnowledgeCoverDialog`, in order to be compatible with the new media dialog. More precisely, these adaptations are the following: - the dialog height is now fixed and has the same size as when it is fully filled by images -> addition of the `h-100` class. - there is now a small footer displaying either an arrow to scroll, the "Load More" button or the "All images have been loaded" text. In order for this button to be updated, we need a scroll listener on the modal body and therefore we need the reference to the modal in `KnowledgeCoverSelector` (which extends `ImageSelector` and so `FileSelector`, which uses this ref)-> this commit adds this ref. [1]: https://github.com/odoo/odoo/pull/135875 task-3441587
Odoo no longer uses separate down payment products or related configuration settings, reducing setup complexity and the risk of incorrect product handling. Down payments in Sales and Point of Sale now follow the same tax and accounting logic, with lines split by tax and account combination for more accurate financial reporting.
Original PR description
- Removes down payment products and it's related settings. - Previously one down payment was created per tax(es), now it's one dp per tax(es)/account combo. - Align POS down payment behavior on SALE Community: https://github.com/odoo/odoo/pull/128421 Upgrade: https://github.com/odoo/upgrade/pull/5317 Task 3254314
Administrators now have dedicated permissions to delete approval requests, rather than relying on rules intended for approval officers. This makes access management clearer and easier to adjust in the future without affecting other roles.
Original PR description
I created basic rights for administrator to gives them permissions to delete approval requests (I also duplicate the other rules so if in the future if we want to change one of them it will be possible without affecting the admin) Before that it was limited to the domain for officer
Rental teams can now create delivery and return transfers directly from rental orders when the new rental stock setting is enabled. This improves operational tracking for rentals, including multi-step logistics, serial-numbered items, scheduled dates, and rental kits.
Original PR description
SALE_STOCK_RENTING: It will be possible to create pickings from rental orders by activating a new setting in the General Settings of Rental. Works with: - 1-2-3 steps of delivery/reception - serial numbers - rental dates: they will be used for the scheduled dates of the pickings SALE_MRP_RENTING: New module to correctly compute the qty_delivered and the qty_returned on rental order lines for kit products as well as manage the rewriting of ordered quantities on rental orders. see odoo/odoo#135425 task #3109952
Knowledge templates can now generate richer workspaces with article links, indexes, and embedded kanban, list, or calendar views that adapt when the template is applied. This makes templates more useful for repeatable business processes because they can automatically connect the right articles and views instead of relying on fixed content.
Original PR description
Currently, the templates of Knowledge will only contain static HTML with text, images, tables, lists, etc. Now, we would like to include more advanced templates containing article links, index…
Currently, the templates of Knowledge will only contain static HTML with text, images, tables, lists, etc. Now, we would like to include more advanced templates containing article links, index structures, kanban/list views of article items, etc. Unfortunately, there are a few limitations with static templates that prevent us from integrating those blocks: 1. To load a kanban or a list view of article items, we need to encode the id of the parent article in the body of the template. As the ids we need to provide are dynamics, we can not hardcode them directly in the body of the article. 2. For the embedded views of article items, we may define custom favorites that will also be encoded in the body of the article. When applying a template to an article, we will have to adapt those favorites to make them compatible with the new model. 3. To create links between articles, we will also need the encode the id of the target article in the body of the template. There can also be cyclical dependencies between articles which makes the creation of those articles difficult. ## Solution This PR will turn the static templates of Knowledge into dynamic templates using QWeb. The templates will now have a rendering context allowing people to define variables. The system will also expose functions that people can use to automatically convert id and fields based on the context being used. task-3334717
Knowledge templates can now include dynamic content such as preconfigured lists or kanban views tied to the article being created. This makes templates more useful and smoother to preview, helping users start from richer ready-made structures.
Original PR description
Currently, the templates of Knowledge will only contain static html with text, images, tables, lists, etc. Now, we would like to integrate blocks that depend on a record. More specifically, we would…
Currently, the templates of Knowledge will only contain static html with text, images, tables, lists, etc. Now, we would like to integrate blocks that depend on a record. More specifically, we would like to include pre-configured templates containing a kanban or a list view of article items. To embed a kanban or list view of article items, we need to have a reference to an article (i.e: an id). The embedded view will then display all article items of that article. The issue is that, most of the time, the id we need to provide is the id of the article itself and that article may not exist yet. The other issue is that the article items we show in the preview of the templates may also not exist. Those articles will only be created when the user applies the template. To solve these issues, we need to find a way to make the templates dynamic. # Solution 1. Create a custom "behavior" for the article items. We will then be able to customize those blocks without introducing specific code in the generic component. 2. Make the article id of the embedded views optional: In the custom behavior we created, we will assign the `active_id` to the active record. We will then be able to specify a kanban or a list view in the data files. 3. Customize the HTML field of the template gallery and load variants of the behaviors: We will then be able to customize the display of each block for the preview. For the kanban and list view of article items, we will load the record of `knowledge.article.template` instead of `knowledge.article`. task-3334717
Receipts are now printed automatically only when customers use self-ordering in kiosk mode. This avoids unnecessary receipt generation on mobile self-ordering and prevents the confirmation screen from displaying incorrectly.
Original PR description
Before, a receipt was automatically generated in the mobile self order and the confirmation screen would glitch when it was generated. Now this receipt is only generated in kiosk mode and the confirmation screen no longer glitches due to a hidden overflow.
Timesheets now automatically clear an assigned task if it no longer belongs to the selected project, preventing inconsistent reporting. Some timesheet list columns are also hidden correctly, improving screen clarity for users working with timesheets and sales-linked timesheets.
This fixes an issue where input fields inside popups did not automatically receive focus as expected. It also removes duplicate handling in the messaging area, making the behavior more consistent across Odoo.
Original PR description
Currently, when there is an input within a popover, the AutoFocus hook is not working well due to the check for activeElement. The fix is to provide a function parameter to check the situation rather than put it inside the hook thus, it can be used as a generic hook as it was. Also, remove the duplicate useAutofocus in `mail` code. Related PR: https://github.com/odoo/odoo/pull/139124 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A display issue was fixed so empty HTML content is treated correctly when deciding whether to show or hide elements on a page. This prevents blank alerts from appearing in forms, improving clarity for users.
Original PR description
Because `Markup("")` is not considered as falsy, computed and not stored HTML field used in invisible attribute on views were not rendered correctly.
Indeed, if a computed (and not stored) html field was used as a condition for the display of an alert. Then a void alert was displayed on the view.
Follow-up of odoo/odoo#130479Disabled input fields now use a background color that matches the updated website design. Placeholder text has also been darkened to improve readability on lighter backgrounds, creating a more consistent and accessible editing experience.
Original PR description
Before this commit, disabled inputs background color was set to Bootstrap default value (`$gray-200`). Since the input background color is now based on `o-color-3`, it was creating inconsistencies. This commit fixes that issue. This commit also darkens the placeholder color as it was not readable enough on the new light background. task-3565420 part-of-task-3097005 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The mailing form no longer shows an extra duplicate domain field. This keeps the email campaign setup screen cleaner and reduces confusion for users configuring mailing recipients.
Original PR description
Remove the extra mailing_domain in the form view. task-3562293
Fixed an issue where quiz content in online courses could show unwanted HTML text to learners. This improves the course-taking experience by ensuring quiz text appears as intended.
Original PR description
**How to reproduce:** 1. Open any course having a quiz. 2. Select quiz content. -> In the quiz template we can see that the html content is not sanitized. **Technical:** I think the issue arises after this commit https://github.com/odoo/odoo/commit/0d7acf60b4cca84a8c700edd97af8c4de6b78010 **After this PR:** Now t-esc is deprecated and the HTML text is not sanitized in the template so instead of t-esc we are using t-out. Task-3555159
Spreadsheet dashboards now check that chart links point to a menu that can actually open an action. If a user clicks a chart linked to an incomplete menu, they see a clear warning instead of an error screen.
Original PR description
If a chart was linked to an odoo menu, but the odoo menu didn't have an action, the user would get a traceback when clicking on the chart. This commit: - Improves dashboard validation. Now we test that the menu is linked to an action, in addition to testing that the menu exists - Send a "danger" notification when the user clicks on a chart with a menu without an action linked to it, rather than a traceback Task: [3563450](https://www.odoo.com/web#id=3563450&cids=1&menu_id=4720&action=333&active_id=2328&model=project.task&view_type=form) Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes several issues in the Italian electronic invoicing workflow, including warning messages, sending status checks, XML export options, and labels. Users should see clearer, more reliable choices when sending, printing, or exporting invoices.
Original PR description
Several fixes after test: - `l10n_it_edi_warning_message` 's compute was wrong - `is_being_sent` allows for the Check Sending button to show, it just reloads the page - now the XML export button is only readonly if there's PDF and no XML. In the other cases, it can be checked. It's checked and readonly if all XMLs are generated. - some label fixin'
The Print Labels button now appears only for products where labels are useful, such as storable, consumable, and combo products. This avoids confusion by hiding the option for items like event tickets, booths, or courses where label printing does not apply.
Original PR description
Before this commit, the "Print Labels" button shows for all products except services. However, this button does not make sense for event_booth, event_ticket, course, ... products So we only show this button for storable, consumable and combo products. Task-3390587
The Peppol invoicing settings page now avoids showing duplicate enablement checkboxes after Peppol is installed. This makes configuration clearer for users and prevents required fields from blocking general settings saves before registration validation.
Original PR description
The res config settings view contains block in which peppol can be enabled. Enabling peppol using the checkbox inside the block installs the peppol module. Once installed, the "Use Peppol invoicing"…
The res config settings view contains block in which peppol can be enabled. Enabling peppol using the checkbox inside the block installs the peppol module. Once installed, the "Use Peppol invoicing" option is available, which is itself a checkbox, nested inside of the previous one. This gives the appearance of duplication, and in addition it's not relevant at this point to provide the user the option to uninstall peppol from this menu. The solution is to replace this content in the view when peppol is installed, such that the peppol options are always displayed, and the enable peppol checkbox is replaced. For this reason, references to the "is_account_peppol_participant" have been removed, as its use was primarily for hiding/displaying these settings. The field is no longer useful, and should, references to be removed in a later Paccount_R have been removed, as its use was primarily forhiding/displaying these settings. The field is no longer useful, and should be removed in a later upgrade script. Before:  After:  task-id: none
Images added to Odoo spreadsheets now export correctly when saving or sharing files in Excel format. This prevents missing images in downloaded .xlsx files and makes spreadsheet exports more reliable for users.
Original PR description
## Task Description o-spreadsheet now allows to insert images in a spreadsheet, and we also allow to export them inside .xlsx file. However, while this works as intended in a standalone o-spreadsheet server, it doens't work correctly in Odoo as the data of the image are not found while we try ton convert the spreadsheet to an xlsx file. This PR aims to simplify the request made to get the binary data of the image file. ## Related task -Task: 3524473 -X-original-commit: 301a98c Forward-Port-Of: odoo/enterprise#49066 Forward-Port-Of: odoo/enterprise#47928 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update tidies the invoice Send & Print process and prevents emails from being sent in bulk when no email template is configured. It also avoids carrying send-and-print settings onto duplicated invoices, reducing the risk of unintended customer communications.
Original PR description
Few things: - move files under the right folder - clean computes to avoid unnecessary recomputations - remove useless param of get_wizard_values - copy=False on send_and_print_values - prevent sending email if no mail_template set in multi mode
This fixes an issue in the Argentinian localization where opening a customer or vendor contact form could fail because a hidden filter condition was evaluated incorrectly. Users can now access partner records normally without encountering an error.
Original PR description
It seems that the invisible is not working on filter and so the fiscal country_code cannot be evaluated which causes a Traceback when trying to access the res_partner form view. task: 3270458 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a small issue in the Mail app by removing repeated autofocus handling in the message search panel. The change helps keep the interface behavior consistent and reduces the chance of minor focus-related glitches for users.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This change fixes an issue that prevented users from saving their own profile when certain attendance or fleet-related fields were present but restricted to manager groups. It also adjusts demo data so demo users no longer receive unnecessary manager-level rights, keeping sample environments closer to real business usage.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update adjusts demo data and access settings across several business apps so demo users have more appropriate permissions. It also hides a point-of-sale preparation display menu from users who cannot use it, preventing an access error and making the demo experience smoother.
This fixes the automatic setup of the external tax connection for sales. It helps ensure the right supporting component is installed when needed, reducing manual setup issues for businesses using external tax services.
This fixes how Brazilian AvaTax submissions handle credit and debit notes by sending the right operation details and linking them to the original invoice. It helps ensure tax amounts are calculated correctly for returns and adjustments, reducing errors in Brazilian electronic invoicing workflows.
Original PR description
The buttons and triggers already are enabled on these, but we forgot to specify some API parameters. This specifies the operationType in the header, instead of on each line. The operationType (standardSales, salesReturn or amountComplementary) is determined based on the move_type and debit_origin_id. invoiceRefs is specified to refer to the original invoice and description is required for both. Finally, we need to invert the tax amounts for returns since Avatax doesn't do that for us. This is based on odoo/enterprise#49498 for Odoo 16 but includes debit note support as well since l10n_br indirectly depends on account_debit_note in Odoo 17. It also adds the default operation type and invoice refs directly in the mixin to avoid having to create an l10n_br_avatax_sale module like in Odoo 16.
Belgian Codabox users can now revoke a connection even after losing their access token, as long as company consent details are still present. Bank statement syncing also starts from a more accurate date, reducing the risk of missing or duplicating imported financial data, with clearer handling of skipped bank accounts.
Original PR description
## This PR improves l10n_be_codabox by: **[FIX] l10n_be_codabox: allow Revoke button if the fidu_vat field is filled** Currently, if the user loses its IAP access token, it will not be able to delete…
## This PR improves l10n_be_codabox by: **[FIX] l10n_be_codabox: allow Revoke button if the fidu_vat field is filled** Currently, if the user loses its IAP access token, it will not be able to delete its IAP connection even if it has removed its consent via the myCodabox platform. This commit allows the Revoke button to be shown if the fidu_vat input field is non-empty, so that even if the user is not connected, we can still revoke the IAP connection **[FIX] l10n_be_codabox: computation of from_date to send to Codabox** The from_date was incorrectly computed, it should be computed as follows: - For each Codabox journal, retrieve the date of the most recent bank statement - If there is none, retrieve the date of the most recent bank statement line - If there is none, we'll use from_date = 3 months ago - The from_date we'll use with Codabox will be the most ancient dates from these dates A small improvement is also introduced when we have bank accounts returned by Codabox but that do not exist in the DB. Now, instead of showing the logger info every time, we'll display only one message for all skipped bank accounts.
This fix prevents a Studio automated tour from failing when the Attendance app is not installed. It removes an irrelevant check so internal validation is more stable without changing user-facing features.
Original PR description
Since [1], the `/hr_attendance/attendance_user_data` route is asserted in a studio tour. This route is not called when `hr_attendance` is not installed making this tour fail in this case. This commit excludes this route from the assertions since it is not relevant. [1]: https://github.com/odoo/enterprise/pull/47384 fixes runbot-27902
Timesheets linked to helpdesk tickets now better keep the correct project information when tickets or projects are changed. The update also prevents misleading ticket fields from appearing in the timer header and makes certain timesheet hours read-only when viewed from helpdesk team statistics, reducing accidental edits.
Financial reports now keep total lines on the expected page when using the Total Below option. This prevents report layouts from adding unwanted page breaks inherited from section lines, making printed reports cleaner and more predictable.
Original PR description
By activating the "Total Below" section feature, the total line will adopt the attributes of the section. In the report settings, we have the option to define a page break attribute for a line. However, if the section's line possesses the page break attribute, this causes the total line to also have it, which is not the desired behavior. This commit aims to separate the "Total Below" sections from the "print_on_new_page" field. task: 3566903
VoIP calls that remain incorrectly marked as calling or ongoing can now still be displayed instead of causing an error. This helps users recover visibility into call records after interruptions such as power outages or unexpected disconnections.
Original PR description
If for some reason (e.g. a power outage in the middle of a call) the call is never properly terminated, it may be stuck in the “calling” or “ongoing” state. Prior to this commit, trying to display a call that was stuck in the wrong state would cause a crash. After this commit, the call will be displayed correctly, even if it is in an improper state.
Original PR description
pos*: l10n_es_pos, point_of_sale, pos_hr, pos_loyalty, pos_online_payment, pos_online_payment_self_order, pos_restaurant, pos_sale, pos_self_order In this commit we refactor all the pos tours.…
pos*: l10n_es_pos, point_of_sale, pos_hr, pos_loyalty, pos_online_payment,
pos_online_payment_self_order, pos_restaurant, pos_sale, pos_self_order
In this commit we refactor all the pos tours.
Changes:
- Removed the `startSteps`, `getSteps` functions as they were
no longer serving a purpose. We now simply put the tours steps
in the array returned by the function given to `steps`. We
apply `flat()` to this array in order to be able to provide both
single steps and arrays containing multiple steps;
- removed the classes from the tours. Now each helper function
is simply exported from it's file and is consumed as `import * as myHelpers`;
- removed the `do`, `check`, `exec` subpaths as they were not providing
a clearer api. The functions themselves already have descriptive names.
( writing `ProductScreen.do.clickHomeCategory()` is not clearer than
`ProductScreen.clickHomeCategory()` )
- formatted all files.
Task: 3565443
https://github.com/odoo/enterprise/pull/49313
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis change removes an outdated internal way of fetching display names in the web interface and updates related fields to use the newer approach. It helps keep the web client aligned with recent platform changes, reducing maintenance risk without changing normal user workflows.
Original PR description
This commit removes all usages of the nameGet method of the orm service following changes introduced by https://github.com/odoo/odoo/pull/122085 task-3377209
This update reorganizes the Mexican electronic invoicing Send & Print setup so related files are in the right place and easier to maintain. It also reduces unnecessary background calculations, which can improve reliability and keep the invoicing workflow cleaner without changing the user experience.
Original PR description
- move files to the correct folder - clean computes to avoid unnecessary computation
This update streamlines how bank reconciliation screens apply table highlighting styles. It reduces unnecessary generated styling code, which helps keep the interface code lighter without changing user workflows.
Original PR description
´extends´ generates a lot of css rules. So in this commit, we remove it by replacing it by adding the class directly on the node.
This update aligns the Barcode inventory picking flow with recent stock quantity changes, preserving the familiar picking behavior for warehouse operators. It also updates related delivery, helpdesk, repair, and field service stock processes so they continue working with the new inventory structure.
Original PR description
Follow the refactor of the picking. Since the `stock.move.line` has now only one quantity field, here is the idea to keep the (almost) same behavior in the Barcode App than before the refactor: - Have a non-stored field `qty_done`: equals to 0 if not picked, equals to the `quantity` field otherwise. When the user writes on it, it will write on the `quantity` field and marks the line as picked; - As `reserved_uom_qty` doesn't exist anymore, we make it equals to `quantity` at the creation of the line in the Barcode App to be able to know the line's reservation. That means once the operation is closed, this info is lost. COM PR: odoo/odoo#137864 task: fp-request
This update reorganizes internal automated test steps for several point-of-sale related apps, making them simpler and easier for developers to maintain. It does not change business features or user workflows, but helps reduce maintenance effort and supports more reliable future updates.
Original PR description
pos*: l10n_mx_edi_pos, pos_iot, pos_preparation_display,
pos_restaurant_preparation_display, pos_sale_stock_renting
In this commit we refactor all the pos tours.
Changes:
- Removed the `startSteps`, `getSteps` functions as they were
no longer serving a purpose. We now simply put the tours steps
in the array returned by the function given to `steps`. We
apply `flat()` to this array in order to be able to provide both
single steps and arrays containing multiple steps;
- removed the classes from the tours. Now each helper function
is simply exported from it's file and is consumed as `import * as myHelpers`;
- removed the `do`, `check`, `exec` subpaths as they were not providing
a clearer api. The functions themselves already have descriptive names.
( writing `ProductScreen.do.clickHomeCategory()` is not clearer than
`ProductScreen.clickHomeCategory()` )
- formatted all files.
Task: 3565443
https://github.com/odoo/odoo/pull/139317Rental sales now includes the useful scheduling code that was previously kept in a separate module, reducing internal complexity. This keeps rental pricing and recurring rental behavior available while removing an unused dependency, with no major business process change expected.
Original PR description
Since sale_subscription does not inherit anymore from sale_temporal (https://github.com/odoo/enterprise/pull/46621), the latter became useless. This PR moves the useful code from sale_temporal to sale_renting, and drops sale_temporal. task-3527947 See also: - https://github.com/odoo/upgrade/pull/5265
Embedded views in Knowledge now store less extra setup information and add needed details only when opened. This keeps saved content cleaner while preserving the same user experience for embedded views.
Original PR description
When inserting an embedded view, the key `knowledge_embedded_view_framework` is saved in the context of the action that is encoded and saved in the HTML tag that will be recognized by the editor as an embedded view. Instead of saving that key, the embedded view behavior will now dynamically add the id of the embedded view in the context of the action before executing it. We can then determine whether the view is an embedded view by checking whether the id is defined. We therefore no longer need to add a special key in the context and save it in the HTML tag to distinguish the embedded view from the standard views. task-3334536
This update cleans up how Documents, Helpdesk, and Quality Control handle incoming and outgoing message data. It reduces the risk of errors when message details are missing or inconsistent, making communication-related workflows more reliable and easier to maintain.
Original PR description
Task ID-2477479 (identity task) Followup of Task ID-2070632 (channel members main task) Followup of Task ID-2419762 (channel members followup task) COM PR odoo/odoo#67395 ENT PR odoo/enterprise#17617 UPG BR odoo/upgrade#2382
When the debug manager was migrated to OWL on ce559992, both `title` and `aria-label` attributes were removed from the button that opens the developer tools. However, the `aria-label` is actually required, because such button doesn't contain any text, just the bug icon. This commit restores (only) the `aria-label`text. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#138591 Forward-Port-Of: odoo/odoo#138579
Original PR description
When the debug manager was migrated to OWL on ce559992, both `title` and `aria-label` attributes were removed from the button that opens the developer tools. However, the `aria-label` is actually required, because such button doesn't contain any text, just the bug icon. This commit restores (only) the `aria-label`text. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#138591 Forward-Port-Of: odoo/odoo#138579
If you assign a different payment account per payment method line corresponding to the same journal (but different payment methods), The method that returns the possible liquidity accounts returns a tuple instead of a recordset, and the comparison is done with the operator `in`, so if any of the elements of the tuple is a recordset of more than one record, the match is not happening, which may be the case for `self.journal_id.inbound_payment_method_line_ids.payment_account_id` or `self.journa
Original PR description
If you assign a different payment account per payment method line corresponding to the same journal (but different payment methods), The method that returns the possible liquidity accounts returns a tuple instead of a recordset, and the comparison is done with the operator `in`, so if any of the elements of the tuple is a recordset of more than one record, the match is not happening, which may be the case for `self.journal_id.inbound_payment_method_line_ids.payment_account_id` or `self.journal_id.outbound_payment_method_line_ids.payment_account_id`. The solution is to return a recordset instead. @Tecnativa TT43014 Forward-Port-Of: odoo/odoo#120847
Change the disposition in Kanban card. Changes the behavior of the image in the kanban card: if a user no longer has an employee's image then the user image is taken. If no image; it's the avatar image. task : 3527398 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#137513
Original PR description
Change the disposition in Kanban card. Changes the behavior of the image in the kanban card: if a user no longer has an employee's image then the user image is taken. If no image; it's the avatar image. task : 3527398 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#137513
When the user tries to modify the view with an invalid xpath expression, an XPathSyntaxError traceback will appear. Steps to produce: - Install the Accounting module. - Settings > Technical > UI > Views > Open any view - Invalidate `expr` syntax and try to save, thus an error will be generated. Error: XPathSyntaxError: Invalid expression See traceback: ``` XPathSyntaxError: Invalid expression File "/home/odoo/odoo/odoo/odoo/http.py", line 2123, in __call__ response = requ
Original PR description
When the user tries to modify the view with an invalid xpath expression, an XPathSyntaxError traceback will appear. Steps to produce: - Install the Accounting module. - Settings > Technical > UI >…
When the user tries to modify the view with an invalid xpath expression,
an XPathSyntaxError traceback will appear.
Steps to produce:
- Install the Accounting module.
- Settings > Technical > UI > Views > Open any view
- Invalidate `expr` syntax and try to save, thus an error will be generated.
Error: XPathSyntaxError: Invalid expression
See traceback:
```
XPathSyntaxError: Invalid expression
File "/home/odoo/odoo/odoo/odoo/http.py", line 2123, in __call__
response = request._serve_db()
File "/home/odoo/odoo/odoo/odoo/http.py", line 1699, in _serve_db
return service_model.retrying(self._serve_ir_http, self.env)
File "/home/odoo/odoo/odoo/odoo/service/model.py", line 133, in retrying
result = func()
File "/home/odoo/odoo/odoo/odoo/http.py", line 1726, in _serve_ir_http
response = self.dispatcher.dispatch(rule.endpoint, args)
File "/home/odoo/odoo/odoo/odoo/http.py", line 1927, in dispatch
result = self.request.registry['ir.http']._dispatch(endpoint)
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_http.py", line 190, in _dispatch
result = endpoint(**request.params)
File "/home/odoo/odoo/odoo/odoo/http.py", line 716, in route_wrapper
result = endpoint(self, *args, **params_ok)
File "/home/odoo/odoo/odoo/addons/web/controllers/dataset.py", line 30, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/home/odoo/odoo/odoo/addons/web/controllers/dataset.py", line 26, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/home/odoo/odoo/odoo/odoo/api.py", line 461, in call_kw
result = _call_kw_multi(method, model, args, kwargs)
File "/home/odoo/odoo/odoo/odoo/api.py", line 448, in _call_kw_multi
result = method(recs, *args, **kwargs)
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 584, in write
res = super(View, self).write(self._compute_defaults(vals))
File "/home/odoo/odoo/odoo/odoo/models.py", line 4046, in write
fields[0].determine_inverse(real_recs)
File "/home/odoo/odoo/odoo/odoo/fields.py", line 1396, in determine_inverse
determine(self.inverse, records)
File "/home/odoo/odoo/odoo/odoo/fields.py", line 99, in determine
return needle(*args)
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 363, in _inverse_arch_base
view_wo_lang.arch = view.arch_base
File "/home/odoo/odoo/odoo/odoo/fields.py", line 1320, in __set__
records.write({self.name: write_value})
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 584, in write
res = super(View, self).write(self._compute_defaults(vals))
File "/home/odoo/odoo/odoo/odoo/models.py", line 4046, in write
fields[0].determine_inverse(real_recs)
File "/home/odoo/odoo/odoo/odoo/fields.py", line 1396, in determine_inverse
determine(self.inverse, records)
File "/home/odoo/odoo/odoo/odoo/fields.py", line 99, in determine
return needle(*args)
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 345, in _inverse_arch
view.write(data)
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 584, in write
res = super(View, self).write(self._compute_defaults(vals))
File "/home/odoo/odoo/odoo/odoo/models.py", line 4036, in write
real_recs._validate_fields(vals, inverse_fields)
File "/home/odoo/odoo/odoo/odoo/models.py", line 1411, in _validate_fields
check(self)
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 447, in _check_xml
combined_arch = view._get_combined_arch()
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 1010, in _get_combined_arch
arch = root.with_prefetch(tree_views._prefetch_ids)._combine(hierarchy)
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 951, in _combine
combined_arch = view.apply_inheritance_specs(combined_arch, arch)
File "/home/odoo/odoo/odoo/odoo/addons/base/models/ir_ui_view.py", line 882, in apply_inheritance_specs
source = apply_inheritance_specs(
File "/home/odoo/odoo/odoo/odoo/tools/template_inheritance.py", line 147, in apply_inheritance_specs
node = locate_node(source, spec)
File "/home/odoo/odoo/odoo/odoo/tools/template_inheritance.py", line 78, in locate_node
xPath = etree.ETXPath(expr)
File "src/lxml/xpath.pxi", line 478, in lxml.etree.ETXPath.__init__
File "src/lxml/xpath.pxi", line 421, in lxml.etree.XPath.__init__
```
This commit handles XPathSyntaxError by raising ValidationError instead of a traceback.
sentry-4377014622
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#136565
Forward-Port-Of: odoo/odoo#131673Back-port tests with `contains` from `master` runbot-9203 Forward-Port-Of: odoo/odoo#138102 Forward-Port-Of: odoo/odoo#137316
Original PR description
Back-port tests with `contains` from `master` runbot-9203 Forward-Port-Of: odoo/odoo#138102 Forward-Port-Of: odoo/odoo#137316
**Current behavior before PR:** When you try to copy paste html in code view of email marketing then in preview it will show the code instead of template. **Desired behavior after PR is merged:** Now when you try to paste html in code view of email marketing then it will show template preview as a result. task-3473633 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#139135 Forward-Port-Of: odoo/odoo#1330
Original PR description
**Current behavior before PR:** When you try to copy paste html in code view of email marketing then in preview it will show the code instead of template. **Desired behavior after PR is merged:** Now when you try to paste html in code view of email marketing then it will show template preview as a result. task-3473633 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#139135 Forward-Port-Of: odoo/odoo#133032
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#139179 Forward-Port-Of: odoo/odoo#137444
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#139179 Forward-Port-Of: odoo/odoo#137444
The onchange on the stage_id/project_id wasn't triggered when modifing tasks in batch we are now putting the same conditions as the onchange but in the task write() method --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#139399 Forward-Port-Of: odoo/odoo#139249
Original PR description
The onchange on the stage_id/project_id wasn't triggered when modifing tasks in batch we are now putting the same conditions as the onchange but in the task write() method --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#139399 Forward-Port-Of: odoo/odoo#139249
runbot-24463 runbot-24508 Forward-Port-Of: odoo/odoo#138103 Forward-Port-Of: odoo/odoo#137457
Original PR description
runbot-24463 runbot-24508 Forward-Port-Of: odoo/odoo#138103 Forward-Port-Of: odoo/odoo#137457
Description of the issue/feature this PR addresses: Before this commit it is impossible to find the qweb (or python) error when you preview an email template. Current behavior before PR:  Desired behavior after PR is merged:  @xmo-odoo --- I confirm I have signed the CLA and read the PR gui
Original PR description
Description of the issue/feature this PR addresses: Before this commit it is impossible to find the qweb (or python) error when you preview an email template. Current behavior before PR:  Desired behavior after PR is merged:  @xmo-odoo --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#138564 Forward-Port-Of: odoo/odoo#123557
### Steps - Create a contact with 2 sub contacts Sub1 and Sub2. - Create a service product with project creation on order. - Create a quotation for Sub1 and the created product and confirm. - Go to the created project and create a task. - Edit the task and change the customer to Sub2. - Empty the sale order item. ### Issue The sale order doesn't appear in the drop list. ### Cause Wrong domain on ``ProjectTask.sale_line_id``. opw-3441194 Forward-Port-Of: odoo/odoo#139573 Forward
Original PR description
### Steps - Create a contact with 2 sub contacts Sub1 and Sub2. - Create a service product with project creation on order. - Create a quotation for Sub1 and the created product and confirm. - Go to the created project and create a task. - Edit the task and change the customer to Sub2. - Empty the sale order item. ### Issue The sale order doesn't appear in the drop list. ### Cause Wrong domain on ``ProjectTask.sale_line_id``. opw-3441194 Forward-Port-Of: odoo/odoo#139573 Forward-Port-Of: odoo/odoo#136379
Without the Accounting app and the Bank Reconciliation part, the menu item "Reconciliation Models" is irrelevant. We therefore move the menu item from account to account_accountant. task-3540705 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#139553
Original PR description
Without the Accounting app and the Bank Reconciliation part, the menu item "Reconciliation Models" is irrelevant. We therefore move the menu item from account to account_accountant. task-3540705 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#139553
steps to reproduce: - create product A with optional product B - add product A as optional of product B - create SO with product A and add optional product B in configurator As we do not want support recursive optional products after this commit the optional products will be filtered in the form to disallow recursion opw-3388598 Forward-Port-Of: odoo/odoo#139471 Forward-Port-Of: odoo/odoo#138017
Original PR description
steps to reproduce: - create product A with optional product B - add product A as optional of product B - create SO with product A and add optional product B in configurator As we do not want support recursive optional products after this commit the optional products will be filtered in the form to disallow recursion opw-3388598 Forward-Port-Of: odoo/odoo#139471 Forward-Port-Of: odoo/odoo#138017
[FIX] account_peppol: hide peppol_move_state on vendor bills, refunds - `peppol_move_state` is only useful when sending an invoice/credit note. Hide this field from the form view and the tree view for vendor bills and refunds - when getting new documents from the IAP, ignore messages with peppol state `error` as these are not useful for the users. Also, if there is an error when creating an invoice from the attachment, the vendor bill should still have `peppol_move_state` set to `done`, becaus
Original PR description
[FIX] account_peppol: hide peppol_move_state on vendor bills, refunds - `peppol_move_state` is only useful when sending an invoice/credit note. Hide this field from the form view and the tree view…
[FIX] account_peppol: hide peppol_move_state on vendor bills, refunds - `peppol_move_state` is only useful when sending an invoice/credit note. Hide this field from the form view and the tree view for vendor bills and refunds - when getting new documents from the IAP, ignore messages with peppol state `error` as these are not useful for the users. Also, if there is an error when creating an invoice from the attachment, the vendor bill should still have `peppol_move_state` set to `done`, because we have received the vendor bill after all. Users can fill out missing details if necessary, by looking at the attachment. [FIX] account_peppol: remove inactive canceled edi users - If an edi user needs cancellation before they are registered on the SMP, we should let them cancel and return to the very first step. We don't need the edi user anymore in that case (no messages could've been received or sent) so we can safely unlink. The same is done on the proxy side. - With that, reopening the registration is no longer needed, as we currently don't let users reopen their application when they're rejected. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#138215
…vents Before this commit, crap sql query were performed with a lot of recurring events were searched: ``` bad query: SELECT "calendar_recurrence".id FROM "calendar_recurrence" WHERE (((((([...] ((((((("calendar_recurrence"."microsoft_id"::text like '%:XX0') OR ( "calendar_recurrence"."microsoft_id"::text like '%:XX1')) OR ("calendar_recurrence"."microsoft_id"::text like '%:XX2')) OR ("calendar_recurr [...] ``` --- I confirm I have signed the CLA and read the PR guidelines at
Original PR description
…vents
Before this commit, crap sql query were performed with a lot of recurring events were searched:
```
bad query: SELECT "calendar_recurrence".id FROM "calendar_recurrence" WHERE (((((([...]
((((((("calendar_recurrence"."microsoft_id"::text like '%:XX0') OR (
"calendar_recurrence"."microsoft_id"::text like '%:XX1'))
OR ("calendar_recurrence"."microsoft_id"::text like '%:XX2')) OR ("calendar_recurr [...]
```
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#136938People must be able to install `point_of_sale` without `pos_restaurant` if they don't need it. But in order to let users know that they can install `pos_restaurant` directly, we make it an app, that will also be selectable from the Start Trial page. Forward-Port-Of: odoo/odoo#131697
Original PR description
People must be able to install `point_of_sale` without `pos_restaurant` if they don't need it. But in order to let users know that they can install `pos_restaurant` directly, we make it an app, that will also be selectable from the Start Trial page. Forward-Port-Of: odoo/odoo#131697
At the moment, the efaktur system will consume a number even for invoices not using any taxes. This change will try to avoid that by not consuming numbers for invoices when no lines has a tax_ids set. task id #3130665 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#138726
Original PR description
At the moment, the efaktur system will consume a number even for invoices not using any taxes. This change will try to avoid that by not consuming numbers for invoices when no lines has a tax_ids set. task id #3130665 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#138726
Steps: - Install fleet. - Create new. Select a car. - Goto `Model` page. - Below CO2 Emissions string there is Co2 Standard string. Issue: - In the Engine section, there is a `CO2 Emissions` and a `Co2 Standard` field. If these are both referring to carbon dioxide, then they should be written consistently in the same format (CO2). Currently, one has a lowercase `o` while the other (correct) one has a capital `O`. Improvement: - We are adding the necessary string. task-3498197 For
Original PR description
Steps: - Install fleet. - Create new. Select a car. - Goto `Model` page. - Below CO2 Emissions string there is Co2 Standard string. Issue: - In the Engine section, there is a `CO2 Emissions` and a `Co2 Standard` field. If these are both referring to carbon dioxide, then they should be written consistently in the same format (CO2). Currently, one has a lowercase `o` while the other (correct) one has a capital `O`. Improvement: - We are adding the necessary string. task-3498197 Forward-Port-Of: odoo/odoo#139500 Forward-Port-Of: odoo/odoo#135438
Current behavior: After uninstalling the PoS module, if you try to install it again, you get a traceback because Odoo is trying to create a sequence that already exists. Steps to reproduce: - install PoS - uninstall PoS - install PoS - you get a traceback opw-3515647 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#138189
Original PR description
Current behavior: After uninstalling the PoS module, if you try to install it again, you get a traceback because Odoo is trying to create a sequence that already exists. Steps to reproduce: - install PoS - uninstall PoS - install PoS - you get a traceback opw-3515647 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#138189
Current behaviour: --- When your current company is South Korean, The chart of account is generic. If you try to create a South Korean company branch, you'll get an error message: The Currency of a subsidiary must be the same as its root company. Steps to reproduce: --- 1. Install account_accountant 2. Go to Settings 3. Go to Users & Companies > Companies 4. Create a new company 5. Country: South Korea 6. Currency: KRW 7. Switch into the new company (top right) 8. Go to Account
Original PR description
Current behaviour: --- When your current company is South Korean, The chart of account is generic. If you try to create a South Korean company branch, you'll get an error message: The Currency of a…
Current behaviour: --- When your current company is South Korean, The chart of account is generic. If you try to create a South Korean company branch, you'll get an error message: The Currency of a subsidiary must be the same as its root company. Steps to reproduce: --- 1. Install account_accountant 2. Go to Settings 3. Go to Users & Companies > Companies 4. Create a new company 5. Country: South Korea 6. Currency: KRW 7. Switch into the new company (top right) 8. Go to Accounting 9. Go to Configuration > Settings 10. Fiscal Localization: Generic Chart Template 11. Save the changes 12. Fiscal Country: South Korea 13. Main currency: KRW 14. Save the changes 15. Go to Settings 16. Go to Users & Companies > Companies 17. Select the Korean company 18. Create a new branch 19. Country: South Korea 20. The Currency of a subsidiary must be the same as it's root company. Cause of the issue: --- The generic chart of account's currency is USD opw-3537346 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#138226
Center buttons vertically inside the toolbar instead of aligning them at the end. task-3554022 Forward-Port-Of: odoo/enterprise#48942
Original PR description
Center buttons vertically inside the toolbar instead of aligning them at the end. task-3554022 Forward-Port-Of: odoo/enterprise#48942
Currently, the error occurs when sending a push notification from a 'Visitor', who has multiple 'website visitors'. Steps to reproduce: - Install a `social_push_notifications` and 'web_studio' modules. - Go to Settings> General Settings, And Enable website push notifications in 'Email & Marketing' section. - Open another browser or an incognito window, Visit your website as a visitor, and allow notifications. - Go back to the main browser and open Website>Reporting>Visitors, Open 'Admin
Original PR description
Currently, the error occurs when sending a push notification from a 'Visitor', who has multiple 'website visitors'. Steps to reproduce: - Install a `social_push_notifications` and 'web_studio'…
Currently, the error occurs when sending a push notification from a 'Visitor', who has multiple 'website visitors'.
Steps to reproduce:
- Install a `social_push_notifications` and 'web_studio' modules.
- Go to Settings> General Settings, And Enable website push notifications in 'Email & Marketing' section.
- Open another browser or an incognito window, Visit your website as a visitor, and allow notifications.
- Go back to the main browser and open Website>Reporting>Visitors, Open 'Administrator' record
- Tick the boolean field 'Push Notifications Enabled' to enable push notifications.
- Add the 'Push Subscriptions' field using 'web_studio' This field is for testing purposes and will show how many website visitors are available.
- If there are multiple web visitor then Click on the 'Send Push Notification' button to open the 'Post' form view.
- Set a message and post it.
Traceback on sentry:
```
ValueError: too many values to unpack (expected 1)
File "odoo/models.py", line 5457, in ensure_one
_id, = self._ids
ValueError: Expected singleton: website.visitor.push.subscription(6, 8)
File "odoo/tools/safe_eval.py", line 362, in safe_eval
return unsafe_eval(c, globals_dict, locals_dict)
File "ir.actions.server(547,)", line 1, in <module>
File "home/odoo/src/enterprise/saas-16.4/social_push_notifications/models/social_post.py", line 48, in _cron_publish_scheduled
push_notifications_live_posts._post_push_notifications()
File "home/odoo/src/enterprise/saas-16.4/social_push_notifications/models/social_live_post.py", line 67, in _post_push_notifications
account._firebase_send_message({
File "home/odoo/src/enterprise/saas-16.4/social_push_notifications/models/social_account.py", line 48, in _firebase_send_message
visitors = visitors.filtered(lambda visitor: visitor.push_subscription_ids.push_token)
File "odoo/models.py", line 5723, in filtered
return self.browse([rec.id for rec in self if func(rec)])
File "odoo/models.py", line 5723, in <listcomp>
return self.browse([rec.id for rec in self if func(rec)])
File "home/odoo/src/enterprise/saas-16.4/social_push_notifications/models/social_account.py", line 48, in <lambda>
visitors = visitors.filtered(lambda visitor: visitor.push_subscription_ids.push_token)
File "odoo/fields.py", line 1153, in __get__
record.ensure_one()
File "odoo/models.py", line 5460, in ensure_one
raise ValueError("Expected singleton: %s" % self)
ValueError: <class 'ValueError'>: "Expected singleton: website.visitor.push.subscription(6, 8)" while evaluating
'model._cron_publish_scheduled()'
File "odoo/addons/base/models/ir_cron.py", line 373, in _callback
self.env['ir.actions.server'].browse(server_action_id).run()
File "home/odoo/src/custom/trial/saas_trial/models/sentry.py", line 33, in run
res = super().run()
File "odoo/addons/base/models/ir_actions.py", line 688, in run
res = runner(run_self, eval_context=eval_context)
File "addons/website/models/ir_actions_server.py", line 61, in _run_action_code_multi
res = super(ServerAction, self)._run_action_code_multi(eval_context)
File "odoo/addons/base/models/ir_actions.py", line 558, in _run_action_code_multi
safe_eval(self.code.strip(), eval_context, mode="exec", nocopy=True, filename=str(self)) # nocopy allows to return 'action'
File "odoo/tools/safe_eval.py", line 376, in safe_eval
raise ValueError('%s: "%s" while evaluating\n%r' % (ustr(type(e)), ustr(e), expr))
```
When sending a push notification from a particular visitor whose website has multiple 'website visitors', There's an issue where the system attempts to access the 'push_token' from the multiple records of 'push_subscription_ids'[1].
Line[1]: https://github.com/odoo/enterprise/blob/2784921e93853d09f5052b6054389e78c2af42fc/social_push_notifications/models/social_account.py#L70
This commit solves this issue by removing 'push_token' in the filter function as 'push_token' is a required field, so there's no need for an additional iteration to check 'push_token' separately.
sentry-4486410114
Forward-Port-Of: odoo/enterprise#47809Crete an invoice from a subscription Confirm the invoice Hit 'credit note' In the wizard use 'Reverse and Create Invoice' Confirm the new invoice Go back to the subscription Issue: invoiced quantity will be 0 This occurs because deferred_start_date and deferred_end_date are copied to the credit note but not to the new invoice opw-3441508 Forward-Port-Of: odoo/enterprise#46686
Original PR description
Crete an invoice from a subscription Confirm the invoice Hit 'credit note' In the wizard use 'Reverse and Create Invoice' Confirm the new invoice Go back to the subscription Issue: invoiced quantity will be 0 This occurs because deferred_start_date and deferred_end_date are copied to the credit note but not to the new invoice opw-3441508 Forward-Port-Of: odoo/enterprise#46686
With a CL company setup Create an invoice with 100% discount on a line Confirm Issue: Traceback caused by division by zero opw-3556443 Forward-Port-Of: odoo/enterprise#49484
Original PR description
With a CL company setup Create an invoice with 100% discount on a line Confirm Issue: Traceback caused by division by zero opw-3556443 Forward-Port-Of: odoo/enterprise#49484
Purpose ======== Currently the feedback is sent in the requester language, which is not the language spoken by the employee from whom a feedback is asked. Some cleaning is also made, user_body is not used anymore for instance. Moreover, we changed the template to sound more friendly. Forward-Port-Of: odoo/enterprise#49488
Original PR description
Purpose ======== Currently the feedback is sent in the requester language, which is not the language spoken by the employee from whom a feedback is asked. Some cleaning is also made, user_body is not used anymore for instance. Moreover, we changed the template to sound more friendly. Forward-Port-Of: odoo/enterprise#49488
Problem --------- When fetching online transactions, it can happen that no new transactions are found. In such a case, a nice helper with a message and an image is meant to be displayed on the screen. However, in some situations, this helper is not rendered, and only the plain HTML code is displayed. Objective --------- Fix this behavior so that the helper is always rendered. Solution --------- After investigating, it appeared that the helper would not be rendered when the call to `_
Original PR description
Problem --------- When fetching online transactions, it can happen that no new transactions are found. In such a case, a nice helper with a message and an image is meant to be displayed on the…
Problem --------- When fetching online transactions, it can happen that no new transactions are found. In such a case, a nice helper with a message and an image is meant to be displayed on the screen. However, in some situations, this helper is not rendered, and only the plain HTML code is displayed. Objective --------- Fix this behavior so that the helper is always rendered. Solution --------- After investigating, it appeared that the helper would not be rendered when the call to `_open_iframe()` is made prior to fetching for new transactions. Indeed, this function calls some JS code that performs an ORM call. The ORM call fetches for the new transactions and returns an `ir.actions.act_window` in JSON. The returned act_window includes the helper if no new transactions have been found. When doAction() is called with act_window as a parameter, the helper is transformed into a string and is thus not rendered on the screen. To solve the issue, 1. Make sure that the helper HTML code is safe using escape and Markup. 2. After the `orm.call` and before calling `doAction`, retransform the helper into a markup explicitly. Task-3553029 Forward-Port-Of: odoo/enterprise#49452 Forward-Port-Of: odoo/enterprise#49128
This PR addresses an issue in the 'hr_payroll_holidays' module where the calculation of time off differ. The problem was causing accessing in the calculation of payroll holidays work entry. The root cause of the problem was accessing the date_stop id. The fix ensures that time off is now accurately calculated, providing a reliable basis for employee leave tracking and ensuring accurate payroll computations. task: 3424006 Forward-Port-Of: odoo/enterprise#49190 Forward-Port-Of: odoo/enterp
Original PR description
This PR addresses an issue in the 'hr_payroll_holidays' module where the calculation of time off differ. The problem was causing accessing in the calculation of payroll holidays work entry. The root cause of the problem was accessing the date_stop id. The fix ensures that time off is now accurately calculated, providing a reliable basis for employee leave tracking and ensuring accurate payroll computations. task: 3424006 Forward-Port-Of: odoo/enterprise#49190 Forward-Port-Of: odoo/enterprise#47520
Steps to Reproduce =================== 1 Click on the request button. 2 Create the new workspace from there. 3 Clicking the save or discard button from the workspace form view closes the request wizard also. Technical ======== The reason behind this is the clicked button is of a special type (special='save' and special='cancel'), which means that the record will be saved or discarded, and an 'ir.actions.act_window_close' will be executed, which closes the dialog. After this co
Original PR description
Steps to Reproduce =================== 1 Click on the request button. 2 Create the new workspace from there. 3 Clicking the save or discard button from the workspace form view closes the request wizard also. Technical ======== The reason behind this is the clicked button is of a special type (special='save' and special='cancel'), which means that the record will be saved or discarded, and an 'ir.actions.act_window_close' will be executed, which closes the dialog. After this commit ================== Removed the footer, and used the default footer having a 'save and close' button instead of that solves the issue. Forward-Port-Of: odoo/enterprise#47748 Forward-Port-Of: odoo/enterprise#46134