Daily updates from Odoo
Wednesday, March 12, 2025
81 changes
32 changes
Enhancements to existing features
The Knowledge comments feature has been adjusted to work with the updated editor toolbar. This keeps comment-related actions available and properly described as the toolbar moves to a compact, expandable layout.
Original PR description
The following changes have been made in the toolbar in html_editor: - the `namespace` parameter in the toolbar item definition has been changed to `namespaces`, supporting multiple namespaces for a toolbar group or item. - the toolbar opens in a compact mode, with a small subset of buttons, and can be expanded to display a larger set of buttons (namely those in the "expanded" namespace). - the `title` parameter has been replaced with `description`, which is used to define the content of the tooltip displayed when hovering over the item. This commit adapts the Comments plugin to these changes. Community: https://github.com/odoo/odoo/pull/201037 task-4535289
Budget report queries were adjusted to skip unnecessary checks on fields that are always empty in the temporary budget data. This helps the reporting system avoid redundant work and supports more efficient budget report generation without changing what users see.
Original PR description
To allow to ORM to remove SQL checks for null values. When querying the temporary budget table, some required fields are set to NULL. We should ignore the conditions on these fields as they are constant anyways. task-4415011 https://github.com/odoo/odoo/pull/191236
The schedule interview email template is now included by default instead of only in demo data. This helps Recruitment users follow the documentation and find the expected template in their own databases without extra setup.
Original PR description
The schedule interview mail template was part of the demo data only. Odoo clients following the Recruitment app docs were not able to find the template in their DBs. So, this commit makes it part of the default data, to stay consistent with the documentation. task-4637146
The Knowledge app no longer carries an old internal export that has moved to the shared HTML editor. This keeps the codebase cleaner and aligns naming with standard Odoo migration practices, with no expected change for end users.
Original PR description
`HtmlUpgradeManager` was exported from the `knowledge` module for historical reason. This commit removes that file (`HtmlUpgradeManager` is now in `html_editor` module). `upgrade` functions are renamed `migrate` to be more consistent with the `migrate` function of the classic Odoo `upgrade` repository.
Resolved issues and error corrections
The timesheet list view no longer shows an empty timer status column. This removes confusing, non-useful information from the screen and keeps the timesheet view cleaner for users.
Original PR description
Before this commit, the `is_timer_running` field defined timesheet model is displayed in the list but the column is always empty. This commit makes sure the column is also hidden in the list view since no data is displayed. The field is in fact just a technical field and not really useful for the user.
This change moves a Belgian payroll accounting test into the appropriate Belgian localization test module. It helps keep automated checks reliable by avoiding dependency errors, with no expected impact on day-to-day product use.
Original PR description
Move the test to the l10n_be test module to avoid dependencies error
This update aligns the Enterprise appointment app with a related core fix so frontend appointment pages can use the shared formatting and HTML utilities they expect. It helps prevent display or interaction issues in appointment scheduling without changing the user workflow.
Original PR description
Enterprise counter-part. runbot-134831 https://github.com/odoo/odoo/pull/201247
This update fixes an issue that could prevent online bank synchronization records from being created after a recent platform change. It helps keep account connections working reliably without changing user workflows.
Original PR description
`create` only accepts a list or a tuple now, not dict_values
A typo was corrected in the appraisal campaign wizard. This helps keep the employee appraisal experience clear and professional without changing how the feature works.
Features or functions removed from Odoo
An empty leftover module directory was removed after its functionality had already been merged into the main US payroll module. This keeps the system cleaner and avoids confusion from unused payroll components.
Original PR description
A file was missed when merging the module to l10n_us_hr_payroll in this PR (https://github.com/odoo/enterprise/pull/70310). The whole module directory should be removed.
Miscellaneous changes
Steps to reproduce: 1. Upload a link and Video type documents 2. Create a shortcut 3. Go to My drive 4. Kanban card not displayed correctly Technical Reason: When creating a shortcut via 'action_create_shortcut', missing 'mimetype' and 'url' fields caused improper rendering of link/video shortcuts. After this commit: will display the proper format of the link/video. Task-4477679 Forward-Port-Of: odoo/enterprise#80887 Forward-Port-Of: odoo/enterprise#78677
Original PR description
Steps to reproduce: 1. Upload a link and Video type documents 2. Create a shortcut 3. Go to My drive 4. Kanban card not displayed correctly Technical Reason: When creating a shortcut via 'action_create_shortcut', missing 'mimetype' and 'url' fields caused improper rendering of link/video shortcuts. After this commit: will display the proper format of the link/video. Task-4477679 Forward-Port-Of: odoo/enterprise#80887 Forward-Port-Of: odoo/enterprise#78677
Forward-Port-Of: odoo/enterprise#81196 Forward-Port-Of: odoo/enterprise#81017
Original PR description
Forward-Port-Of: odoo/enterprise#81196 Forward-Port-Of: odoo/enterprise#81017
Steps to reproduce: - 1. Activate audit trail. 2. Make a customer invoice with start and end date [end date should be in future months], and post. 3. Reset the invoice to draft - Result: All deferred entries are reversed with new entries at the date of the reset to draft. The unposted deferred entries are still there with auto post At Date. Cause: - Audit trail alone doesn't prevent the moves from being deleted if they were not posted before, so the check shouldn't be only on the com
Original PR description
Steps to reproduce: - 1. Activate audit trail. 2. Make a customer invoice with start and end date [end date should be in future months], and post. 3. Reset the invoice to draft - Result: All deferred entries are reversed with new entries at the date of the reset to draft. The unposted deferred entries are still there with auto post At Date. Cause: - Audit trail alone doesn't prevent the moves from being deleted if they were not posted before, so the check shouldn't be only on the company_id.check_account_audit_trail, but also we should consider move.posted_before and if not, it should be deleted not reversed. Fix: - Replace the company_id.check_account_audit_trail check with _is_protected_by_audit_trail() which includes checking if the move is posted before or not. opw - 4562732 Forward-Port-Of: odoo/enterprise#81061
[FIX] l10n_ar: price unit precision digits on invoice report. This pr was created to adapt l10n_ar_reports/tests/IVA_Ventas.txt and l10n_ar_reports/tests/Ventas.txt files to the changes of https://github.com/odoo/odoo/pull/171131/commits/95bd2d3677f6b534e9eb660e9757e87cf778d7b5 Ticket Adhoc side: 77471 Task latam: 1226 Forward-Port-Of: odoo/enterprise#80650 Forward-Port-Of: odoo/enterprise#77800
Original PR description
[FIX] l10n_ar: price unit precision digits on invoice report. This pr was created to adapt l10n_ar_reports/tests/IVA_Ventas.txt and l10n_ar_reports/tests/Ventas.txt files to the changes of https://github.com/odoo/odoo/pull/171131/commits/95bd2d3677f6b534e9eb660e9757e87cf778d7b5 Ticket Adhoc side: 77471 Task latam: 1226 Forward-Port-Of: odoo/enterprise#80650 Forward-Port-Of: odoo/enterprise#77800
## Pull Request HOOT (PRHOOT) 28 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Community: https://github.com/odoo/odoo/pull/189710 --- I confirm I have signed
Original PR description
## Pull Request HOOT (PRHOOT) 28 This pull requests brings various improvements and fixes to Hoot and the Odoo unit test ecosystem. See the different commit messages for more details. Note: these changes are made in stable to avoid having to support multiple versions of the HOOT API. As such, these changes are intended to be strictly limited to unit tests as to not put the rest of the code base at risk. Community: https://github.com/odoo/odoo/pull/189710 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/enterprise#80292 Forward-Port-Of: odoo/enterprise#78636
Issue: When we export a report to xlsx containing some amounts in foreign currency, those amounts are exported as values in the file, and loose any kind of currency symbols. It then becomes impossible to know what currency they were expressed in. Solution: When a column has an expression label with the 'currency' word inside, adds a new column right next to it, with the currency 3 letters code as value. This is done in the accounting reports framework and so is used on all reports using a c
Original PR description
Issue: When we export a report to xlsx containing some amounts in foreign currency, those amounts are exported as values in the file, and loose any kind of currency symbols. It then becomes impossible to know what currency they were expressed in. Solution: When a column has an expression label with the 'currency' word inside, adds a new column right next to it, with the currency 3 letters code as value. This is done in the accounting reports framework and so is used on all reports using a custom engine. task-4011008 Forward-Port-Of: odoo/enterprise#80638 Forward-Port-Of: odoo/enterprise#76441
*l10n_nl_intrastat,l10n_nl_reports,l10n_nl_reports_sbr, l10n_nl_reports_sbr_icp,l10n_nl_reports_sbr_ob_nummer, l10n_nl_reports_sbr_status_info [task-4421055](https://www.odoo.com/odoo/project.task/4421055) Forward-Port-Of: odoo/enterprise#81032 Forward-Port-Of: odoo/enterprise#78111
Original PR description
*l10n_nl_intrastat,l10n_nl_reports,l10n_nl_reports_sbr, l10n_nl_reports_sbr_icp,l10n_nl_reports_sbr_ob_nummer, l10n_nl_reports_sbr_status_info [task-4421055](https://www.odoo.com/odoo/project.task/4421055) Forward-Port-Of: odoo/enterprise#81032 Forward-Port-Of: odoo/enterprise#78111
Steps to reproduce ================== - Install documents,project - Go to documents - Open any document - Click on share - Click on "Copy link" - Go to a project task - Click on a log note - Open the full composer - Type some text and select it - Paste the copied url - Post the log note - Click on the link => Missing Action: the action "..." does not exist Cause of the issue ================== Documents [redirects] `/odoo/documents/<access-token>` to either the backend o
Original PR description
Steps to reproduce ================== - Install documents,project - Go to documents - Open any document - Click on share - Click on "Copy link" - Go to a project task - Click on a log note - Open the full composer - Type some text and select it - Paste the copied url - Post the log note - Click on the link => Missing Action: the action "..." does not exist Cause of the issue ================== Documents [redirects] `/odoo/documents/<access-token>` to either the backend or the portal. There is a global click handler in the router that intercepts click on links to update and push the router state. Solution ======== We should not handle those links, the http redirection will take care of it. --- [redirects]: https://github.com/odoo/enterprise/blob/882e4453c8eadae8e39ea02314377c617d3b9e0f/documents/controllers/home.py#L24 opw-4611260 Forward-Port-Of: odoo/enterprise#81016
No need to fetch available embedded actions on inaccessible folders. FU of d391313e. Task-4525850 Forward-Port-Of: odoo/enterprise#81049
Original PR description
No need to fetch available embedded actions on inaccessible folders. FU of d391313e. Task-4525850 Forward-Port-Of: odoo/enterprise#81049
Steps to reproduce: - Turn on dark mode - Open the Field Service app. - Click on "Add Product" to navigate to the product catalog. Issue: - An image placeholder appears when no image is set for a product. This behavior is inconsistent with the product catalog page in the Sales app. Solution: - Removed the XPath that adds the image placeholder in the product catalog. task-4302221 Forward-Port-Of: odoo/enterprise#78937
Original PR description
Steps to reproduce: - Turn on dark mode - Open the Field Service app. - Click on "Add Product" to navigate to the product catalog. Issue: - An image placeholder appears when no image is set for a product. This behavior is inconsistent with the product catalog page in the Sales app. Solution: - Removed the XPath that adds the image placeholder in the product catalog. task-4302221 Forward-Port-Of: odoo/enterprise#78937
Since the change of res.users from view (UI for groups), the sequence is used, but the data has not been updated. related: https://github.com/odoo/odoo/commit/2258fe4071f15ae72ab3384de6bbe43ff0db5848 Forward-Port-Of: odoo/enterprise#80212
Original PR description
Since the change of res.users from view (UI for groups), the sequence is used, but the data has not been updated. related: https://github.com/odoo/odoo/commit/2258fe4071f15ae72ab3384de6bbe43ff0db5848 Forward-Port-Of: odoo/enterprise#80212
Problem ---------- wrong behaviour with the number_of_days_display / number_of_hours_display / number_of_days : Objective ---------- Fix the TestHR.test_flow : in the creation of leave allocation. Only number_of_days_display can have a value. But with a leave_type.request_unit = 'hour', number_of_hours_display should be used Solution ---------- Depends on the visibility of number_of_days_display and number_of_hours_display, put the value in the good field task-4521658 Forward-Po
Original PR description
Problem ---------- wrong behaviour with the number_of_days_display / number_of_hours_display / number_of_days : Objective ---------- Fix the TestHR.test_flow : in the creation of leave allocation. Only number_of_days_display can have a value. But with a leave_type.request_unit = 'hour', number_of_hours_display should be used Solution ---------- Depends on the visibility of number_of_days_display and number_of_hours_display, put the value in the good field task-4521658 Forward-Port-Of: odoo/enterprise#80400
Handle the case where goal.deadline is False when the goal is duplicated. Forward-Port-Of: odoo/enterprise#81158
Original PR description
Handle the case where goal.deadline is False when the goal is duplicated. Forward-Port-Of: odoo/enterprise#81158
### Steps to reproduce: - Create a manufacturing order - Navigate to the Miscellaneous tab and add an Analytic Distribution - Add a component to the manufacturing order with the quantity set to 10000, for example - Produce the manufacturing order - Navigate to the analytic account line associated with the stock move with 10000 units - Update the analytic account line’s date to be in the previous week - Navigate to Timesheets > Timesheets > All Timesheets and then navigate to the pr
Original PR description
### Steps to reproduce: - Create a manufacturing order - Navigate to the Miscellaneous tab and add an Analytic Distribution - Add a component to the manufacturing order with the quantity set to…
### Steps to reproduce: - Create a manufacturing order - Navigate to the Miscellaneous tab and add an Analytic Distribution - Add a component to the manufacturing order with the quantity set to 10000, for example - Produce the manufacturing order - Navigate to the analytic account line associated with the stock move with 10000 units - Update the analytic account line’s date to be in the previous week - Navigate to Timesheets > Timesheets > All Timesheets and then navigate to the previous week - Observe that your user has worked a very large amount of overtime ### Cause: This is happening because for MO when creating an analytic line in some cases we store the unit_amount as the quantity of the materials used. https://github.com/odoo/odoo/blob/ee7fbcb759fd8257ed2f52d1d5acfc6921d42870/addons/stock_account/models/stock_move.py#L437-L438 And when fetching the worked hours for the overtime indication we don't check if the analytic line is a timesheet or not https://github.com/odoo/enterprise/blob/ca935872fd70b9fc5b2d13359424916b3afa01eb/timesheet_grid/models/hr_employee.py#L120-L126 https://github.com/odoo/enterprise/blob/ca935872fd70b9fc5b2d13359424916b3afa01eb/timesheet_grid_holidays/models/hr_employee.py#L10-L16 ### Fix: Since we are only fetching timesheets so we will check if the project is set or not as if it is set it means that the record is a timesheet opw-4179137 Forward-Port-Of: odoo/enterprise#81109 Forward-Port-Of: odoo/enterprise#81026
…versing Steps to reproduce: - In settings, set a default "Default invoice transaction code" and "Default refund transaction code" - Create an invoice with an invoice line and post it - Reverse it Issue: - The intrastat code will be the one from the invoice (and not the default refund one) Cause: When copying the lines we keep the one from the invoice Solution: Delete the default values when copying the data so the compute is triggered correctly which will set the correct value
Original PR description
…versing Steps to reproduce: - In settings, set a default "Default invoice transaction code" and "Default refund transaction code" - Create an invoice with an invoice line and post it - Reverse it Issue: - The intrastat code will be the one from the invoice (and not the default refund one) Cause: When copying the lines we keep the one from the invoice Solution: Delete the default values when copying the data so the compute is triggered correctly which will set the correct value opw-4417566 Forward-Port-Of: odoo/enterprise#79267
When users attempt to send a template with 10 body variables, the sample values for `Free Text 1` and `Free Text 10` are swapped. Steps to Produce: - Create a template with 10 body variables - Give sample value for `Body - {{1}}` as 1 and `Body - {{10}}` as 10 - Open the WhatsApp composer using the created template - `Free text 1` will have a value of 10 instead of 1 - `Free text 10` will have a value of 1 instead of 10 Problem: The variables are sorted by name, causing `{{10}}`
Original PR description
When users attempt to send a template with 10 body variables, the sample values for `Free Text 1` and `Free Text 10` are swapped.
Steps to Produce:
- Create a template with 10 body variables
- Give sample value for `Body - {{1}}` as 1 and `Body - {{10}}` as 10
- Open the WhatsApp composer using the created template
- `Free text 1` will have a value of 10 instead of 1
- `Free text 10` will have a value of 1 instead of 10
Problem:
The variables are sorted by name, causing `{{10}}` to appear before `{{1}}`, which leads to the values being swapped.
Solution:
Sort the variables by extracting the index from the variable name, so they are ordered numerically rather than alphabetically.
Task-4212923
Forward-Port-Of: odoo/enterprise#80534
Forward-Port-Of: odoo/enterprise#71307This commit add a new xml export (DES) for intrastat report. Regarding the legal specifications at: https://www.douane.gouv.fr/sites/default/files/uploads/files/2020-10/ManuelDesXML.pdf task-4402569 Forward-Port-Of: odoo/enterprise#77866
Original PR description
This commit add a new xml export (DES) for intrastat report. Regarding the legal specifications at: https://www.douane.gouv.fr/sites/default/files/uploads/files/2020-10/ManuelDesXML.pdf task-4402569 Forward-Port-Of: odoo/enterprise#77866
Adding a condition for Avatax not being enabled on the taxes column in portal view of sales orders. task: 4423974 Forward-Port-Of: odoo/enterprise#80616 Forward-Port-Of: odoo/enterprise#77683
Original PR description
Adding a condition for Avatax not being enabled on the taxes column in portal view of sales orders. task: 4423974 Forward-Port-Of: odoo/enterprise#80616 Forward-Port-Of: odoo/enterprise#77683
Currently, when `marketing_automation_whatsapp` is installed, marketing automation campaign statistics are not computed correctly. ### Steps to Reproduce 1. Install `marketing_automation_whatsapp`. 2. Create a marketing automation campaign with an email activity. 3. Ensure one or more traces are rejected (e.g., by using invalid email addresses). 4. View the activity statistics. Expected Result: The rejected count on the right correctly displays the number of rejected traces. Actu
Original PR description
Currently, when `marketing_automation_whatsapp` is installed, marketing automation campaign statistics are not computed correctly. ### Steps to Reproduce 1. Install `marketing_automation_whatsapp`.…
Currently, when `marketing_automation_whatsapp` is installed, marketing automation campaign statistics are not computed correctly. ### Steps to Reproduce 1. Install `marketing_automation_whatsapp`. 2. Create a marketing automation campaign with an email activity. 3. Ensure one or more traces are rejected (e.g., by using invalid email addresses). 4. View the activity statistics. Expected Result: The rejected count on the right correctly displays the number of rejected traces. Actual Result: The rejected count on the right always displays `0`, even when rejected traces exist. ### Cause The `marketing_automation_whatsapp` module overrides `_get_full_statistics` to include WhatsApp-related statistics in addition to the marketing data. However, the override currently concatenates the results from the base `_get_full_statistics` and the WhatsApp-specific statistics. And because `MarketingActivity._compute_statistics` doesn't expect `_get_full_statistics` to return multiple entries for a given `activity_id`, the values from the WhatsApp-specific results end up overwriting the base values. opw-4292488 opw-4523885 opw-4585705 opw-4585779 Forward-Port-Of: odoo/enterprise#79348
Since 3.13, leading whitespace is automatically stripped in a docstring (python/cpython#81283). The `info` field of an ir.model is a copy of the docstring, so running :TestStudioExports.test_export_customizations on 3.13 fails because the documents are different (the content of the info field is indented and has a leading space matching `Model`'s docstring). Instead of duplicating the info field, just inject it in the document we're creating from the record, that way it doesn't break if so
Original PR description
Since 3.13, leading whitespace is automatically stripped in a docstring (python/cpython#81283). The `info` field of an ir.model is a copy of the docstring, so running :TestStudioExports.test_export_customizations on 3.13 fails because the documents are different (the content of the info field is indented and has a leading space matching `Model`'s docstring). Instead of duplicating the info field, just inject it in the document we're creating from the record, that way it doesn't break if someone decides to improve the docstring either. Forward-Port-Of: odoo/enterprise#81087 Forward-Port-Of: odoo/enterprise#81045
- Sign > Documents > Click on any of the Kanban record - Reload the view (either reload the browser, or activate the debug, or change to dark mode on the user menu). Before this commit, on reloading the sign document page user was redirected back to kanban view. This occurs because, the client action 'sign.Document' requires attributes which are found in the context - { id, token, create_uid, state, request_item_states} that was lost when reloading. Now, { id, token, create_uid, state,
Original PR description
- Sign > Documents > Click on any of the Kanban record
- Reload the view (either reload the browser, or activate
the debug, or change to dark mode on the user menu).
Before this commit, on reloading the sign document page user was redirected back to kanban view. This occurs because, the client action 'sign.Document' requires attributes which are found in the context - { id, token, create_uid, state, request_item_states} that was lost when reloading.
Now, { id, token, create_uid, state, request_item_states} is put in the query string of the URL, in that way, when reloading, the client action 'sign.Document' will have the needed attributes. Note that, this is also the behavior of the base_import 'ImportAction' action [1].
task-4391729
[1] : https://github.com/odoo/odoo/pull/182744/commits/a6801ce4aa65cd023e2a762ab5c42755a4599c95
Forward-Port-Of: odoo/enterprise#77399task-4610498 Forward-Port-Of: odoo/enterprise#80929
Original PR description
task-4610498 Forward-Port-Of: odoo/enterprise#80929
49 changes
Enhancements to existing features
Japanese companies and contacts now see example formats for VAT and company registry fields, making it easier to enter the right identification numbers. The update also lets Odoo show country-specific company registry examples where useful in the future.
Original PR description
Add a reference VAT number for Japan using the format of a "Qualified Invoice Issuer Registration Number". This will appear as placeholder for the VAT field on the company and partner settings. Also implement the dynamic placeholder system for the company registry field in order to allow filling in placeholders for countries in which it would make sense to do so. Finally, add a placeholder for the company registry for japanese companies and partners. task-4366584 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Draft entries in the General Ledger report will now display a default name instead of appearing blank. This makes reports easier to read and helps users identify draft accounting entries more clearly.
Original PR description
This is an enhancment on the fix **e68f4a0214053e** It adds a default name for the draft entries in the general ledger report, instead of leaving the entry empty and not showing anything for it. This change is simillar to https://github.com/odoo-dev/enterprise/commit/5743dd52af1060bc0d2c5d16021428bfdc626140 opw-4609221
Resolved issues and error corrections
Users who leave a discussion call before responding to the browser microphone permission prompt will no longer trigger an error if they then deny permission. This makes call handling more reliable and avoids an unnecessary crash in the Mail app.
Original PR description
Before this commit, closing the microphone permission request outside of a call would result in a traceback. Steps to reproduce: 1. Start a call on a channel (observe the browser's microphone permission request pop-up) 2. Quit the call 3. Refuse the microphone permissions -> traceback This happens because the `joinCall` method waits for the permissions before accessing `selfSession` in `_initConnection`, if that happens after the call has ended it produces a traceback as there is no `selfSession`. This commit fixes the issue by moving the permission request after the `_initConnection`, thus ensuring that `selfSession` does not get accessed if there is no call.
The portal now safely handles salespeople who do not have an email address. This prevents affected users from seeing an error when logging in or viewing portal contact details.
Original PR description
Steps to reproduce: 1. Create a user partner without an email address. 2. Assign the newly created user as the salesperson of another user. 3. Log in with the user to trigger the traceback. Issue: Attempting to concatenate `False` with a string (`'mailto:'`) in the portal contact template caused a `TypeError`. Fix: Added `t-if="sales_user.email"` to ensure the email field is present before rendering the link. task-4458848 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes a form view issue where user avatar lookup fields ignored the setting meant to prevent opening linked records. Businesses can now reliably configure these fields to stay non-clickable when needed, improving consistency and control in forms.
Original PR description
The goal of this commit is to be able to use the option _no_open_ when displaying fields with the many2one_avatar_user widget in a form view (similar to #194845). Prior to this commit, the _no_open_ option was ineffective for fields using the many2one_avatar_user widget in form views if the view type was a form. This was because the _no_open_ option was overridden, and the expression `fieldInfo.viewType === "form"` was always used, regardless of the specified value for _no_open_. As a result, the field's behavior could not be customized to prevent opening. After this commit, the _no_open_ option is fully supported in this scenario. If the view type is not form, the canOpen expression will always evaluate to False, maintaining the expected behavior. However, when the view type is form, you can now explicitly use the _no_open_ option to control whether the field can be opened. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
A test in the Romanian stock e-invoicing area now checks whether the stock batch picking feature is installed before using it. This prevents false test failures in setups where that optional feature is not available, improving reliability without changing business workflows.
Original PR description
…lled in the test The test was failing when the module was not installed because it was trying to access the auto_batch field but AttributeError: 'stock.picking.type' object has no attribute 'auto_batch' , because we need to install the module to have the field available which is stock_picking_batch module. so I conditionally check if stock_picking_batch module is installed build_error-115361
The HTML editor table controls now appear when users hover over table header cells, not just regular cells. This fixes an editing inconsistency so users can manage tables with header rows more reliably.
Original PR description
**Problem**: The table menu doesn't appear when hovering over `th` elements. **Solution**: Treat `th` elements the same way as `td` to ensure the menu appears. **Steps to Reproduce**: 1. Setup an editor with the following HTML structure: `<table class="table table-bordered o_table">` ` <tbody>` ` <tr>` ` <th><div class="o-paragraph">Header 1</div></th>` ` <th><div class="o-paragraph">Header 2</div></th>` ` </tr>` ` <tr>` ` <td><div class="o-paragraph">Content 1</div></td>` ` <td><div class="o-paragraph">Content 2</div></td>` ` </tr>` ` </tbody>` `</table>` 2. Hover over "Header 1". 3. The table menu does not appear. opw-4610578 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents the event booth registration page from crashing when an expected page block is not present. It keeps the booking flow stable after recent website framework changes in Odoo 18.0.
Original PR description
Oversight of odoo/odoo@8a5019c5e576a4bd9ef745768de47bfab8d31a49 The previous versions of the code were using jQuery, which was compliant with the view element not existing. However, the FW to version 18.0 now uses native JavaScript. When switching to native JavaScript, we have to adapt the code to account for the selected block not existing to avoid a crash.
This fixes an issue where the anti-bot verification could fail to appear when an event sign-up form opens in a pop-up window. Visitors should now see the verification at the right time, helping them complete registrations without disruption.
Original PR description
[1] migrates jquery for event form modal display for the more standard modal.js component. This means the modal is not yet added to the document when `_addTurnstile` is added which makes rendering fail. We now wait for the modal to be shown before adding turnstile. [1]: 8510021c1b5395fb2cb134bbeab93ecd536ba5a6 task-4335141
This fix prevents the Danish localization update from failing when a specific tax record was previously deleted. It helps companies complete localization updates more reliably without needing to recreate removed tax entries.
Original PR description
to reproduce 1) install l10n_dk with minor version 1.2 in 18.0 2) delete tax `K-EU-Momsfritaget` from taxes while selecting l10n_dk company. 3) bump minor version and update. 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 internal automated tests for Odoo's base email server behavior after a recent change caused connection failures to surface unexpectedly. The update helps keep the test suite reliable, reducing the risk of future email-related regressions reaching users.
Original PR description
That were previously failing since this change https://github.com/odoo/odoo/commit/7aac5cecf198ed07fd6c71a0958f948512c50416#diff-d2dd39541c27864eca6e3d570d14208095c4c5509214e650bdc5bb8d69b5f672R40 making it so that the mail server refuses to connect https://github.com/odoo/odoo/blob/18.0/odoo/addons/base/models/ir_mail_server.py#L374 and later on raises an error as it returns None --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Report headers now keep company addresses on one line where appropriate, avoiding awkward breaks in generated PDF documents. This helps preserve a professional document layout across available report styles.
Original PR description
Steps: - Open Settings - Configure document layout - Set address to "123 avenue bois cambre" (just an example) - Choose a new layout, bubble for example Actual result: - Address is wrapped after "bois" without reason by wkhtmltopdf  Expected result: - Address is not wrapped Seems good for standard, bold and striped layout, Updating it to be aligned with other and to ensure no-wrap opw-4637433
When a user is archived, their linked sales team member record is now archived as well. This keeps sales team membership lists accurate and avoids inactive users appearing as active team members.
Original PR description
**How to reproduce:** - Create a user, assign it to a team (in multi-team, or not) - Archive this user - Open the list of members (CRM>Configuration in debug mode) - The team member has not been archived **Technical Reason:** When user is archived, its respective record in crm_team_member is not updated. **After this PR:** When user is archived, their linked sales team member will also be archived. Task-4617779
Fixes an accounting issue where creating a customer invoice payment could fail if the selected payment method had been left unnamed. This helps users complete payments reliably even when a payment method label is blank.
Original PR description
Steps to reproduce : - Open accounting and select the 3 dots on the top right corner of Bank in the dashboard - Select "Configuration" - In the Incoming Payments, for a payment method, change the name to an empty string - Make sure that this payment method has an "Outstanding Receipts accounts" - Open Customers/Invoices and open an invoice that is not paid - Click on "Pay" - Select the unamed payment method - Click on Create Payment Problem : An error message appears https://github.com/odoo/odoo/blob/9a27b53e6dacf7380dac6da5ae84f39f2812c9f7/addons/account/models/account_payment.py#L337 opw-4574452
Product images now display cleanly in dark mode without an unwanted white background beneath them. This improves visual consistency in the Field Service product catalog and other screens that use the same image display component.
Original PR description
Steps to reproduce: - Turn on dark mode - Open the Field Service app. - Click on "Add Product" to navigate to the product catalog. Issue: - An extra white background appears below the product image. Solution: - Updated the CSS to apply `--ImageField-background-color` directly to the `<img>` tag instead of the `.o_field_image` parent div. This prevents unwanted white spaces below the parent container The change has been applied globally to all `.o_field_image` elements, as the `.o_field_image` class is always on the parent `<div>`, not on the `<img>` tag. task-4302221
This fixes an issue where the vendor bills list could fail when duplicate-bill warning data was not yet available after an update. The list now checks that the data exists before using it, helping users continue reviewing bills without interruption.
Original PR description
In b2200c8928b240d78f2f24ced39a0d45c928a666, we added a feature to show a warning background in the vendor bills list view if it had duplicated. However, we had to add the field `duplicated_ref_ids` in the xml view so that we could use it in the JS part. However, this field will only be available in JS upon upgrading the `account` module. To avoid this, we now check that `duplicated_ref_ids` is defined before accessing its `count`. opw-none
This change prevents Odoo tests from failing when run with tools other than the default Python unittest runner, such as pytest. It improves compatibility for development and quality assurance workflows without changing business features or user-facing behavior.
Original PR description
## Description of the issue/feature this PR addresses: Allow other python test launcher than unittest back (this was introduced by this commit…
## Description of the issue/feature this PR addresses:
Allow other python test launcher than unittest back (this was introduced by this commit https://github.com/odoo/odoo/commit/ccf3c1ed3949f3307909678efe1245aa92ef752f) in odoo 18 only.
`wasSuccessful` function is injected by unitest launcher and not present while using pytest launcher (using pytest-odoo plugin)
## Current behavior before PR:
Tests failed with following error using pytest
```
def run(self, result):
testMethod = getattr(self, self._testMethodName)
if getattr(testMethod, '_retry', True) and getattr(self, '_retry', True):
tests_run_count = self._tests_run_count
else:
tests_run_count = 1
_logger.info('Auto retry disabled for %s', self)
quiet_log = None
for retry in range(tests_run_count):
result.had_failure = False # reset in case of retry without soft_fail
if retry:
_logger.runbot(f'Retrying a failed test: {self}')
if retry < tests_run_count-1:
with warnings.catch_warnings(), \
result.soft_fail(), \
lower_logging(25, logging.INFO) as quiet_log:
super().run(result)
if not (result.had_failure or quiet_log.had_error_log):
break
else: # last try
super().run(result)
> if not result.wasSuccessful() and BaseCase._tests_run_count != 1:
E AttributeError: 'TestCaseFunction' object has no attribute 'wasSuccessful'
.venv/lib/python3.12/site-packages/odoo/tests/common.py:339: AttributeError
```
## Desired behavior after PR is merged:
no errors raised from tests/common.py
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-prThis fixes an intermittent failure in a Web Studio automated tour caused by animations preventing the test from consistently finding the next step. The change helps keep automated checks stable, reducing false alarms during quality validation without changing user-facing behavior.
The Documents app now avoids loading embedded actions for folders a user cannot access. This prevents unnecessary access errors and helps users continue working smoothly when permissions limit folder visibility.
Original PR description
No need to fetch available embedded actions on inaccessible folders. FU of d391313e. Task-4525850
Fixes an issue where clicking a shared Documents link from a project note could show a missing action error instead of opening the document. Shared document links are now left to the normal redirect process, ensuring users reach the correct backend or portal page.
Original PR description
Steps to reproduce ================== - Install documents,project - Go to documents - Open any document - Click on share - Click on "Copy link" - Go to a project task - Click on a log note - Open the full composer - Type some text and select it - Paste the copied url - Post the log note - Click on the link => Missing Action: the action "..." does not exist Cause of the issue ================== Documents [redirects] `/odoo/documents/<access-token>` to either the backend or the portal. There is a global click handler in the router that intercepts click on links to update and push the router state. Solution ======== We should not handle those links, the http redirection will take care of it. --- [redirects]: https://github.com/odoo/enterprise/blob/882e4453c8eadae8e39ea02314377c617d3b9e0f/documents/controllers/home.py#L24 opw-4611260
The trash folder now hides unnecessary action buttons so users only see the Download option when viewing deleted documents. This reduces confusion and keeps available actions aligned with what can actually be done from the trash.
Original PR description
Specs: When documents are in the trash folder, no actions are required except for the Download button, which remains visible. After this commit: Remove action buttons from the control panel in the trash folder. Task-4574919
The Field Service product catalog no longer shows a blank image placeholder when a product has no image. This keeps the catalog consistent with the Sales app and avoids visual clutter, especially in dark mode.
Original PR description
Steps to reproduce: - Turn on dark mode - Open the Field Service app. - Click on "Add Product" to navigate to the product catalog. Issue: - An image placeholder appears when no image is set for a product. This behavior is inconsistent with the product catalog page in the Sales app. Solution: - Removed the XPath that adds the image placeholder in the product catalog. task-4302221
This fixes an unstable automated test in Odoo Studio that could fail even when the product was working correctly. The change helps keep validation results consistent, reducing false alarms during development and release checks.
Miscellaneous changes
### Steps to reproduce * install `mass_mailing` * send an email with the "Training" template You will see that the "unsubscribe" link does not appear in the email that is sent opw-4615170 Forward-Port-Of: odoo/odoo#200342
Original PR description
### Steps to reproduce * install `mass_mailing` * send an email with the "Training" template You will see that the "unsubscribe" link does not appear in the email that is sent opw-4615170 Forward-Port-Of: odoo/odoo#200342
## Summary 1. `--test-tags ".test_js[mail > widgets]"` will start all test_js starting with "mail > widgets" 2. `--test-tags "/web,-.test_js[Components > CheckBox]"` will start all web test, but skip Components > CheckBox qunit 3. ` --test-tags ".test_js[utils,-utils > Hooks,-utils > Patch]"` start all test_js utils tests except the Hooks and Patch ones 4. `--test-tags "-.test_js[Components > CheckBox]"` will start **all** tests, but skip Components > CheckBox qunit ## Motivation Tag
Original PR description
## Summary 1. `--test-tags ".test_js[mail > widgets]"` will start all test_js starting with "mail > widgets" 2. `--test-tags "/web,-.test_js[Components > CheckBox]"` will start all web test, but skip…
## Summary
1. `--test-tags ".test_js[mail > widgets]"` will start all test_js starting with "mail > widgets"
2. `--test-tags "/web,-.test_js[Components > CheckBox]"` will start all web test, but skip Components > CheckBox qunit
3. ` --test-tags ".test_js[utils,-utils > Hooks,-utils > Patch]"` start all test_js utils tests except the Hooks and Patch ones
4. `--test-tags "-.test_js[Components > CheckBox]"` will start **all** tests, but skip Components > CheckBox qunit
## Motivation
Tags are used by runbot to *disable* randomly failing tests without the need to commit changes.
They can precisely target a python test method, class or module.
They can also be used by developer to run a *specific* test.
The problem is that the qunit is a special case, a js test suite inside the test_suite. It is only possible to disable all of them, or none of them.
Adding the possibility to enable/disable some of them was requested for a long time.
## Using test tags
The solution to use test-tags as multiple pros:
- avoid a new command line argument
- runbot already manages test-tags for errors meaning that this solution would imply minimal changes on this side
- passing arguments to a specific tests, without regard of the qunit needs looks like a decent solution. This is a generic solution that could lead to other posibilities (profiling, test mode, ...)
Test tags are not aware of the purpose of the parameters, they will only be passed to the test. The tests has the responsibility to parse them.
## Chosen syntax and behavior
The main need is to be enable/disable some qunit. This means that we may want to support having parameters using comma `,` Unfortunately this may conflict with comma used to split tags if the syntax is not well defined.
The main idea to solve this issue was that it would be intuitive to give parameters as a function call would, between parentheses.
The opening and closing of the parentheses would allow to identify if a comma is part of the parameters or a tag separator. But using parenthesis is not a good idea in a command line since it could be interpreted by the shell.
The chosen alternative was to use `[]` to have a opening and closing symbol. Depending on how the parameters are interpreted, it can also be quite intuitive to understand: we select a specific element.
`.test_js[mail,stock]`
to run only js tests concerning mail and stock.
The idea to disable some qunit would be to specify a negative filter as for tags:
`.test_js[-some_module]`
Multiple matching tags may be given, in this case all parameters are given to the test. This is why test_parameters are a list of strings.
`.test_js[-m1,-m2],.test_js[-m3]` will be given to the test as `['-m1,-m2', '-m3']`
## Splitting the tags
The idea to support nested [] in params was considered but this would complexify a lot the parsing
`.test_method[filters=[mail,crm],failfast=0]`
This is NOT supported even if it could be.
Parsing such tags would need a more complex parser (to split the , )
The final decision was made to keep it simple for now since it wouldn't be a problem to add this in the future if needed.
## Negating a parametric tag
A test tag can be negated to disable a test `-.test_js` (no op if test_js was not expected to run)
The question is, what is the expected behaviour of `-.test_js[mail]`.
### 1. Forbid this form
Simple solution, consider it as disabling a test, so passing the parameters would be usellesss and we should just don't allow that. But forbidding this form may force to make some complex development in runbot, since the current logic to disable a test is to add a '-' in front of the tag extected to run the test.
### 2. Transform it to negate the parameter
It could be as simple as transforming `-.test_js[mail]` to `.test_js[-(mail)]`, or to manage the case when we could have already negated arguments (and multiple ones), tansform it to `.test_js[-mail-]`
The only cons of this solution is that adding the tag -.test_js[mail] would actually enable the test_js even if it is not the case, and be more equivalent to `.test_js,.test_js[-mail]`
### 3. Consider them apart: negated but not including.
With this last solution, it is not possible to translate it as a tag, it would mean `.test_js[-mail]` if test_js is already enabled. This is whats looks to be the most robust solution. Adding a negated test-tag should not enable a test that wouldn't if not present
### 4. Always considered as parameters
`.test_js[mail]` would not enable test_js, but pass mail as parameter to test_js if another test enables it.
This means that to start the mail js test, we would use --test-tags .test_js,.test_js[mail]
This could make sence but would be less practical.
Since the main goal is to be able to disable a specific qunit from the runbot, 2, 3 and 4 could work in most cases
but 2 could be problematic in edge cases, and for odoosh were we may want to use autotags but only enable test from one module. /my_module,.test_js[-some_test] would enable the test_js.
3 and 4 are equivalent for negation, but the automatic generation of config wouldn't work with 4.
The current chosen solution is 3 since it looks to be the more practical.
Forward-Port-Of: odoo/odoo#200960
Forward-Port-Of: odoo/odoo#200413- Open a record (e.g., a project task); - Add a tag to a `many2many_tags` field; - Remove the previously added tag; - The record should be dirty (the save icon should be visible); - Click on the save icon/or click to pager next. Before this commit, the UI does nothing. It doesn't save, or it doesn't go to the next record if you click on the pager next. This is because even if the record is considered dirty, because some changes have been made (adding and removing tags), there are no ch
Original PR description
- Open a record (e.g., a project task); - Add a tag to a `many2many_tags` field; - Remove the previously added tag; - The record should be dirty (the save icon should be visible); - Click on the save icon/or click to pager next. Before this commit, the UI does nothing. It doesn't save, or it doesn't go to the next record if you click on the pager next. This is because even if the record is considered dirty, because some changes have been made (adding and removing tags), there are no changes. And a condition prevents to call the `web_save` RPC from being called if there are no changes. If the `web_save` RPC is not called, we do nothing. In this commit, we change this condition so that if the `web_save` RPC is not called, we mark the record as not dirty. When we move to another record (pager next), we do not need to mark the current record as not dirty, but the next record is loaded. Forward-Port-Of: odoo/odoo#201053 Forward-Port-Of: odoo/odoo#200549
A [commit](https://github.com/odoo/odoo/pull/192524/commits/2694f9f9bfb8d3d92bd4618e041359150e1ba501) added a test that was failing when running it with demo data. It was due to a tax unnecessary for the test that was present with demo data. This commit ensures the test is run with no tax applied. opw-4389303 Forward-Port-Of: odoo/odoo#200893
Original PR description
A [commit](https://github.com/odoo/odoo/pull/192524/commits/2694f9f9bfb8d3d92bd4618e041359150e1ba501) added a test that was failing when running it with demo data. It was due to a tax unnecessary for the test that was present with demo data. This commit ensures the test is run with no tax applied. opw-4389303 Forward-Port-Of: odoo/odoo#200893
To reproduce: 1) install with any chart of accounts. 2) delete account with account_type equity_unaffected(Current Year Earnings). 3) add custom account with type equity_unaffected. 4) load chart of templates by bumping minor version with a local upgrade script. we should only have one account with equity_unaffected per company, otherwise we violate `_check_account_type_unique_current_year_earning` constraint. Description of the issue/feature this PR addresses: Current beh
Original PR description
To reproduce: 1) install with any chart of accounts. 2) delete account with account_type equity_unaffected(Current Year Earnings). 3) add custom account with type equity_unaffected. 4) load chart of templates by bumping minor version with a local upgrade script. we should only have one account with equity_unaffected per company, otherwise we violate `_check_account_type_unique_current_year_earning` constraint. 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#201073
**Steps:** - Install Ecom - Add some products to the cart - Go to my/orders - select any order then click on Order again - Click on the Add To Cart button - You'll see one confirmation dialog, click on the close button of that dialog **Issue:** - By clicking on close dialog should get closed but instead, products are added in the cart **Cause:** - Default close method provided in the setup method of the confirmation dialog component **Fix:** - While extending the confirmation d
Original PR description
**Steps:** - Install Ecom - Add some products to the cart - Go to my/orders - select any order then click on Order again - Click on the Add To Cart button - You'll see one confirmation dialog, click on the close button of that dialog **Issue:** - By clicking on close dialog should get closed but instead, products are added in the cart **Cause:** - Default close method provided in the setup method of the confirmation dialog component **Fix:** - While extending the confirmation dialog we overwrite the default close method defined in Confirmation Dialog component affected version-16.0 opw-4566505 Forward-Port-Of: odoo/odoo#199837 Forward-Port-Of: odoo/odoo#199567
On the amount field, the tip for percentage amount was always displayed, whether the percentage or fixed amount option was selected. Fwd port of https://github.com/odoo/odoo/commit/c63f6c2308ab9d0c7216b592c7873a6db24f0378 16.0 PR : https://github.com/odoo/odoo/pull/200919 Forward-Port-Of: odoo/odoo#201052 Forward-Port-Of: odoo/odoo#200928
Original PR description
On the amount field, the tip for percentage amount was always displayed, whether the percentage or fixed amount option was selected. Fwd port of https://github.com/odoo/odoo/commit/c63f6c2308ab9d0c7216b592c7873a6db24f0378 16.0 PR : https://github.com/odoo/odoo/pull/200919 Forward-Port-Of: odoo/odoo#201052 Forward-Port-Of: odoo/odoo#200928
When installing l10n_dk_audit_trail module, the audit trail option wasn't checked by default task-4575368 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200709 Forward-Port-Of: odoo/odoo#198355
Original PR description
When installing l10n_dk_audit_trail module, the audit trail option wasn't checked by default task-4575368 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#200709 Forward-Port-Of: odoo/odoo#198355
This commit adds a check to prevent deprecating an account that is used in tax distribution lines. It serves as an indirect fix to avoid future issues in other contexts. For example, in the Italian EDI flow, if an XML bill includes a tax with a distribution line linked to a deprecated account, an error will be raised by the following code: https://github.com/odoo/odoo/blob/cc3a060e67a2f1015ea02b589dcf6a7e7eff1e90/addons/account/models/account_move_line.py#L1478 This commit aims to minimize s
Original PR description
This commit adds a check to prevent deprecating an account that is used in tax distribution lines. It serves as an indirect fix to avoid future issues in other contexts. For example, in the Italian EDI flow, if an XML bill includes a tax with a distribution line linked to a deprecated account, an error will be raised by the following code: https://github.com/odoo/odoo/blob/cc3a060e67a2f1015ea02b589dcf6a7e7eff1e90/addons/account/models/account_move_line.py#L1478 This commit aims to minimize such issues by preventing them as early as possible. Steps to reproduce: - Try to deprecate an account that is used in tax distribution lines. Forward-Port-Of: odoo/odoo#197521
This error occurs when user deletes the Picking Operations action. Steps to Reproduce : - Install the `Stock` module. - Navigate to Settings > Technical > Actions. - Search for `Picking Operations` in the list of actions. - Delete the `Picking Operations` action. - Go to Inventory > Operations and open any `Receipt`. - Click on the `Print` button. ValueError: External ID not found in the system: stock.action_report_picking This error occurs when the system attempts to access the
Original PR description
This error occurs when user deletes the Picking Operations action. Steps to Reproduce : - Install the `Stock` module. - Navigate to Settings > Technical > Actions. - Search for `Picking Operations` in the list of actions. - Delete the `Picking Operations` action. - Go to Inventory > Operations and open any `Receipt`. - Click on the `Print` button. ValueError: External ID not found in the system: stock.action_report_picking This error occurs when the system attempts to access the Picking Operations action, but it has been deleted. To resolve this issue, restrict the deletion of the `Picking Operations` report from the `ir actions`, to ensure that users cannot delete it (except during the module uninstallation), and also raise a user error for already existing DBs where `Picking Operations` has been deleted. Sentry - 6302556324 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#198796
In [1] when the web client was rewritten in OWL, the `noContextKeys` parameter behavior was lost (only the `shadow` `settings` was used). In [2] the `_rpc` was overridden, losing the `noContextKeys` parameter. Because of each of these, even though the HTML Editor always fetched a `en_US` version of the page for edition, upon save, the current user's language was being used upon save, leading to the loss of translations. This commit fixes the issue by removing the mentioned keys from the co
Original PR description
In [1] when the web client was rewritten in OWL, the `noContextKeys` parameter behavior was lost (only the `shadow` `settings` was used). In [2] the `_rpc` was overridden, losing the `noContextKeys`…
In [1] when the web client was rewritten in OWL, the `noContextKeys` parameter behavior was lost (only the `shadow` `settings` was used). In [2] the `_rpc` was overridden, losing the `noContextKeys` parameter. Because of each of these, even though the HTML Editor always fetched a `en_US` version of the page for edition, upon save, the current user's language was being used upon save, leading to the loss of translations. This commit fixes the issue by removing the mentioned keys from the context in the `legacyEnv.session.rpc` rather than getting rid of that parameter completely because since [3] the user context is always included in the rpc context - which would restore the language. Steps to reproduce: - Set user's language to Dutch. - Add Dutch as the default language of a website. - Create a new Dutch page. - Drop an accordion snippet. - Switch website preview to English. - Translate the first title. - Save. - Edit the page with the HTML Editor (English version is edited). - Make some minor change, even adding a space is enough. - Save. => Dutch text was lost and replaced by the last saved version. [1]: https://github.com/odoo/odoo/commit/0573acae2306bf5da2005852da9323ddc59e5431#diff-851c304e3f2a64138c1ff0f3de9856184dbfa0114da3fd76af0309eabe72043eR134 [2]: https://github.com/odoo/odoo/commit/55f1680c74d3b64c3319ba114f7ba3e3f7b49be3 [3]: https://github.com/odoo/odoo/commit/2192480ed1262a13db8e6b0dd945ea91dee91aa9 opw-3493355 Forward-Port-Of: odoo/odoo#200798 Forward-Port-Of: odoo/odoo#142894
During the upgrade tests the test module will start with `odoo.upgrade` instead of `odoo.addons` Fixing the canonical tag to work in both cases. Forward-Port-Of: odoo/odoo#200942
Original PR description
During the upgrade tests the test module will start with `odoo.upgrade` instead of `odoo.addons` Fixing the canonical tag to work in both cases. Forward-Port-Of: odoo/odoo#200942
We call NotSupportedError with the keyword "new" in order to avoid this kind of errors in py_js: UncaughtPromiseError > TypeError Uncaught Promise > Class constructor NotSupportedError cannot be invoked without 'new' ... Forward-Port-Of: odoo/odoo#200971
Original PR description
We call NotSupportedError with the keyword "new" in order to avoid this kind of errors in py_js: UncaughtPromiseError > TypeError Uncaught Promise > Class constructor NotSupportedError cannot be invoked without 'new' ... Forward-Port-Of: odoo/odoo#200971
Before this commit, the total for each group or the grand total displayed in the list view of task for the progress field is formatted as a float instead of a percentage. The reason is because the framework does not find the formatter associated to that widget and so we will take the default formatter for float field. This commit adds a formatter for the widget to be sure the framework formats the total displayed in the list view in percentage. Forward-Port-Of: odoo/odoo#200932
Original PR description
Before this commit, the total for each group or the grand total displayed in the list view of task for the progress field is formatted as a float instead of a percentage. The reason is because the framework does not find the formatter associated to that widget and so we will take the default formatter for float field. This commit adds a formatter for the widget to be sure the framework formats the total displayed in the list view in percentage. Forward-Port-Of: odoo/odoo#200932
Currently if you change the type of a combo product to something else, the combo_ids are still saved and in the pos it will use them and open a selection popup. Steps to reproduce: ------------------- * Go in the products * Select Burger Combo * Change the type to "Goods" and save * Open restaurant * Select burger combo > Observation: Selection popup for combo ids appears. Why the fix: ------------ When changing the type of product we remove the combo_ids from the product form. Wi
Original PR description
Currently if you change the type of a combo product to something else, the combo_ids are still saved and in the pos it will use them and open a selection popup. Steps to reproduce: ------------------- * Go in the products * Select Burger Combo * Change the type to "Goods" and save * Open restaurant * Select burger combo > Observation: Selection popup for combo ids appears. Why the fix: ------------ When changing the type of product we remove the combo_ids from the product form. Without combo_ids no popup appears. opw-4513392 Forward-Port-Of: odoo/odoo#200654 Forward-Port-Of: odoo/odoo#198743
This commit fixes the following issues: - Only re-raise `InsufficientCreditError` from IAP. `UserError`, `AccessError` and `ReadTimeout` shouldn't be re-raised, they should considered as an internal error of the IAP server. - Instead of raising a `requests.exceptions.ConnectionError` in case of an unknown error from IAP (which didn't make much sense), it will now raise a `IAPServerError` - The logging level has been changed from `exception` to `warning`. There is indeed no useful information
Original PR description
This commit fixes the following issues: - Only re-raise `InsufficientCreditError` from IAP. `UserError`, `AccessError` and `ReadTimeout` shouldn't be re-raised, they should considered as an internal error of the IAP server. - Instead of raising a `requests.exceptions.ConnectionError` in case of an unknown error from IAP (which didn't make much sense), it will now raise a `IAPServerError` - The logging level has been changed from `exception` to `warning`. There is indeed no useful information in the logged traceback as the interesting part is in the traceback on the IAP server logs. Forward-Port-Of: odoo/odoo#200948 Forward-Port-Of: odoo/odoo#199286
Forward-Port-Of: odoo/odoo#199458
Original PR description
Forward-Port-Of: odoo/odoo#199458
This reverts commit aef59e06d8d0ba388cd781fd9a9511d6ff74ea05. It was wrongly assumed that `_getRpcParameters` was useless in `s_dynamic_snippet_products`. It adds a parameter `productTemplateId` to the request to `/website/snippet/filters` which is used by `ir.actions.server`: - `dynamic_snippet_accessories_action`, - `dynamic_snippet_recently_sold_with_action`, - `dynamic_snippet_alternative_products`. Forward-Port-Of: odoo/odoo#201158
Original PR description
This reverts commit aef59e06d8d0ba388cd781fd9a9511d6ff74ea05. It was wrongly assumed that `_getRpcParameters` was useless in `s_dynamic_snippet_products`. It adds a parameter `productTemplateId` to the request to `/website/snippet/filters` which is used by `ir.actions.server`: - `dynamic_snippet_accessories_action`, - `dynamic_snippet_recently_sold_with_action`, - `dynamic_snippet_alternative_products`. Forward-Port-Of: odoo/odoo#201158
**Description of the issue/feature this PR addresses**: If "Product Price" Decimal Accuracy has more than 2 digits, then the unit price on the printed report has only 2 digits when Argentinean invoice report is printed and this causes that quantity * price on each invoice line does not result the amount shown on the "Amount" column. **Steps to reproduce**: 1) Log ing with admin user on runbot odoo enterprise 16 instance, activate developer mode and install l10n_ar module. 2) Take positio
Original PR description
**Description of the issue/feature this PR addresses**: If "Product Price" Decimal Accuracy has more than 2 digits, then the unit price on the printed report has only 2 digits when Argentinean…
**Description of the issue/feature this PR addresses**: If "Product Price" Decimal Accuracy has more than 2 digits, then the unit price on the printed report has only 2 digits when Argentinean invoice report is printed and this causes that quantity * price on each invoice line does not result the amount shown on the "Amount" column. **Steps to reproduce**: 1) Log ing with admin user on runbot odoo enterprise 16 instance, activate developer mode and install l10n_ar module. 2) Take position on company "Responsable Inscripto", go to menu "Setting / Technical / Database Structure / Decimal Accuracy" and set 4 digits for "Product Price".  3) Create customer invoice to partner "Consumidor Final Anónimo" (if the partner is "Consumidor Final Anónimo" then taxes are not discriminated on the printed invoice report --> document type = "FACTURAS B"). The invoice must have an invoice line with product price with 4 digits, for example: quantity 3000, price 65.3057 and tax "IVA 21%".  4) Confirm and print the invoice  The result of quantity * price is not the amount shown on the printed invoice (3000 * 79.03 != 237059.69) **Current behavior before PR**: If "Product Price" Decimal Accuracy has more than 2 digits, then the unit price on the printed report has only 2 digits when Argentinean invoice report is printed and this causes that quantity * price on each invoice line does not result the amount shown on the amount column. **Desired behavior after PR is merged**: If "Product Price" Decimal Accuracy has more than 2 digits, then the unit price on the printed report has the same quantity of digits set on "Product Price" Decimal Accuracy when Argentinean invoice report is printed. Ticket Adhoc side: 77471 Task latam: 1226 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#199859 Forward-Port-Of: odoo/odoo#171131
To reproduce: - create two repeating planning.slot records, Shift A and Shift B - delete Shift A and all of its repeats - delete only the last repeat of Shift B - run the "Planning: generate next recurring shifts" scheduled action - Cron fails with "record is missing or deleted" error Problem: The function to create the repeat shifts (planning.recurrency _repeat_slot) iterates over recurrences and deletes them if there are 0 existing shifts linked to them (i.e. Shift A's reccurency). On
Original PR description
To reproduce: - create two repeating planning.slot records, Shift A and Shift B - delete Shift A and all of its repeats - delete only the last repeat of Shift B - run the "Planning: generate next recurring shifts" scheduled action - Cron fails with "record is missing or deleted" error Problem: The function to create the repeat shifts (planning.recurrency _repeat_slot) iterates over recurrences and deletes them if there are 0 existing shifts linked to them (i.e. Shift A's reccurency). On a subsequent loop iteration, an attempt is made to access the company_id field of the recordset (self) which will now contain a deleted planning.recurrency record, causing the missing record error. Solution: Access the company_id field on the current iterated planning.recurrency record instead of the 'self' recordset. opw-4457844 Forward-Port-Of: odoo/enterprise#81166
Steps to reproduce: - 1. Activate audit trail. 2. Make a customer invoice with start and end date [end date should be in future months], and post. 3. Reset the invoice to draft - Result: All deferred entries are reversed with new entries at the date of the reset to draft. The unposted deferred entries are still there with auto post At Date. Cause: - Audit trail alone doesn't prevent the moves from being deleted if they were not posted before, so the check shouldn't be only on the com
Original PR description
Steps to reproduce: - 1. Activate audit trail. 2. Make a customer invoice with start and end date [end date should be in future months], and post. 3. Reset the invoice to draft - Result: All deferred entries are reversed with new entries at the date of the reset to draft. The unposted deferred entries are still there with auto post At Date. Cause: - Audit trail alone doesn't prevent the moves from being deleted if they were not posted before, so the check shouldn't be only on the company_id.check_account_audit_trail, but also we should consider move.posted_before and if not, it should be deleted not reversed. Fix: - Replace the company_id.check_account_audit_trail check with _is_protected_by_audit_trail() which includes checking if the move is posted before or not. opw - 4562732 Forward-Port-Of: odoo/enterprise#81061
Multiple problems can arise when a project has the documents feature enabled but no folder linked to it. This PR fixes two edge cases related to projects not having a folder. Task-4107728 Forward-Port-Of: odoo/enterprise#78825 Forward-Port-Of: odoo/enterprise#68688
Original PR description
Multiple problems can arise when a project has the documents feature enabled but no folder linked to it. This PR fixes two edge cases related to projects not having a folder. Task-4107728 Forward-Port-Of: odoo/enterprise#78825 Forward-Port-Of: odoo/enterprise#68688
In case of having two lines with the same product, the cfdi field `ValorUnitarioAduana` is wrong, it is set as the total of the two lines. With this commit, we set it as the average of the lines. Steps (with demo data, company `ESCUELA ...`): - Partner "Azure Interior" -> change `Tax ID` from `US12345677` to `123456779` - Product `[E-COM06]` -> - `UNSPC Catgegory`: `01010101` - `Tariff Fraction`: `0101290200` - `UMT Aduana`: `Units` - Make an invoice: - Currency: USD - Two lines for pro
Original PR description
In case of having two lines with the same product, the cfdi field `ValorUnitarioAduana` is wrong, it is set as the total of the two lines. With this commit, we set it as the average of the lines. Steps (with demo data, company `ESCUELA ...`): - Partner "Azure Interior" -> change `Tax ID` from `US12345677` to `123456779` - Product `[E-COM06]` -> - `UNSPC Catgegory`: `01010101` - `Tariff Fraction`: `0101290200` - `UMT Aduana`: `Units` - Make an invoice: - Currency: USD - Two lines for product `[E-COM06]` - Incoterm: `[EXW] EX WORKS` - External Trade: `Definitive` - Confirm and sent to cfdi -> Error opw-4596628 Forward-Port-Of: odoo/enterprise#81099 Forward-Port-Of: odoo/enterprise#80660
We support sending credit transfers using ISO 20022 to accommodate non SEPA bank transfers (any party having no IBAN number). However when generating the XML file, we assumed that our company always had an IBAN number and put it in an IBAN node. For non IBAN numbers however we need to put it in another node. This commit fixes that. [opw-4585994](https://www.odoo.com/odoo/project.task/4585994) Forward-Port-Of: odoo/enterprise#80757
Original PR description
We support sending credit transfers using ISO 20022 to accommodate non SEPA bank transfers (any party having no IBAN number). However when generating the XML file, we assumed that our company always had an IBAN number and put it in an IBAN node. For non IBAN numbers however we need to put it in another node. This commit fixes that. [opw-4585994](https://www.odoo.com/odoo/project.task/4585994) Forward-Port-Of: odoo/enterprise#80757
- Sign > Templates > Click on any of the kanban record - Reload the view (either reload the browser, or activate the debug, or change to dark mode on the user menu). Before this commit, on reloading the sign template page user was redirected back to kanban view. This occurs because, the client action 'sign.Template' required template_id (found in the context) that was lost when reloading. Now, template_id is put in the query string of the URL, in that way, when reloading, the client ac
Original PR description
- Sign > Templates > Click on any of the kanban record - Reload the view (either reload the browser, or activate the debug, or change to dark mode on the user menu). Before this commit, on reloading the sign template page user was redirected back to kanban view. This occurs because, the client action 'sign.Template' required template_id (found in the context) that was lost when reloading. Now, template_id is put in the query string of the URL, in that way, when reloading, the client action 'sign.Document' will have the needed template_id. Note that, this is also the behavior of the base_import 'ImportAction' action [1]. task-4391729 [1] : https://github.com/odoo/odoo/pull/182744/commits/a6801ce4aa65cd023e2a762ab5c42755a4599c95 Forward-Port-Of: odoo/enterprise#77400
[FIX] l10n_ar: price unit precision digits on invoice report. This pr was created to adapt l10n_ar_reports/tests/IVA_Ventas.txt and l10n_ar_reports/tests/Ventas.txt files to the changes of https://github.com/odoo/odoo/pull/171131/commits/95bd2d3677f6b534e9eb660e9757e87cf778d7b5 Ticket Adhoc side: 77471 Task latam: 1226 Forward-Port-Of: odoo/enterprise#80501 Forward-Port-Of: odoo/enterprise#77800
Original PR description
[FIX] l10n_ar: price unit precision digits on invoice report. This pr was created to adapt l10n_ar_reports/tests/IVA_Ventas.txt and l10n_ar_reports/tests/Ventas.txt files to the changes of https://github.com/odoo/odoo/pull/171131/commits/95bd2d3677f6b534e9eb660e9757e87cf778d7b5 Ticket Adhoc side: 77471 Task latam: 1226 Forward-Port-Of: odoo/enterprise#80501 Forward-Port-Of: odoo/enterprise#77800