Wednesday, June 4, 2025
76 changes · master
Enhancements to existing features
This update simplifies how Odoo applies internal Python compatibility patches and makes the process easier to maintain. It should not change day-to-day behavior for users, but it reduces upkeep and lowers the risk of future maintenance mistakes.
Original PR description
- Add toplevel docstring to explain workings, remove unnecessary (and outdated) docstring on `patch_module`. - Make the patcher auto-discover submodules via `pkgutil`, avoids needing to duplicate the submodule creation and the declaration. - Remove unnecessary top-level reification of the patcher, it can be called inline in either `add_hook` or `exec_module`. - Remove unnecessary / outdated `noqa` statements.
The remaining days field now uses a standard date formatting method to show relative dates such as today, tomorrow, or days ago. This makes date labels more complete and consistent for users across the web interface.
Original PR description
We used a manual implementation of relative dates (today, yesterday, tomorrow + in x days / x days ago). This commit uses luxon `toRelativeCalendar()` datetime method instead, which is more complete. task: 4818888
This change adds an optional way to collect performance information during Odoo startup, installation, and test runs without changing application code. It helps teams spot major slowdowns in long-running automated jobs, such as nightly testing, while using safer defaults to reduce the risk of excessive memory use.
Original PR description
Being able to profile the install or tests without to much modifications in the code can be needed, especially to have a nightly profiling the code every night. Since the total install and test can be very long, using the default profiler parameters would most likely lead to memory errors. This is why this default profiler doesn't profile sql and has a low frequency. The information is still statistically relevant to identify the big pieces. Note that profiling the registry loading in order to have one profile per module could also be useful, but this is not implemented here. The profiler is activated by setting the environment variable `ODOO_PROFILE_PRELOAD` to `1`. The other environment variables `ODOO_PROFILE_PRELOAD_SQL` and `ODOO_PROFILE_PRELOAD_INTERVAL` can be used to tweak the profiling collectors parameters.
The mail module now shows a clear, human-readable error when unsupported single-ID record data is entered. This helps developers and support teams identify the exact model and field causing the issue, reducing debugging time and avoiding confusing system errors.
Original PR description
Before this commit, when using a single-id data insertion on a Model that doesn't support it, it throws the following error message: ``` TypeError: can't convert symbol to string ``` This happens because the model doesn't support single-id data syntax, e.g. `message.author = 1` for setting persona with id "1". A persona needs both id and type because a partner and guest can have same id but differs only by the type. For information, the error message tries to convert symbol to string because the id or non-single id Models is an array that contains the field names and the special AND/OR symbols. With this commit, the message error explicitly names the model and field with problematic value being attempted to insert, and also mentions this is a failed attempt to use single-id data syntax that is unsupported on the target model.
This update makes shared editor functionality easier to reuse across the website and backend by removing duplicate technical code and adjusting editor asset dependencies. It helps frontend features load the right editor tools more consistently, including point-of-sale appointment pages.
Original PR description
There are multiple duplicates of the `uuid` function, presumably because it is sometimes needed in frontend and was defined in `/web/views`. Update the usage of the function to import it from `/web/core` Adapt `pos_appointment` manifest after the `html_editor.assets_editor` was updated to be importable with `assets_frontend` task-4801746
This change updates internal tests for WhatsApp-related discussion channel behavior to stay aligned with recent platform changes. It helps maintain reliability and reduce the risk of regressions without changing day-to-day user workflows.
Original PR description
PR community: https://github.com/odoo/odoo/pull/212671 task-4829587
Resolved issues and error corrections
Fixed a visual glitch that could appear when assigning owners in activity views. This keeps affected screens aligned and easier to use across Fleet and related activity-based views.
Original PR description
**Before this PR:** There is a UI glitch in the activity view during owner assignment. See-https://www.awesomescreenshot.com/image/54530043?key=326a3d74f8d12ed55708afa79ce3efac **A few impacted views:** fleet_vehicle_log_contract_view_activity helpdesk_ticket_view_activity hr_applicant_view_activity project_project_view_activity survey_survey_view_activity **Technical:** Since the default display property of a <span> is inline, it also prevents the width property from taking effect, so it doesn't correctly support properties such as margin-right here, leading to layout issues. Applying d-flex fixes the layout problem. Related ENT PR-https://github.com/odoo/enterprise/pull/82203 **Task**-4637016
Miscellaneous changes
Before this commit, if GeoIP was enabled and no country was provided, the geolocation was used automatically. As a result, it was not possible to view partners from all countries. Now, we restore the previous logic by explicitly passing a parameter to show all countries. Note: On runbot, no difference is visible since GeoIP is not enabled. Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I
Original PR description
Before this commit, if GeoIP was enabled and no country was provided, the geolocation was used automatically. As a result, it was not possible to view partners from all countries. Now, we restore the previous logic by explicitly passing a parameter to show all countries. Note: On runbot, no difference is visible since GeoIP is not enabled. 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#212558
This fix lets Odoo handle missing view references without always triggering an error. It helps reduce unnecessary failures and allows parts of the system, such as website views, to continue or manage the missing view case more smoothly.
Original PR description
**Before Commit:** Previously, the `_get_view_id` and `_get` methods would always raise an exception when the view reference could not be found. **After Commit:** This commit adds `raise_if_not_found` parameter (default: True) to both methods. If `raise_if_not_found=False` is passed, the methods return `None` instead of raising an error, allowing to handle the case where the view is missing. Sentry - 5715762959
The employee card view no longer shows two delete buttons when the Timesheets app is installed. This prevents confusion for HR users and keeps the employee interface clean and consistent.
Original PR description
Description of the issue/feature this PR addresses: In this PR, we removed the duplicated delete button from the hr employee kanban view when the timesheet app is installed. Root Cause: We missed to inherit the hr employee kanban view within the hr timehseet. Current behavior before PR:  Desired behavior after PR is merged:  Related task: 4843996 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Alternative requests for quotation now automatically use the selected vendor's payment terms. This helps purchasing teams avoid incorrect or missing payment conditions when comparing suppliers.
Original PR description
Issue Before This Commit: ============================ When creating an alternative RFQ, the payment terms of the vendor were not set on the RFQ. Steps to Reproduce: ============================ - Install the purchase_requisition module. - Set different payment terms for two different vendors. - Create an RFQ with the first vendor and observe that the payment terms are set correctly. - Create an alternative RFQ for the second vendor, and notice that the payment terms are not set. With This Commit: ============================ This commit ensures that when creating an alternative RFQ, the payment terms are correctly set based on the vendor. Now, the payment terms will be consistently applied to the RFQ as per the vendor's configuration. task - [4633270](https://www.odoo.com/odoo/my-tasks/4633270)
The web time picker now handles empty values correctly, showing a blank field instead of causing display or update issues. This improves form reliability when a time is optional and also supports clearer placeholder text.
Original PR description
The TimePicker component now allows for falsy values (`false`, `null` and `undefined`) which is simply displayed as an empty input. This commit also adds placeholder customization and fixed a bug where setting the value from the props did not always properly update the input. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update fixes minor issues in the website editor after a recent refactoring. It restores correct behavior for selecting snippets and makes image shape options easier for design themes to customize.
Original PR description
[FIX] website: export image shape option plugin In order to be patchable (in particular by design themes), the `ImageShapeOptionPlugin` plugin has been exported. Related to task-4367641 runbot-223813…
[FIX] website: export image shape option plugin In order to be patchable (in particular by design themes), the `ImageShapeOptionPlugin` plugin has been exported. Related to task-4367641 runbot-223813 runbot-223815 -------------------------------------------------------------------------------------------------------------------------------------------- [FIX] website: correct second argument of clickOnSnippet This commit fixes a typo that appeared since [the website refactoring]; the second argument of `clickOnSnippet` has to be a string but was an object. [the website refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 Related to task-4367641 runbot-223813 runbot-223815 -------------------------------------------------------------------------------------------------------------------------------------------- [FIX] website: restore the way to compute and use snippetIDSelector Since the [the website refactoring], the way to compute and use `snippetIDSelector` has been modified for no good reason. This commit reverts those changes. [the website refactoring]: https://github.com/odoo/odoo/commit/9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 Related to task-4367641 runbot-223813 runbot-223815
The website editor now keeps image gallery carousels centered when their height is set to fill the section. This prevents a hidden placeholder from disrupting the layout, making page editing more predictable and visually accurate.
Original PR description
Steps to Reproduce : - Enter edit mode. - Drag and drop the s_image_gallery snippet. - Change the Min-Height option to 100%. - Notice that the carousel is not centered Cause: An empty div (intended to display a placeholder when no images are present) was still being rendered even when the carousel contained images. This affected the layout and caused misalignment. Solution: Update the CSS rule to hide the placeholder when the carousel has images, ensuring proper centering in edit mode.
After a user signs a document, closing the confirmation popup now sends them back to the correct signed-document page instead of the general portal page. This avoids confusion when viewing completed signature requests, especially in cases where internal request identifiers differ.
Original PR description
### Before this commit: When closing the popup after signing a document, it redirects to the `/my` page instead of `/my/signature/<id>`. It only happens when the request's id is out-of-sync with the request item's id. ### After this commit: Correctly use the `sign.request.item`'s id, as expected from the `/my/signature` route.
Opening a report in Studio that has no linked view now shows a controlled user-facing error instead of causing a system traceback. This prevents confusing crashes for users managing reports and improves reliability in the report editor.
Original PR description
Here, when we try to open a report that is not linked to view, a traceback appears. **Steps to reproduce:** - Install the `stock` and `web_studio` modules. - Navigate to `Settings > Technical >…
Here, when we try to open a report that is not linked to view, a traceback appears. **Steps to reproduce:** - Install the `stock` and `web_studio` modules. - Navigate to `Settings > Technical > Actions > Reports`. - Create a new report (e.g; **Model Name** = product.template, **Template Name** = product.report_test). - Open the report in the web editor. **Error:** `ValueError: External ID not found in the system: studio_customization.studio_report_docume_product_label` In this case, if no view is defined for the report, the system attempts to retrieve the related view from [1]. However, since the view does not exist, it raises a **ValueError**. [1] - https://github.com/odoo/odoo/blob/924aa8aa2abe7765d2d605dc7643d1102e056fd6/odoo/addons/base/models/ir_ui_view.py#L2151 This behavior is already handled in **version 16.0** by [2] with a controlled exception. This commit adopts the same approach by raising **UserError** when no view is defined for a report, preventing an unhandled exception. [2] - https://github.com/odoo/enterprise/blob/511781a6bfb52c88892a54e43133b90ddfddbe22/web_studio/controllers/report.py#L137-L143 Related Community PR: https://github.com/odoo/odoo/pull/208806 Sentry - 5715762959, 6303192517, 6577830303, 6577830303, 6577830303, 6303950186
This update fixes several small Shop Floor issues so manufacturing and work order cards show the right names, work centers, product details, and company-related information. It also removes an unused employee popup component, reducing clutter without changing current workflows.
Original PR description
This PR fixes small issues regarding changes done here: odoo/enterprise#83203 and removes dead code.
**Current behavior:** COGS dashboard items in a project's profitability report do not open any details when clicked on. **Expected behavior:** This should open a detailed view for an invoice linked via the analytic account on the project. **Steps to reproduce:** 1. Create a service product that generates a project on sale, on the project template set a specific analytic account 2. Create another product with real time valuation and assign the COGS account on the product category's ex
Original PR description
**Current behavior:** COGS dashboard items in a project's profitability report do not open any details when clicked on. **Expected behavior:** This should open a detailed view for an invoice linked…
**Current behavior:** COGS dashboard items in a project's profitability report do not open any details when clicked on. **Expected behavior:** This should open a detailed view for an invoice linked via the analytic account on the project. **Steps to reproduce:** 1. Create a service product that generates a project on sale, on the project template set a specific analytic account 2. Create another product with real time valuation and assign the COGS account on the product category's expense account 3. Sell some of the service product and the auto val product in the same order, deliver it -> generate invoice & post it 4. In the project's settings, open the profitability report and click on the `Cost of Goods Sold` dashboard item **Cause of the issue:** There is no action set up to return for this section, as it was just added in: 0fbc592 **Fix:** Add an action to return the account move line records with COGS display type for the invoice record in question (in the request's `res_id`). opw-4813885 Forward-Port-Of: odoo/odoo#212547
Before this commit, 'queryX' functions in Hoot would supposedly cleanup internal global variables on error thrown by the helpers. However, this only took into account the errors explicitly thrown, and NOT those that were thrown by other methods/native code, such as invalid native query selectors. This commit introduces a new internal method to "guard" exposed 'queryX' helpers, to properly cleanup internal variables on any error. --- I confirm I have signed the CLA and read the PR guidelin
Original PR description
Before this commit, 'queryX' functions in Hoot would supposedly cleanup internal global variables on error thrown by the helpers. However, this only took into account the errors explicitly thrown, and NOT those that were thrown by other methods/native code, such as invalid native query selectors. This commit introduces a new internal method to "guard" exposed 'queryX' helpers, to properly cleanup internal variables on any error. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212650
This commit will change some domain to be able to use them in the enterprise pr that will change the _compute_attachment to avoid doing a search in a loop. Also adding a hook to get the attachment for expense. no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209562
Original PR description
This commit will change some domain to be able to use them in the enterprise pr that will change the _compute_attachment to avoid doing a search in a loop. Also adding a hook to get the attachment for expense. no task id --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209562
Before this **PR**: When creating a new partner for the first time, the compute method for the invoice EDI format is triggered as expected. However, if a country is set while creating the partner, compute method is not triggered again. This breaks the intended flow where a default edi_format should be automatically set based on the country (using _get_suggested_invoice_edi_format). Since the compute method doesn’t re-trigger upon changing the country during record creation, the inverse metho
Original PR description
Before this **PR**: When creating a new partner for the first time, the compute method for the invoice EDI format is triggered as expected. However, if a country is set while creating the partner,…
Before this **PR**: When creating a new partner for the first time, the compute method for the invoice EDI format is triggered as expected. However, if a country is set while creating the partner, compute method is not triggered again. This breaks the intended flow where a default edi_format should be automatically set based on the country (using _get_suggested_invoice_edi_format). Since the compute method doesn’t re-trigger upon changing the country during record creation, the inverse method ends up setting invoice_edi_format_store to 'none'. This prevents subsequent calls to _get_suggested_invoice_edi_format from resolving the appropriate format, requiring users to manually set it — defeating the purpose of automatic localization-based assignment. After this **PR**: The dependency for the compute method has been changed from commercial_partner_id.country_code to country_code. This ensures the compute method reacts to changes in the country field during record creation. The logic still utilizes commercial_partner_id internally, so the intended behavior and correctness should be preserved, while ensuring the default format is set appropriately. Forward-Port-Of: odoo/odoo#212742
With this commit, on kanban view, if employee's name is on multiple lines the employee presence status is still on the right top and not on the right bottom 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#212741
Original PR description
With this commit, on kanban view, if employee's name is on multiple lines the employee presence status is still on the right top and not on the right bottom 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#212741
### Browser: Firefox ### Steps to reproduce: - Create a To-do. - Press Enter repeatedly and quickly. - A traceback occurs. ### Description of the issue/feature this PR addresses: - Pressing Enter quickly remove elements before their hooks are updated, causing hookElement to be undefined and triggering a crash. ### Desired behavior after PR is merged: - Traceback no longer occurs. task-4766147 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.c
Original PR description
### Browser: Firefox ### Steps to reproduce: - Create a To-do. - Press Enter repeatedly and quickly. - A traceback occurs. ### Description of the issue/feature this PR addresses: - Pressing Enter quickly remove elements before their hooks are updated, causing hookElement to be undefined and triggering a crash. ### Desired behavior after PR is merged: - Traceback no longer occurs. task-4766147 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#208959
This PR changes the Odoo iot box service systemd configuration to wait to be restarted infinitely (as opposed to default 10s after which if the restart still fails stystemd stops trying) Forward-Port-Of: odoo/odoo#212770
Original PR description
This PR changes the Odoo iot box service systemd configuration to wait to be restarted infinitely (as opposed to default 10s after which if the restart still fails stystemd stops trying) Forward-Port-Of: odoo/odoo#212770
### Current behavior before PR: - The popover's editing mode was determined by whether the link had an `href` attribute. ### Desired behavior after PR is merged: - Introduced _`LinkPopoverState`_ to control the editing mode instead of relying on `href`. task-4241464 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212238 Forward-Port-Of: odoo/odoo#204928
Original PR description
### Current behavior before PR: - The popover's editing mode was determined by whether the link had an `href` attribute. ### Desired behavior after PR is merged: - Introduced _`LinkPopoverState`_ to control the editing mode instead of relying on `href`. task-4241464 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212238 Forward-Port-Of: odoo/odoo#204928
### Steps to reproduce: - In the settings enable Multi-Step Routes - Inventory > Configuration > Warehouse Management > Warehouses - Create a second Warehouse WH2 - Inventory > Reporting > Stock - Click on the "Warehouse 2" of the left panel > This updates the results - Click on the wheel icon of the control panel > export All #### > the values are exported for the commutative value of all warehouses ### Cause of the issue: Click on a specific warehouse on the left panel actually
Original PR description
### Steps to reproduce: - In the settings enable Multi-Step Routes - Inventory > Configuration > Warehouse Management > Warehouses - Create a second Warehouse WH2 - Inventory > Reporting > Stock -…
### Steps to reproduce: - In the settings enable Multi-Step Routes - Inventory > Configuration > Warehouse Management > Warehouses - Create a second Warehouse WH2 - Inventory > Reporting > Stock - Click on the "Warehouse 2" of the left panel > This updates the results - Click on the wheel icon of the control panel > export All #### > the values are exported for the commutative value of all warehouses ### Cause of the issue: Click on a specific warehouse on the left panel actually updates the warehouse_id key of the context (on the listController). And this context is used to determine the values returned by the `web_search_read` performed on the `product.product` model. For instance the computed quantity fields are warehouse dependent: https://github.com/odoo/odoo/blob/dba8ec896cc4d3cc93fc10f40c809a1ab863d46d/addons/stock/models/product.py#L131-L135 Now, the issue is that eventBus added by the list controller to export data's (and which needs to be initialised in the setup of the component as it setup hooks) is relying on the value of the context in the setup of the of the listController: https://github.com/odoo/odoo/blob/dba8ec896cc4d3cc93fc10f40c809a1ab863d46d/addons/web/static/src/views/list/list_controller.js#L186-L188 https://github.com/odoo/odoo/blob/dba8ec896cc4d3cc93fc10f40c809a1ab863d46d/addons/web/static/src/views/view_hook.js#L126-L130 In particular, the parameter of the method will not be re-evaluated as `this.props.context` where this is the controller at the time of the callback the values of the export. ### Fix: While the `env` provided at the initialization of the enventBus is a in the setup of the Controller is an immutable object, `env.resModel.root` correspond to the representation of the present record/records and hence carries the context of the current representation. It is therefore a valid object to rely on at callback time. ### Note: The issue is not reproducible prior to saas-18.2 since the refactoring of the export system has been done in commit 1e4e40cf78fe8151dffdcb19df2688787084732c opw-4736830 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#210105
The adaptations from [1] and [2] added some code to the snippet preview dialog, mainly to adapt text highlights in the snippets content (starting from `18.0`) and enable the snippets preview interactions (starting from `18.3`) [A]. In a runbot test context, the snippet selection happens too fast that the code from [A] (linked to the async behaviour of `insertSnippets`) can still process the snippets dialog `iframeDocument` (lost after the dialog being closed on snippet selection). Th
Original PR description
The adaptations from [1] and [2] added some code to the snippet preview dialog, mainly to adapt text highlights in the snippets content (starting from `18.0`) and enable the snippets preview…
The adaptations from [1] and [2] added some code to the snippet preview dialog, mainly to adapt text highlights in the snippets content (starting from `18.0`) and enable the snippets preview interactions (starting from `18.3`) [A]. In a runbot test context, the snippet selection happens too fast that the code from [A] (linked to the async behaviour of `insertSnippets`) can still process the snippets dialog `iframeDocument` (lost after the dialog being closed on snippet selection). The goal of this commit is to fix this behaviour by simply taking into consideration the fact that the preview content can be lost (since in a real use case, a user will select a snippet in a reasonable time). [1]: https://github.com/odoo/odoo/commit/1aaf483c5d3b8e8816cfbea7da96ac007a42d492 [2]: https://github.com/odoo/odoo/commit/e008c92fcad2b8cc160586ba6ab94bc077b9bf3d Remark: This commit will be adapted on `18.3` to fix the code from [2]. runbot-190596 Forward-Port-Of: odoo/odoo#210295
With two events having an calendar.alarm that is set for 1 hour before the event and a first event having attendees Partner1 and Partner2 and a second event has attendees Partner2 to Partner3. _do_sms_reminder will sent SMS once for each event to attendees from Partner1 to Partner3. Original issue introduced here: a1087e301122eea626ed30f34198de4666a81bdf Enabled by recent fix here ce574e5edf7bc848c867727d8c66a8e7802b029f that is batching events by alarm. opw-4812919 Forward-
Original PR description
With two events having an calendar.alarm that is set for 1 hour before the event and a first event having attendees Partner1 and Partner2 and a second event has attendees Partner2 to Partner3. _do_sms_reminder will sent SMS once for each event to attendees from Partner1 to Partner3. Original issue introduced here: a1087e301122eea626ed30f34198de4666a81bdf Enabled by recent fix here ce574e5edf7bc848c867727d8c66a8e7802b029f that is batching events by alarm. opw-4812919 Forward-Port-Of: odoo/odoo#212076 Forward-Port-Of: odoo/odoo#211948
Currently, an exception is raised when validating a new receipt transfer where both the stock move and the push rule have the same destination location. Steps to Reproduce: 1. Install `stock` module 2. Enable Multi-Step Routes in Inventory 3. Routes -> Enable Warehouses and ensure they are linked to `YourCompany`. 4. Create a new rule for that route. 5. Set action to 'Push To' with same source and destination (e.g., WH/Stock) and Automatic Move to 'Automatic No Step Added'. 6. Go to
Original PR description
Currently, an exception is raised when validating a new receipt transfer where both the stock move and the push rule have the same destination location. Steps to Reproduce: 1. Install `stock` module…
Currently, an exception is raised when validating a new receipt transfer where both the stock move and the push rule have the same destination location. Steps to Reproduce: 1. Install `stock` module 2. Enable Multi-Step Routes in Inventory 3. Routes -> Enable Warehouses and ensure they are linked to `YourCompany`. 4. Create a new rule for that route. 5. Set action to 'Push To' with same source and destination (e.g., WH/Stock) and Automatic Move to 'Automatic No Step Added'. 6. Go to Inventory -> Operations-> Receipts 7. Create a new receipt with the same destination location as defined in the rule. 8. Click on Validate TypeError: ```TypeError unsupported operand types in: stock.move() - None ``` This issue[1] occurs when the rule and stock have the same destination location. It does not execute and returns None, resulting in new_move being None. When `move.move_dest_ids - new_move` is executed, it raises an error. [1]- https://github.com/odoo/odoo/blob/5c182227514af87659ee48360c63f33487de71bf/addons/stock/models/stock_move.py#L1048 sentry-6551676919 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#206850
Some of the reasons were added with a wrong code. https://github.com/odoo/odoo/blob/fba7abd168b99157ee9abd1c084720a90196de39/addons/account_edi_ubl_cii_tax_extension/models/account_tax.py#L76-L85 Example: VATEX_EU_AE should have been VATEX-EU-AE... This fix adds a mapping to correct the codes when exporting XML, since we cannot update the keys of the selection field directly in stable versions. Source: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-CL-22/ task-4817958 (p
Original PR description
Some of the reasons were added with a wrong code. https://github.com/odoo/odoo/blob/fba7abd168b99157ee9abd1c084720a90196de39/addons/account_edi_ubl_cii_tax_extension/models/account_tax.py#L76-L85 Example: VATEX_EU_AE should have been VATEX-EU-AE... This fix adds a mapping to correct the codes when exporting XML, since we cannot update the keys of the selection field directly in stable versions. Source: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-CL-22/ task-4817958 (part of) Forward-Port-Of: odoo/odoo#211681
This commit changes the activity component sidebar structure to match the message sidebar's. This is done to make sure the avatars in the chatter are all horizontally aligned. This commit also adds padding to the Activities separator/dropdown to align with the messages date separator. Before:  After:  After:  Forward-Port-Of: odoo/odoo#211554 Forward-Port-Of: odoo/odoo#211463
When checking for PEPPOL partner endpoint, only update the value if it changed since the last check. This avoid triggering an unnecessary write on res.partner each time a user open the invoice sending wizard. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212685
Original PR description
When checking for PEPPOL partner endpoint, only update the value if it changed since the last check. This avoid triggering an unnecessary write on res.partner each time a user open the invoice sending wizard. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212685
Description of the issue/feature this PR addresses: This commit removes the typo (question marks) in the tax report in South Africa localization. task-4789823 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209673
Original PR description
Description of the issue/feature this PR addresses: This commit removes the typo (question marks) in the tax report in South Africa localization. task-4789823 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#209673
Requested by @cima-odoo Forward-Port-Of: odoo/odoo#211982 Forward-Port-Of: odoo/odoo#211848
Original PR description
Requested by @cima-odoo Forward-Port-Of: odoo/odoo#211982 Forward-Port-Of: odoo/odoo#211848
commit https://github.com/odoo/odoo/commit/695b429d09887debe1a58e92abfd7e738350061d reworked the footer style but on boxed and bold if there is no tag line, it uses a col-8 that let a big empty space. Also it uses a wrong t-if condition on an html field. It should use is_html_empty since the field could contains empty tags (<br>) Fallback on standard template for report without report_header We keep a duplicate of class and t-attf-class in order to have a valid override of the temp
Original PR description
commit https://github.com/odoo/odoo/commit/695b429d09887debe1a58e92abfd7e738350061d reworked the footer style but on boxed and bold if there is no tag line, it uses a col-8 that let a big empty space. Also it uses a wrong t-if condition on an html field. It should use is_html_empty since the field could contains empty tags (<br>) Fallback on standard template for report without report_header We keep a duplicate of class and t-attf-class in order to have a valid override of the template Fix l10n template to reduce the xpath and match the fix. Keeping the o_footer_content in both class for override and t-attf-class since `ir_qweb.py:def _compile_directive_att` ignore class attribute when t-attf-class is set opw-4618652 Forward-Port-Of: odoo/odoo#201615
### Description of the issue/feature this PR addresses: When an event is synced with an external calendar (Google/ Microsoft), the external calendar is responsible for sending reminders, and Odoo should not send any additional reminders. However, the current implementation does not properly handle this, with the default crone job running daily sending email reminders up to one day late. ### Current behavior before PR: Although the current implementation ensures the crone is not t
Original PR description
### Description of the issue/feature this PR addresses: When an event is synced with an external calendar (Google/ Microsoft), the external calendar is responsible for sending reminders, and Odoo…
### Description of the issue/feature this PR addresses: When an event is synced with an external calendar (Google/ Microsoft), the external calendar is responsible for sending reminders, and Odoo should not send any additional reminders. However, the current implementation does not properly handle this, with the default crone job running daily sending email reminders up to one day late. ### Current behavior before PR: Although the current implementation ensures the crone is not triggered for alarms of external-calendars-synced events, the default crone job that is running daily is going all over the events with reminders need to be sent and send them up to one day late. ### Desired behavior after PR is merged: When the crone goes to trigger the _send_reminder method, it will check first if the events are synced or not, and if synced then no reminders will be sent from odoo's side. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr task-id: 4316693 Forward-Port-Of: odoo/odoo#211899 Forward-Port-Of: odoo/odoo#192876
Steps to reproduce: - Enter Website edit mode. - Click on the Theme tab. - Click the 4th colorpicker in the colors options to change the body background color. - Choose a transparent color. - Save and exit edit mode. - Navigate to the "Contact Us" page. - Issue: The fallback iframe is visible beneath the website iframe. To prevent this, this commit adds a white background to the website's HTML element, so the fallback iframe will never be visible. task-4816245 Forward-Port-Of:
Original PR description
Steps to reproduce: - Enter Website edit mode. - Click on the Theme tab. - Click the 4th colorpicker in the colors options to change the body background color. - Choose a transparent color. - Save and exit edit mode. - Navigate to the "Contact Us" page. - Issue: The fallback iframe is visible beneath the website iframe. To prevent this, this commit adds a white background to the website's HTML element, so the fallback iframe will never be visible. task-4816245 Forward-Port-Of: odoo/odoo#211257
odoo/odoo#202688 updated the handling of list padding, however it hard-coded padding sizes. Those sizes can vary slightly depending on font selection (as different fonts have slightly different character dimensions). So depending on the local setup / environment, tests at issue may always fail. Add a content cleaner property to `testEditor`, and use it to nuke the `inline-padding-start` property in various tests. Forward-Port-Of: odoo/odoo#212120
Original PR description
odoo/odoo#202688 updated the handling of list padding, however it hard-coded padding sizes. Those sizes can vary slightly depending on font selection (as different fonts have slightly different character dimensions). So depending on the local setup / environment, tests at issue may always fail. Add a content cleaner property to `testEditor`, and use it to nuke the `inline-padding-start` property in various tests. Forward-Port-Of: odoo/odoo#212120
When creating an inter-wh transfer, the replenish order was showing the product's supplier in the Received From (partner_id) field and not the correct wh. Steps to reproduce: ------------------- * In Inventory, activate Multi-step Routes * Create a new WH that can be Resupplied From another WH * On a product, in the Inventory tab, activate the Route 'ABC: Supply Product from XYZ' * On the forecast of that product, click on Replenish * Match fields: Warehouse = ABC, Preferred Route = 'AB
Original PR description
When creating an inter-wh transfer, the replenish order was showing the product's supplier in the Received From (partner_id) field and not the correct wh. Steps to reproduce: ------------------- * In…
When creating an inter-wh transfer, the replenish order was showing the product's supplier in the Received From (partner_id) field and not the correct wh. Steps to reproduce: ------------------- * In Inventory, activate Multi-step Routes * Create a new WH that can be Resupplied From another WH * On a product, in the Inventory tab, activate the Route 'ABC: Supply Product from XYZ' * On the forecast of that product, click on Replenish * Match fields: Warehouse = ABC, Preferred Route = 'ABC: Supply Product from XYZ' * Confirm * Open the generated order > Observation: > The field Receive From contains the supplier of the product instead of the supplying WH. Why the fix: ------------ The supplier_id was automatically set with the product's supplier_id. It's not correct for every routes. It's now updated accordingly to the route used and if we need the vendor. opw-4717654 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212645 Forward-Port-Of: odoo/odoo#210336
In a dropshipping context, the internal note of a product with displayed on the delivery slip of the operation. Steps to reproduce: ------------------- * Create (or use) a product with an internal note * Enable Buy and Dropship Routes, add a Vendor * Create and Confirn a Sale Order with that product * Click on Purchase smart button and Confirm Order * Click on Dropship smart button * Print the Delivery Slip > Observation: The internal note was displayed under the name of the product
Original PR description
In a dropshipping context, the internal note of a product with displayed on the delivery slip of the operation. Steps to reproduce: ------------------- * Create (or use) a product with an internal note * Enable Buy and Dropship Routes, add a Vendor * Create and Confirn a Sale Order with that product * Click on Purchase smart button and Confirm Order * Click on Dropship smart button * Print the Delivery Slip > Observation: The internal note was displayed under the name of the product Why the fix: ------------ When used with picking_code == 'dropship', `_get_description()` returns the product's description (internal note). We don't want that description to be visible on a report that's used outside of the company. opw-4791064 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#211374
This commit fixes an issue in the `_compute_valid` method of the `hr.leave.type` model. The `leave_type.id` was changed to `leave_type`, since the key type in `allocation_by_leave_type` is a recordset, not an integer. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212722
Original PR description
This commit fixes an issue in the `_compute_valid` method of the `hr.leave.type` model. The `leave_type.id` was changed to `leave_type`, since the key type in `allocation_by_leave_type` is a recordset, not an integer. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212722
5d69408548b30671b968c3c1ae1e8f444ac2d82e introduced overrides for the generic EDI fetch/update logic. It mistakenly copied a condition from the XML layer that checked `.raw_value` on the API key field. This caused a traceback when accessing the accounting dashboard. No task-ID Forward-Port-Of: odoo/odoo#212433
Original PR description
5d69408548b30671b968c3c1ae1e8f444ac2d82e introduced overrides for the generic EDI fetch/update logic. It mistakenly copied a condition from the XML layer that checked `.raw_value` on the API key field. This caused a traceback when accessing the accounting dashboard. No task-ID Forward-Port-Of: odoo/odoo#212433
Before this **PR**: Only HUF was allowed as valid currency on company for Hungarian EDI. After this **PR**: Now both HUF and EUR is allowed as valid currency for Hungarian EDI. **task**-4707271 Forward-Port-Of: odoo/odoo#212882 Forward-Port-Of: odoo/odoo#211600
Original PR description
Before this **PR**: Only HUF was allowed as valid currency on company for Hungarian EDI. After this **PR**: Now both HUF and EUR is allowed as valid currency for Hungarian EDI. **task**-4707271 Forward-Port-Of: odoo/odoo#212882 Forward-Port-Of: odoo/odoo#211600
This commit makes sure that `product_uom_id` field is set on `product_supplierinfo` model, since the field is needed in most operations dealing with pricelists. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#203751
Original PR description
This commit makes sure that `product_uom_id` field is set on `product_supplierinfo` model, since the field is needed in most operations dealing with pricelists. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#203751
Encountered an issue where `_name_search` would crash if a search term couldn’t be converted to all expected field types — specifically when using a string like "1971-01-01" that gets interpreted as a date, but also hits a float field in the comodel. This happened when searching currencies by exchange rates, which involve both a date field (`name`) and a float field (`rate`) in `res.currency.rate`. The original implementation only caught `ValueError` during type conversion, but in my case it
Original PR description
Encountered an issue where `_name_search` would crash if a search term couldn’t be converted to all expected field types — specifically when using a string like "1971-01-01" that gets interpreted as…
Encountered an issue where `_name_search` would crash if a search term couldn’t be converted to all expected field types — specifically when using a string like "1971-01-01" that gets interpreted as a date, but also hits a float field in the comodel. This happened when searching currencies by exchange rates, which involve both a date field (`name`) and a float field (`rate`) in `res.currency.rate`. The original implementation only caught `ValueError` during type conversion, but in my case it was raising a `TypeError` when attempting to convert a `datetime.date` to a float. To fix this, I expanded the exception handling to also catch `TypeError`, ensuring `_name_search` gracefully skips over fields where conversion is invalid. This aligns with the intended behavior described in the original fix — to silently ignore incompatible fields instead of failing. Failing in Distro Build , python version >=3.10 raises a `TypeError` build_error-110207 Forward-Port-Of: odoo/odoo#212587 Forward-Port-Of: odoo/odoo#210551
Since [1], we have to adapt the tour for the website page properties to fit the new behaviour of the page dependencies. [1]: https://github.com/odoo/odoo/commit/cd4b0c91c1cf60ff72e91cf0544cb255ee5aff3f Forward-Port-Of: odoo/odoo#208870
Original PR description
Since [1], we have to adapt the tour for the website page properties to fit the new behaviour of the page dependencies. [1]: https://github.com/odoo/odoo/commit/cd4b0c91c1cf60ff72e91cf0544cb255ee5aff3f Forward-Port-Of: odoo/odoo#208870
The l10n_tr_nilvera_purchase_journal_id field was causing access errors due to its placement in the "Integrations" section without any group restriction, exposing it to users without the necessary rights. In contrast, the similar account_peppol_purchase_journal_id field is defined under the "Invoicing" section with the proper group restriction (account.group_account_manager), and behaves correctly. This fix moves the Nilvera field into the same restricted section as the Peppol field, align
Original PR description
The l10n_tr_nilvera_purchase_journal_id field was causing access errors due to its placement in the "Integrations" section without any group restriction, exposing it to users without the necessary rights. In contrast, the similar account_peppol_purchase_journal_id field is defined under the "Invoicing" section with the proper group restriction (account.group_account_manager), and behaves correctly. This fix moves the Nilvera field into the same restricted section as the Peppol field, aligning its access control and visibility with other similar fields in the same context. build_error-111279 Forward-Port-Of: odoo/odoo#211071 Forward-Port-Of: odoo/odoo#201563
The measure is now the fully qualified measure, with the aggregate "__count:sum" Task: 4818416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212894
Original PR description
The measure is now the fully qualified measure, with the aggregate "__count:sum" Task: 4818416 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#212894
Two of our query counts were incorrect for survey single app (one causing CI failure) related to queries performed when `website` is not installed. Follow up of Task 3742599. See runbot error 112999 Forward-Port-Of: odoo/odoo#211492
Original PR description
Two of our query counts were incorrect for survey single app (one causing CI failure) related to queries performed when `website` is not installed. Follow up of Task 3742599. See runbot error 112999 Forward-Port-Of: odoo/odoo#211492
…compute **PROBLEM** When creating a new operation type, changing the type to Delivery throws a warning to create a warehouse first despite there already being one. **STEPS TO REPRODUCE** 1. On a fresh database, install stock with drop shipping and storage locations enabled. 2. Create a new operation type and set the type to Delivery. 3. You will receive the following warning, despite an existing warehouse: ``` Please create a warehouse for company <company> ``` **CAUSE** http
Original PR description
…compute **PROBLEM** When creating a new operation type, changing the type to Delivery throws a warning to create a warehouse first despite there already being one. **STEPS TO REPRODUCE** 1. On a…
…compute **PROBLEM** When creating a new operation type, changing the type to Delivery throws a warning to create a warehouse first despite there already being one. **STEPS TO REPRODUCE** 1. On a fresh database, install stock with drop shipping and storage locations enabled. 2. Create a new operation type and set the type to Delivery. 3. You will receive the following warning, despite an existing warehouse: ``` Please create a warehouse for company <company> ``` **CAUSE** https://github.com/odoo/odoo/blob/138983cc81cd1565c1582a1523efa8c0c4dcc434/addons/stock/models/stock_picking.py#L308-L316 https://github.com/odoo/odoo/blob/138983cc81cd1565c1582a1523efa8c0c4dcc434/addons/stock_dropshipping/models/stock.py#L70-L74 When the form is first loaded, the type is Receipt and the source location is consequently Vendors. After changing the type to Delivery, the source location is recomputed. Observe the above code snippets. Before the source location is done being computed, the warehouse is accessed and computed. When computing the warehouse (in the midst of the source location compute), the `default_location_src_id` is still Vendors and `default_location_dest_id` is Customers, thus `warehouse_id` is set to False. **FIX** In the conditional that checks if the picking type is drop shipping, check the `code` instead. The value in `code` is up-to-date at the conditional, unlike `default_location_src_id`. opw-4603495 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#199676
A series of recent commits were aiming at allowing to change the partner of some journal entries in batch to allow de-duplicating the database, in the context of the EC Saleslist report[^1] There are a few residual issues: 1. the lock dates can prevent any change on the lines. However in this specific case, the partner is not really changing and we want to allow it. This issue is solved by adding a context key, using a sentinel to avoid any users bypassing it. 2. if the lines are reconciled
Original PR description
A series of recent commits were aiming at allowing to change the partner of some journal entries in batch to allow de-duplicating the database, in the context of the EC Saleslist report[^1] There are…
A series of recent commits were aiming at allowing to change the partner of some journal entries in batch to allow de-duplicating the database, in the context of the EC Saleslist report[^1] There are a few residual issues: 1. the lock dates can prevent any change on the lines. However in this specific case, the partner is not really changing and we want to allow it. This issue is solved by adding a context key, using a sentinel to avoid any users bypassing it. 2. if the lines are reconciled, it was also impossible to update the lines. Since all the lines are changing the partner at the same time, there is no need to block changing it as the reconciliation keeps its meaning. 3. After the second commit, we were actually not checking that the VAT was indeed the same on the partner getting a `parent_id` assigned 4. We don't check that the user has a specific accounting group anymore to allow invoicing users to set the main partner. It should not be an issue since the accounting values stay the same (same VAT) [^1]: https://github.com/odoo/odoo/commit/38d43360781250415c63aba36eadcdce586fcbc0 https://github.com/odoo/odoo/commit/3941972dc7bba3e9a3d4497b312ff7f86a497157 Forward-Port-Of: odoo/odoo#212990 Forward-Port-Of: odoo/odoo#212784
Forward-Port-Of: odoo/enterprise#86948 Forward-Port-Of: odoo/enterprise#86889
Original PR description
Forward-Port-Of: odoo/enterprise#86948 Forward-Port-Of: odoo/enterprise#86889
Receipt header was never shown Steps to reproduce: ------------------- * Install l10n_cl_edi_pos * Open PoS * Make a sale that you invoice > Observation: The receipt is not showing the header with RUT Why the fix: ------------ The original `cl_vat` variable did not exist anymore. It was previously just mapping the company vat. So we use the company vat directly. opw-4784899 Forward-Port-Of: odoo/enterprise#86773 Forward-Port-Of: odoo/enterprise#85520
Original PR description
Receipt header was never shown Steps to reproduce: ------------------- * Install l10n_cl_edi_pos * Open PoS * Make a sale that you invoice > Observation: The receipt is not showing the header with RUT Why the fix: ------------ The original `cl_vat` variable did not exist anymore. It was previously just mapping the company vat. So we use the company vat directly. opw-4784899 Forward-Port-Of: odoo/enterprise#86773 Forward-Port-Of: odoo/enterprise#85520
See commit messages Forward-Port-Of: odoo/enterprise#86286
Original PR description
See commit messages Forward-Port-Of: odoo/enterprise#86286
Forward-Port-Of: odoo/enterprise#82967
Original PR description
Forward-Port-Of: odoo/enterprise#82967
In version 18.0, a traceback occurs when editing the 'Appointment: Attendee Invitation' email template and then signing up for an appointment. **Steps to reproduce:** 1. Go to **Appointments**. 2. Click the **"Action"** gear icon next to an appointment, then select **Edit**. 3. Navigate to the **Options** tab. 4. Hover over the **Booking Email** template and click the **arrow icon** to open it. 6. In the Content tab, add some text near "Hello", then click **Save**. 7. Return to t
Original PR description
In version 18.0, a traceback occurs when editing the 'Appointment: Attendee Invitation' email template and then signing up for an appointment. **Steps to reproduce:** 1. Go to **Appointments**. 2.…
In version 18.0, a traceback occurs when editing the 'Appointment:
Attendee Invitation' email template and then signing up for an
appointment.
**Steps to reproduce:**
1. Go to **Appointments**.
2. Click the **"Action"** gear icon next to an appointment, then select **Edit**.
3. Navigate to the **Options** tab.
4. Hover over the **Booking Email** template and click the **arrow icon** to open
it.
6. In the Content tab, add some text near "Hello", then click **Save**.
7. Return to the **Appointment form**
8. Click the "**Go to Website**" smart button at the top
9. Select a date and time.
10. Confirm the appointment.
This raises a traceback
**In saas-18.3**, editing the `Appointment: Attendee Invitation` email
template throws an error when saving, making the template uneditable.
**Issue:**
The issue originates from this [commit](https://github.com/odoo/enterprise/commit/8b9a1a4462453bf64e7bc1307ededd0d127a27fa), which introduced a
`<div>` inside a `<p>` — a structure that violates the HTML specification.
Editing anything near the word 'Hello' in the template causes the
`<p>` tag to close prematurely during rendering. This pushes the `<div>`
outside of the `<p>`, breaking the directive chain and resulting in
the following error:
> SyntaxError: t-elif directive must be preceded by t-if or t-elif directive
Previously, the `<div>` was also pushed outside the `<p>`, but only after
evaluating all `t-if, t-elif, and t-else` conditions. Hence, it worked
correctly without editing the template.
**Solution:**
Placed the `<span>` as a child of the `<p>` tag to resolve the issue.
This fix also resolves the issue of being unable to edit the template
"Appointment: Attendee Invitation" in the UI **on saas-18.3**.
[Task-4624645](https://www.odoo.com/odoo/project.task/project.task/4624645)
Forward-Port-Of: odoo/enterprise#85669Fix qty_delivered when a rental order is processed through the PoS. This commit ensure that the PoS qty_delivered computation is done after the other calculation Steps to reproduce: ------------------- * Make a rental for 1 product * Open the sale order in PoS * Pay for the rental > Observation: The qty_delivered is set to 2 instead of 1 on the rental Why the fix: ------------ When the order is a rental processed through the PoS, we recompute the rental qty and add the PoS quantity
Original PR description
Fix qty_delivered when a rental order is processed through the PoS. This commit ensure that the PoS qty_delivered computation is done after the other calculation Steps to reproduce: ------------------- * Make a rental for 1 product * Open the sale order in PoS * Pay for the rental > Observation: The qty_delivered is set to 2 instead of 1 on the rental Why the fix: ------------ When the order is a rental processed through the PoS, we recompute the rental qty and add the PoS quantity to make sure that the value is correct. The computation is actually just the fusion of the PoS and rental _compute_qty_delivered methods. opw-4582505 Forward-Port-Of: odoo/enterprise#86317 Forward-Port-Of: odoo/enterprise#84768
The "Fetch from CodaBox" link displayed on the accounting dashboard had no gap between it and the button at the left of it, and wasn't aligned horizontaly with the other buttons next to it making it look out of place. It is now displayed as a link button, which solve both problems. task-4671468 Purpose The fetch from CodaBox is too sticky to the upload button  After this commit :  After this commit :  Forward-Port-Of: odoo/enterprise#84858
**Steps to reproduce**: 1. Install Appraisals 2. Appraisals > Open any Employee card 3. Turn on the debug mode 4. Click on Debug Icon 5. Click Data **Issue**: - A Traceback error occurs when trying to read the record. - The fields parameter is None in some cases (viewing Raw Record data in Debug mode) in read function, leading to an attempt to convert it to an empty dictionary, which is not iterable. **Cause**: - The read() function was called with fields is None in debug mod
Original PR description
**Steps to reproduce**:
1. Install Appraisals
2. Appraisals > Open any Employee card
3. Turn on the debug mode
4. Click on Debug Icon
5. Click Data
**Issue**:
- A Traceback error occurs when trying to read the record.
- The fields parameter is None in some cases (viewing Raw Record data in Debug mode) in read function, leading to an
attempt to convert it to an empty dictionary, which is not iterable.
**Cause**:
- The read() function was called with fields is None in debug mode and it was incorrectly converting None to {}, causing a
TypeError when performing set operations.
**Solution**:
- Instead of setting None to {}, it should be converted to an empty set to avoid type mismatch.
opw-4788901
Forward-Port-Of: odoo/enterprise#85876If one uploads a vendor bill from the list view using the "Upload" button, a banner is then shown on the form view of the created move to reload the data that were extracted via IAP. However, this banner is not shown if one creates an empty move, then uploads via the attachments, then the banner is never shown. This is because when we arrive in the `onWillStart` of the `StatusHeader`, we subscribe to a channel using the `extract_document_uuid` which does not exist upon creating a new empty
Original PR description
If one uploads a vendor bill from the list view using the "Upload" button, a banner is then shown on the form view of the created move to reload the data that were extracted via IAP. However, this…
If one uploads a vendor bill from the list view using the "Upload" button, a banner is then shown on the form view of the created move to reload the data that were extracted via IAP.
However, this banner is not shown if one creates an empty move, then uploads via the attachments, then the banner is never shown.
This is because when we arrive in the `onWillStart` of the `StatusHeader`, we subscribe to a channel using the `extract_document_uuid` which does not exist upon creating a new empty move. Then, when we upload our document, the move record is saved, and is sent to the backend. At this point, the move exists, and a `extract_document_uuid` is set. Then we get the OCR results (in `_check_ocr_status`) and we have a new status, we send this status on the bus but on a channel named `f"extract.mixin.status#{self.extract_document_uuid}"` where the `extract_document_uuid` is set. However, in the JS part, it was empty because it was created in the `onWillStart`.
To resolve this, we create a new channel to detect newly created documents. We send the new `extract_document_uuid` in this channel from the backend to the frontend. The JS can now subscribe to the correct channel using an existing `extract_document_uuid`.
Now, correctly the JS receives the updates of the Python via the bus, and can update the view accordingly.
opw-4566944
Forward-Port-Of: odoo/enterprise#83522When multiple taxes are configured on the "WORK IN" and "WORK OUT" products (a common scenario in a multi-company setup), the check for the tax amount would fail. The previous code attempted to access the `amount` field directly on a multi-record tax recordset, which results in an error. This caused the Point of Sale session to fail on opening. opw-4744514 Forward-Port-Of: odoo/enterprise#86807
Original PR description
When multiple taxes are configured on the "WORK IN" and "WORK OUT" products (a common scenario in a multi-company setup), the check for the tax amount would fail. The previous code attempted to access the `amount` field directly on a multi-record tax recordset, which results in an error. This caused the Point of Sale session to fail on opening. opw-4744514 Forward-Port-Of: odoo/enterprise#86807
Currently, when a user sends an article to the trash, the system triggers a notification email to relevant members informing them that the article has been trashed and will be permanently deleted in 30 days (see: `knowledge_article_trash_notification`). This email includes a link to the trashed article (see: `article_url`). However, when a user clicks the link, they are taken to a 403 error page and cannot access the article to review or restore it. Steps to reproduce the issue: 1. Open a
Original PR description
Currently, when a user sends an article to the trash, the system triggers a notification email to relevant members informing them that the article has been trashed and will be permanently deleted in…
Currently, when a user sends an article to the trash, the system triggers a notification email to relevant members informing them that the article has been trashed and will be permanently deleted in 30 days (see: `knowledge_article_trash_notification`). This email includes a link to the trashed article (see: `article_url`). However, when a user clicks the link, they are taken to a 403 error page and cannot access the article to review or restore it. Steps to reproduce the issue: 1. Open an article 2. Send the article to the trash 3. Open the notification email and click on the article link => The user is redirected to a 403 error page When an article is trashed (see: `action_send_to_trash`), it is marked as inactive. As a result, it is excluded from ORM search results by default. The `/knowledge/article/<id>` route uses the ORM to retrieve the article by its ID. Since trashed articles are inactive, the ORM does not return the article, leading the route to assume the article does not exist and redirect the user to a 403 error page. To resolve this issue, we will modify the context of the search method to include the key `active_test=False`. This will allow the ORM to return inactive (trashed) articles. As a result, users who follow the link from the email will be correctly redirected to the trashed article page, where they can view its content and choose to restore it using the banner interface. Task-4636494 Forward-Port-Of: odoo/enterprise#86065
When you are in a list view, you can select multiple records by clicking the checkbox. But if after selecting multiple records, you click on a line, it will only select the record you just clicked and all other preselected records will be ignored. This commit change that, as now if you already have selected records, if you clik on a line without checking the checkbox, it will add the record to the selection just like you clicked on the checkbox. task-4816580 Forward-Port-Of: odoo/enterpri
Original PR description
When you are in a list view, you can select multiple records by clicking the checkbox. But if after selecting multiple records, you click on a line, it will only select the record you just clicked and all other preselected records will be ignored. This commit change that, as now if you already have selected records, if you clik on a line without checking the checkbox, it will add the record to the selection just like you clicked on the checkbox. task-4816580 Forward-Port-Of: odoo/enterprise#86630
This commit enable the upload features in the bank rec widget if the journal is not in synchronisation mode or Codabox. To do so, we use the "bank_statements_source" field in the context keys. task-4809006 Forward-Port-Of: odoo/enterprise#86526
Original PR description
This commit enable the upload features in the bank rec widget if the journal is not in synchronisation mode or Codabox. To do so, we use the "bank_statements_source" field in the context keys. task-4809006 Forward-Port-Of: odoo/enterprise#86526
The `action_timer_start` method caused infinite recursion when the user's timezone differed from the timesheet's timezone. The comparison between `fields.Date.today()` and `self.date` failed, creating a new timesheet. That new timesheet triggered `action_timer_start` again, repeating the loop. **Steps to Produce:-** 1. Install the `Timesheets` application. 2. Navigate to `Settings > Users & Companies > User`. 3. Select your current user and, under `Preferences`, set the timezone to one t
Original PR description
The `action_timer_start` method caused infinite recursion when the user's timezone differed from the timesheet's timezone. The comparison between `fields.Date.today()` and `self.date` failed,…
The `action_timer_start` method caused infinite recursion when the user's timezone differed from the timesheet's timezone. The comparison between `fields.Date.today()` and `self.date` failed, creating a new timesheet. That new timesheet triggered `action_timer_start` again, repeating the loop.
**Steps to Produce:-**
1. Install the `Timesheets` application.
2. Navigate to `Settings > Users & Companies > User`.
3. Select your current user and, under `Preferences`, set the timezone to one that does not reflect today’s date.
4. Open the Timesheets application, and for any record, click on the `Search icon` in the column for today’s date.
5. Start the time tracking by clicking the `Play button`.
6. Wait for a moment; an error will generate.
**Error:-**
`RecursionError: maximum recursion depth exceeded.`
**Solution:-**
- When action_timer_start() is invoked, it first checks for the _from_action_timer flag in the context.
- If not set, it sets _from_action_timer=True.
- The next time action_timer_start() is triggered, the presence of _from_action_timer in the context causes it to exit early,
preventing recursion.
**Sentry - 6592348827**
Forward-Port-Of: odoo/enterprise#85105Currently, an error-level log is generated when confirming a Vendor Bill without setting the required AFIP Authorization Code. **Steps to Reproduce:** 1) Install `l10n_ar_edi module`. 2) Select Company having Argentina code (e.g **(AR)Exento**) 3) Navigate to `Invoicing->Configuration->settings`, under Argentina localization, set `Verify Vendor Bills validity in AFIP` to **required**. 4) Create a new Vendor Bill, select Vendor Name (e.g **ADHOC SA**). 5) Click on confirm. **Error
Original PR description
Currently, an error-level log is generated when confirming a Vendor Bill without setting the required AFIP Authorization Code. **Steps to Reproduce:** 1) Install `l10n_ar_edi module`. 2) Select…
Currently, an error-level log is generated when confirming a Vendor Bill without setting the required AFIP Authorization Code.
**Steps to Reproduce:**
1) Install `l10n_ar_edi module`.
2) Select Company having Argentina code (e.g **(AR)Exento**)
3) Navigate to `Invoicing->Configuration->settings`, under Argentina localization,
set `Verify Vendor Bills validity in AFIP` to **required**.
4) Create a new Vendor Bill, select Vendor Name (e.g **ADHOC SA**).
5) Click on confirm.
**Error:**
UserError('Please set AFIP Authorization Mode and Code to continue!')
**Root Cause:**
- The code calls `_logger.error(repr(error))` on any exception at [1] during the AFIP verification attempt, causing an ERROR‐level log entry.
[1]- https://github.com/odoo/enterprise/blob/ca16c89c6f53b1c0adb0a1a061d985bdf3439e5e/l10n_ar_edi/models/account_move.py#L500
**Solution:**
- This commit handles `UserError` exceptions separately using a warning log to prevent error-level entries.
Sentry-6576006813
Forward-Port-Of: odoo/enterprise#85261This commit fixes a traceback that happens when someone opens a pos config with a belgian blackbox configured. The traceback is caused by the _notify "CLOCKING" where the "_" fields are not sent. Forward-Port-Of: odoo/enterprise#86884
Original PR description
This commit fixes a traceback that happens when someone opens a pos
config with a belgian blackbox configured. The traceback is caused by
the _notify "CLOCKING" where the "_" fields are not sent.
Forward-Port-Of: odoo/enterprise#86884**Current behavior before PR:** The composer automatically selects all its text when focused. This behavior is only expected in threads where the channel type is `ai_composer` but currently applies to all threads. **Desired behavior after PR is merged:** The automatic text selection happens only in threads where the channel type is `ai_composer`. Other composers remain unaffected and behave normally. Forward-Port-Of: odoo/enterprise#86745
Original PR description
**Current behavior before PR:** The composer automatically selects all its text when focused. This behavior is only expected in threads where the channel type is `ai_composer` but currently applies to all threads. **Desired behavior after PR is merged:** The automatic text selection happens only in threads where the channel type is `ai_composer`. Other composers remain unaffected and behave normally. Forward-Port-Of: odoo/enterprise#86745
#PURPOSE: - Currently is the user is promoted as admin for accounting and he/she is try to generate/regenerate or view the gst report following Error is thrown. - Access Error ```Uh-oh! Looks like you have stumbled upon some top-secret records. Sorry, Marc Demo (id=5) doesn't have 'read' access to: - Document (documents.document)``` #STEPS TO REPRODUCE 1) Install necessary modules for indian accounting localization. 2) Enable GST E-Filing & Matching Fe
Original PR description
#PURPOSE: - Currently is the user is promoted as admin for accounting and he/she is try to generate/regenerate or view the gst report following Error is thrown. - Access Error ```Uh-oh! Looks like…
#PURPOSE:
- Currently is the user is promoted as admin for accounting and he/she is try
to generate/regenerate or view the gst report following Error is thrown.
- Access Error
```Uh-oh! Looks like you have stumbled upon some top-secret records.
Sorry, Marc Demo (id=5) doesn't have 'read' access to:
- Document (documents.document)```
#STEPS TO REPRODUCE
1) Install necessary modules for indian accounting localization.
2) Enable GST E-Filing & Matching Feature from account's configuration.
3) Go to Settings -> User & Companies -> Users
4) Click new if no user is there other then administrator else click on
another user.
5) Under Access Rights section , inside Accounting select Administrator & Save.
6) Now log in as new user in another tab.
7) Go to Accounting -> Reporting under 'India' section click on
GST Return Period.
8) Click on generate/regenerate or View option.
9) The above shown error will be raised.
#SPECIFICATION:
- The issue is with documents access rights
- After promoting user to admin of accounting, the document's folder right is
not properly assign to user.
- fix this by giving rights of GSTR folder to user if user is in accounting
manager group.
task-4770583
Forward-Port-Of: odoo/enterprise#86660
Forward-Port-Of: odoo/enterprise#84747When Acerta Affiliation Number is unset and user tries to generate export file, A traceback will appear. Steps to reproduce the error: - Install ``l10n_be_hr_payroll_acerta`` module and switch to belgian company - Create an employee A > Create a contract(Status: Running) for that employee A > Details > Set Acerta code > save - Go to Payroll > Configuration > Settings > Unset Acerta Affiliation Number - Go to Payroll > Reporting > Export Work Entries to Acerta > New > Populate > Click
Original PR description
When Acerta Affiliation Number is unset and user tries to generate export file, A traceback will appear. Steps to reproduce the error: - Install ``l10n_be_hr_payroll_acerta`` module and switch to…
When Acerta Affiliation Number is unset and user tries to generate export file,
A traceback will appear.
Steps to reproduce the error:
- Install ``l10n_be_hr_payroll_acerta`` module and switch to belgian company
- Create an employee A > Create a contract(Status: Running) for that employee A >
Details > Set Acerta code > save
- Go to Payroll > Configuration > Settings > Unset Acerta Affiliation Number
- Go to Payroll > Reporting > Export Work Entries to Acerta > New > Populate > Click on Generate Export File button
Traceback:
```
File "/home/odoo/src/enterprise/l10n_be_hr_payroll_acerta/models/hr_payroll_export_acerta.py", line 45, in _generate_line
return 'KLX1' + self.company_id.acerta_code + contract.acerta_code.zfill(20) \
TypeError: can only concatenate str (not "bool") to str
```
https://github.com/odoo/enterprise/blob/a4f68967a9826fac981c1141ece1791a0baf647a/l10n_be_hr_payroll_acerta/models/hr_payroll_export_acerta.py#L45
When ``self.company_id.acerta_code`` is not set,
It will lead to the above traceback.
sentry-6620429585
Forward-Port-Of: odoo/enterprise#86098Currently, sending an invoice can raise an error if the **Electronic Invoice Type** is not set on the invoice. **Steps to Reproduce:** - Install the `l10n_co_dian` module. - Change the default company to **CO Company**. - Create and confirm a customer invoice, but leave the **Electronic Invoice Type** unset. - Send the invoice. **Error:** `AttributeError - 'bool' object has no attribute 'rjust'` Here, an issue occurs because the system attempts to call `rjust()` on the field `l10n_
Original PR description
Currently, sending an invoice can raise an error if the **Electronic Invoice Type** is not set on the invoice. **Steps to Reproduce:** - Install the `l10n_co_dian` module. - Change the default company to **CO Company**. - Create and confirm a customer invoice, but leave the **Electronic Invoice Type** unset. - Send the invoice. **Error:** `AttributeError - 'bool' object has no attribute 'rjust'` Here, an issue occurs because the system attempts to call `rjust()` on the field `l10n_co_edi_type` without ensuring it is a string. When the field is `False`, it results in an Attribute error. - [1] This commit ensures the right access to `rjust()` only when `l10n_co_edi_type` is a valid string, preventing the error. [1] - https://github.com/odoo/enterprise/blob/8d7a13822e9fd480a6e279ff93e29834a6668536/l10n_co_dian/models/account_edi_xml_ubl_dian.py#L974-L975 Sentry - 6622171121 Forward-Port-Of: odoo/enterprise#86769 Forward-Port-Of: odoo/enterprise#86211
Currently, an error occurs when updating data for payroll if a referenced partner record has been deleted by the user. **Steps to produce:** - Install the `contacts` and `l10n_ma_hr_payroll` module. - Delete the partner **National Social Security Fund**. - Navigate to `Settings > Technical > Scheduled Actions`. - Run action manually for **Payroll: Update data**. - Observe the error. **Error:** `ValueError: ParseError('while parsing /home/odoo/src/enterprise/saas-18.3/l10n_ma_hr_payro
Original PR description
Currently, an error occurs when updating data for payroll if a referenced partner record has been deleted by the user. **Steps to produce:** - Install the `contacts` and `l10n_ma_hr_payroll` module.…
Currently, an error occurs when updating data for payroll if a referenced partner record has been deleted by the user.
**Steps to produce:**
- Install the `contacts` and `l10n_ma_hr_payroll` module.
- Delete the partner **National Social Security Fund**.
- Navigate to `Settings > Technical > Scheduled Actions`.
- Run action manually for **Payroll: Update data**.
- Observe the error.
**Error:**
`ValueError: ParseError('while parsing /home/odoo/src/enterprise/saas-18.3/l10n_ma_hr_payroll/data/hr_salary_rule_data.xml:169 ...`
The error occurs because the method at [1] tries to load the `hr_salary_rule_data.xml` file, which references a deleted `partner_id` [2], resulting in a parsing failure.
[1] - https://github.com/odoo/enterprise/blob/b7c26a504264ee02ce40fc522faa2ef3624c9915/l10n_ma_hr_payroll/models/hr_payslip.py#L9
[2] - https://github.com/odoo/enterprise/blob/b7c26a504264ee02ce40fc522faa2ef3624c9915/l10n_ma_hr_payroll/data/hr_salary_rule_data.xml#L169
This commit ensures that all the referenced data is loaded properly, preventing errors due to missing references.
Sentry - 6617089492
Forward-Port-Of: odoo/enterprise#85979This commit adapts our media upload usage of the Twitter API as they decided on a lunch break to deprecate the `command` parameter from their `/2/media/upload` endpoint. We now have to use `/2/media/upload/initialize`, `/2/media/upload/{id}/append` and `/2/media/upload/{id}/finalize` to upload a media to twitter. Instead of the old command parameter. task-4771023 Forward-Port-Of: odoo/enterprise#84667
Original PR description
This commit adapts our media upload usage of the Twitter API as they decided on a lunch break to deprecate the `command` parameter from their `/2/media/upload` endpoint.
We now have to use `/2/media/upload/initialize`, `/2/media/upload/{id}/append` and `/2/media/upload/{id}/finalize` to upload a media to twitter. Instead of the old command parameter.
task-4771023
Forward-Port-Of: odoo/enterprise#84667The aim of this commit is to prevent the file generated to be rejected by the administration. Before this commit: As there weren't any mapping for those country code, the field `f2112_buitenlandspostnummer` wouldn't be set in the xml. After this commit: The field is correctly set task-none Forward-Port-Of: odoo/enterprise#86886
Original PR description
The aim of this commit is to prevent the file generated to be rejected by the administration. Before this commit: As there weren't any mapping for those country code, the field `f2112_buitenlandspostnummer` wouldn't be set in the xml. After this commit: The field is correctly set task-none Forward-Port-Of: odoo/enterprise#86886
This commit will remove the search in the loop that was present and was causing some performance issues when opening the bank reconciliation widget. no task id Forward-Port-Of: odoo/enterprise#85346
Original PR description
This commit will remove the search in the loop that was present and was causing some performance issues when opening the bank reconciliation widget. no task id Forward-Port-Of: odoo/enterprise#85346
The order of a One2many field isn't well defined and depending on the situation the records may be in the order you added them or the order defined by `_order` on the model. Before 18.3, a hack was added to sort them using `id` which worked. In 18.3 it no longer works consistently. This explicitly orders the payments when generating the file using their default _order, which is the default order in which they appear in the batch payment list view. Fixes runbot build error 181847 Forward-P
Original PR description
The order of a One2many field isn't well defined and depending on the situation the records may be in the order you added them or the order defined by `_order` on the model. Before 18.3, a hack was added to sort them using `id` which worked. In 18.3 it no longer works consistently. This explicitly orders the payments when generating the file using their default _order, which is the default order in which they appear in the batch payment list view. Fixes runbot build error 181847 Forward-Port-Of: odoo/enterprise#86265