Daily updates from Odoo
Thursday, September 4, 2025
37 changes
15 changes
Resolved issues and error corrections
The website editor now correctly shows the highlight tool as active when selected highlighted text is revisited. This helps users understand the current formatting state and avoid unnecessary repeated edits.
Original PR description
With the initial [website builder refactor], the highlight tool did not show when it is active or not. This commit adds the `active` class on the button when it is. Steps to reproduce: - Open website builder - Select some text - Add a highlight - Select the same text again (and expand the toolbar again) - Bug: the highlight tool is not shown as active [website builder refactor]: 9fe45e2b7ddbbfd0445ffe25a859e67a316d02b2 task-4367641
Discuss now correctly clears unread indicators when a user opens a channel after another browser session already marked it as read. This prevents stale unread badges and keeps message status consistent across multiple browser windows.
Original PR description
Before this commit, if you opened an unread channel that the server already considered “read,” the channel would remain marked as unread in your browser. This typically happens when one browser instance misses the bus notification that cleared the unread status. Steps to reproduce: 1. Open Discuss as the same user on two browsers (A and B) 2. Send a message to said user 3. Stop bus notifications on browser A 4. Read the message on browser B 5. Re-enable bus notification on browser A 6. Open the channel on browser A -> not being marked as read This happens because the method `_set_last_seen_message` skips sending the notification when the message seen is older than the current `seen_message_id` (previously set by the other browser). This commit fixes the issue by setting the `allow_order` parameter in the rpc call. task-4863058 Forward-Port-Of: odoo/odoo#224881 Forward-Port-Of: odoo/odoo#218623
This fixes an error that prevented users from activating the Employee calendar view through Studio. The calendar setup now uses searchable employee contract dates, allowing the view to be enabled without a crash.
Original PR description
Steps to reproduce: - On the Employee app, activate Studio - Switch to the "Views" menu - Click on "Calendar" under the "Timeline views" group - A traceback happens and you can not activate the view Reason: The calendar view tries to setup itself with the fields "date_start" and "date_end" of hr.version. However, those two fields are computed fields, and thus not stored, which causes an error when the fields are used in a SQL query. How it was fixed: By defining a search method for both hr.version.date_start and hr.version.date_end that overrides them with contract_date_start and contract_date_end which are not computed fields. Task ID: 5043792
This fix keeps the editor’s text selection when users select content with the keyboard and preview formatting changes. As a result, color and background color tools remain available instead of closing unexpectedly, making text editing more reliable.
Original PR description
Steps to Reproduce: - Go to To-do and create a new item. - Type something in the editor. - Select all the text using Ctrl + A (keyboard). - Try to change the color/background color. - The toolbar closes suddenly. Current behavior before PR: - The selection was only being saved when using a mouse. Keyboard-based selections (like Ctrl + A) were not staged. - As a result, when undoing a preview, the editor couldn't restore the selection. Desired behavior after PR is merged: - Now the selection is saved earlier, so it can be restored properly when reverting to previous step. - This keeps the toolbar open and working as expected. task-4941601 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
The HTML editor now more accurately recognizes internal Odoo links, including links that use the Odoo instance domain. It also better identifies valid website pages, reducing incorrect warnings when users preview links such as shop category pages.
Original PR description
Before this commit: the condition to check if an url is internal is not complete as the user could user the odoo instance domain instead of the real domain. The check if an internal url is a frontend one is rather naive as there are cases where the url ends with a number but actually not leading to a record. Reproduction for the second use case: 1. create a link with frontend url for example `/shop/category/16` 2. click on the link, when it loads the preview, a warning pops up After this commit, the cases explained above are included. task-4971829 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update speeds up an internal test selection process by avoiding unnecessary checks when special test tags are not being used. It also helps prevent issues in environments where source files are unavailable, improving reliability for development and release workflows.
Original PR description
`get_method_additional_tags` can be slow when there are a lot of test to load while the feature is only needed in rare cases. This commit removes the check if the corresponding tag is not in the config test-tags. This should also solve an issue when the sources are not available. Forward-Port-Of: odoo/odoo#225109 Forward-Port-Of: odoo/odoo#225061
This fixes website analytics goal tracking so custom goal details are sent in the expected format again. Businesses using Plausible analytics can rely on conversion reports with custom parameters, such as cart-related goals, remaining accurate after the recent website framework update.
Original PR description
Since commit b9b3a60, conversion to owl, the props are sent as string instead of object.
This commit restores old behaviour of using a JSON object for props.
Before commit b9b3a60:
> $($0).data('event-params')
{Type1: 'cart'}
After commit b9b3a60:
> $0.dataset.eventParams
'{"Type1": "cart"}'
After this commit:
> JSON.parse($0.dataset.eventParams)
{Type1: 'cart'}
opw-oxpslide-stbu
Forward-Port-Of: odoo/odoo#225324This fix prevents Odoo test runs from crashing when no test tags are configured. It helps CI pipelines using pytest integrations complete reliably instead of failing on an internal configuration default.
Original PR description
Description of the issue/feature this PR addresses: The issue arises when using pytest (to get junit xml for CI) with [pytest-odoo==1.0.1](https://github.com/camptocamp/pytest-odoo) ``` run_tests def get_method_additional_tags(self, test_method): run_tests """Guess if the test_methods is a query_count and adds an `is_query_count` tag on the test run_tests """ run_tests additional_tags = [] run_tests > if 'is_query_count' in odoo.tools.config['test_tags']: run_tests E TypeError: argument of type 'NoneType' is not iterable run_tests run_tests ../custom/src/odoo/odoo/tests/common.py:778: TypeError ``` Info @wt-io-it --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225496
This fixes guided tours so they wait for page changes to finish before looking for the next item to click. It prevents tours from accidentally going backwards or failing when a menu action is still loading a new screen.
Original PR description
Step to reproduce: - Create a tour - Add a step that click on a menuitem on the systray with a view already opened - Then add a step that click on the search bar of the view Before this commit, if the step of a tour was triggering an action (e.g.: a menuitem) and that the next step's trigger was finding an element on the view before the action has finished to update the view, then the tour was backwarding because the found element diseppeared when the new action loaded the new view. Now, the tour interactive wait that the action manager finish to update the view to be sure the get the right element for the step trigger. ISSUE: https://github.com/odoo/odoo/issues/214652 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#220319
The Indian e-waybill screen now shows errors and warnings with the correct visual colors, making important messages easier to understand. Errors appear in red and warnings in yellow, reducing confusion for users reviewing e-waybill issues.
Original PR description
Before: --- Error and warning colors were mismatched in the e-waybill view. In this commit: --- Fixed the e-waybill view to correctly display error messages - Errors now display in red (alert-danger) :red_square: - Warnings now display in yellow (alert-warning) :yellow_square: AccessError now handled correctly. --- task-5050937 Forward-Port-Of: odoo/odoo#225288 Forward-Port-Of: odoo/odoo#225078
This fix helps website generation recover properly when two processes try to update data at the same time. Instead of failing permanently, the system can now retry the operation, reducing occasional errors for users creating or updating websites.
Original PR description
When a concurrency error occurs, we need to let it retry. To do this, we must catch the Serialization Failure and raise it.
This update ensures a quality control test can run correctly when the module is installed on its own without demo data. It avoids false test failures related to missing user permissions for serial number label printing, improving reliability for validation and maintenance.
Original PR description
## Issue:
The test `test_receipt_validation_triggers_serial_number_label_print` fails when running `quality_control` alone without demo data
## Cause:
The user is missing the group `stock.group_production_lot`, that enable serial number printing
As a result, the condition `self.env.user.has_group('stock.group_production_lot')` in `stock.picking` `_get_autoprint_report_actions()` is not satisfied
The `button_validate()` in `stock.picking` will have an empty report_actions and will not print anything
The Demo data that allow the test to work is in `stock`
https://github.com/odoo/odoo/blob/9b08449f25cd16dc15117d305726380298c313d8/addons/stock/data/stock_demo.xml#L176-L182
## Steps to reproduce:
- Install only `quality_control` (no demo data)
- Run the test `test_receipt_validation_triggers_serial_number_label_print`
related-to: https://github.com/odoo/enterprise/pull/90134
opw-4790427
Forward-Port-Of: odoo/enterprise#93799
Forward-Port-Of: odoo/enterprise#93296The PLM dashboard now shows a more accurate count of engineering change validations that are specifically waiting for the current user. This helps users prioritize their own approval work without being distracted by approvals assigned to others.
Original PR description
The dashboard of PLM displays for each ECO type the number of validations pending in general, and the validations waiting for me specifically. The latter has been incorrectly computed for quite some time, as it computes how many ECOs exists where I am an approver and an approval is waiting - but there is no guarantee that the waiting approval is one of mine; it might be that I am a past approver of the ECO and that another approval (waiting for somebody else than me) exists, or that two approval are required on the same stage (one by me, one by somebody else) and I already approved. This commit switches the computation around by looking for pending approvals waiting for me, and then get the number of (non-archived) ECOs bound to them. Forward-Port-Of: odoo/enterprise#93728 Forward-Port-Of: odoo/enterprise#92348
This fix ensures portal users cannot become owners of Documents spreadsheets, because spreadsheets cannot be shared with editing rights to non-internal users. It helps keep ownership and access permissions aligned, reducing confusion and preventing unsupported sharing scenarios.
Original PR description
Following the discussion I had with @flch-odoo regarding https://github.com/odoo/enterprise/pull/92134 , Since Spreadsheets can not be shared in edit mode to non-internal users, we prevent them from becoming owners. opw-4753670 Forward-Port-Of: odoo/enterprise#93800 Forward-Port-Of: odoo/enterprise#92409
This fix stops Documents from opening a broken linking flow when there are no vehicle records available. Users will no longer see a crash when trying to link a document from the Fleet folder before any vehicles have been created.
Original PR description
*= documents_fleet Currently, when user tries to link a document with a vehicle and if there is no vehicle exists an error is raised. **Steps to Reproduce:** 1) Install `documents_fleet`…
*= documents_fleet Currently, when user tries to link a document with a vehicle and if there is no vehicle exists an error is raised. **Steps to Reproduce:** 1) Install `documents_fleet` module(without Demo Data). 2) Open Documents App. 3) Upload a file in `Fleet` folder. 4) Select the uploaded file and click on `'Link to a vehicle'` button. Error: `ValueError: invalid literal for int() with base 10: 'False'` Root Cause: The `link_to_record` method attempts to find the first record of the target model to use as a default value when opening the linking wizard. If no records exist, the search returns an empty recordset, and accessing `.id` at [1], on it results in the value `False`. The code then incorrectly constructs a default reference string like `fleet.vehicle,False`. The wizard crashes when it tries to parse this string and convert the `False` part to an integer. Solution: This commit prevents error by ensuring that the user cannot link a document to a model without existing records. [1]- https://github.com/odoo/enterprise/blob/83640d21b2c31ed9d572c48e02a9aeea9eb1607b/documents/models/documents_workflow_rule.py#L113 sentry-6792079496 Forward-Port-Of: odoo/enterprise#93738 Forward-Port-Of: odoo/enterprise#91888
10 changes
Resolved issues and error corrections
The signature dialog no longer shows the typed and drawn signatures on top of each other. This prevents visual confusion when users sign documents and makes the signing experience clearer and more reliable.
Original PR description
Fixed an issue where both the auto-generated and drawn signatures overlapped in the signature dialog. This was caused by the system automatically setting the user's default signature to the drawn one when opening the dialog. Now, the dialog no longer defaults to the drawn signature, preventing visual overlap and ensuring a cleaner user experience. Forward-Port-Of: odoo/enterprise#93750
The project budget display now shows the correct warning color when an expense budget is exceeded. This helps users quickly spot overspending risks instead of seeing a misleading green status.
Original PR description
**Step to reproduce:** - install "project_account_budget" - go to accounting > accounting > Analytic Budget - create a budget of type expense,say test budget - select analytic account `Asustek - Wood…
**Step to reproduce:**
- install "project_account_budget"
- go to accounting > accounting > Analytic Budget
- create a budget of type expense,say test budget
- select analytic account `Asustek - Wood Corner`
- set budget amount => 500. open the budget
- create a new project 'test project"> open setting > Analytic Page
- add `Asustek - Wood Corner` analytic account in project field
- create a PO with amount > 500
- in analytic distribution column, add `Asustek - Wood Corner` in project column
- confirm PO and create Bill
- Go to `test project` settings > Dashboard smart button
**Observation:**
- For exceeding expense budget, we have green color in budget section
- It should be red
**Cause:**
The conditional class for budget progress was incorrectly evaluated due to missing parentheses around the `and` condition.
In expressions like:
`(true and (1 == 1 ? 'a' : 'c')) or (1 == 1 ? 'b' : 'd') → 'a'` ✅
`true and 1 == 1 ? 'a' : 'c' or 1 == 1 ? 'b' : 'd' → 'b'` ❌
Without parenthesis, the `or` clause is evaluated unexpectedly, even when the `and` branch is intended to take precedence.
This commit wraps the `and` condition in parentheses to ensure the correct evaluation order and consistent class assignment.
Budget:
<img width="1203" height="291" alt="budget 4968162" src="https://github.com/user-attachments/assets/2d8223d5-0344-4ad0-b33c-2598ea167f2d" />
Before fix:
<img width="623" height="195" alt="before fix 4968162" src="https://github.com/user-attachments/assets/4ac749bf-fa93-4835-963a-5dfbdd05559d" />
After fix:
<img width="643" height="225" alt="after fix 4968162 " src="https://github.com/user-attachments/assets/4fd228f9-e32f-48d9-b6ef-55251b21d601" />
opw-4968162
Forward-Port-Of: odoo/enterprise#93243
Forward-Port-Of: odoo/enterprise#91617A missing web address is now included when sending Aadhaar signing requests. This helps the testing service receive the information it needs, making Aadhaar signing easier to validate before use.
Original PR description
Before this change, the request didn’t include the URL, so during testing the IAP was missing it. Now the URL is added to the request, which makes it easier to test Aadhaar sign.
This update adjusts an automated appointment test to match a recent change in how editable selections behave. It helps keep quality checks accurate and reduces the risk of false test failures during future updates.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/224818 task-4585835
This change updates an internal appointment test so it matches the latest behavior when editing selections. It helps keep automated quality checks reliable without changing the customer-facing appointment experience.
Original PR description
Community PR: https://github.com/odoo/odoo/pull/213300 task-4585835
The PLM dashboard now counts only engineering change orders that are actually waiting for the current user's approval. This prevents inflated or misleading personal approval counts when another approver still needs to act or when the user already approved earlier.
Original PR description
The dashboard of PLM displays for each ECO type the number of validations pending in general, and the validations waiting for me specifically. The latter has been incorrectly computed for quite some time, as it computes how many ECOs exists where I am an approver and an approval is waiting - but there is no guarantee that the waiting approval is one of mine; it might be that I am a past approver of the ECO and that another approval (waiting for somebody else than me) exists, or that two approval are required on the same stage (one by me, one by somebody else) and I already approved. This commit switches the computation around by looking for pending approvals waiting for me, and then get the number of (non-archived) ECOs bound to them. Forward-Port-Of: odoo/enterprise#93728 Forward-Port-Of: odoo/enterprise#92348
Users can no longer trigger an error when trying to link a document to a vehicle if no vehicles have been created yet. The system now blocks that unsupported action gracefully, avoiding a confusing crash in the Documents app.
Original PR description
*= documents_fleet Currently, when user tries to link a document with a vehicle and if there is no vehicle exists an error is raised. **Steps to Reproduce:** 1) Install `documents_fleet`…
*= documents_fleet Currently, when user tries to link a document with a vehicle and if there is no vehicle exists an error is raised. **Steps to Reproduce:** 1) Install `documents_fleet` module(without Demo Data). 2) Open Documents App. 3) Upload a file in `Fleet` folder. 4) Select the uploaded file and click on `'Link to a vehicle'` button. Error: `ValueError: invalid literal for int() with base 10: 'False'` Root Cause: The `link_to_record` method attempts to find the first record of the target model to use as a default value when opening the linking wizard. If no records exist, the search returns an empty recordset, and accessing `.id` at [1], on it results in the value `False`. The code then incorrectly constructs a default reference string like `fleet.vehicle,False`. The wizard crashes when it tries to parse this string and convert the `False` part to an integer. Solution: This commit prevents error by ensuring that the user cannot link a document to a model without existing records. [1]- https://github.com/odoo/enterprise/blob/83640d21b2c31ed9d572c48e02a9aeea9eb1607b/documents/models/documents_workflow_rule.py#L113 sentry-6792079496 Forward-Port-Of: odoo/enterprise#93843 Forward-Port-Of: odoo/enterprise#91888
The payslip list now shows the correct action buttons depending on the payroll context, fixing a confusing “New/Off-Cycle” button display. This helps payroll users choose the right action and reduces mistakes when creating or managing payslips.
Original PR description
Fix the "NewOff-Cycle" Add test to be sure that depending on the context, good control panel buttons are shown.
This update fixes how the eMsigner signing service retrieves the system URL. It helps prevent connection or redirection issues when users access e-signature features through the controller.
Original PR description
in this commit, get the url from request.env['iap.account'] instead of self as in controller we don't have access to get_base_url.
The ESG employee commuting report now keeps its internal report entries in a stable order. This prevents records from appearing to change between views or refreshes, improving consistency for users reviewing commuting data.
Original PR description
The esg commuting report uses ROW_NUMBER to generate record ids, which is apparently reevaluated in each query, which can lead to unstable ids. This PR adds an ORDER BY clause to ensure a deterministic behavior.
12 changes
Resolved issues and error corrections
When selling event tickets through Point of Sale, company names entered in registration questions are now correctly carried over to the event registration. This prevents missing attendee company information in the backend after a sale is validated.
Original PR description
Steps to reproduce: 1. Add a question to an event with type 'Company'. 2. Sell a ticket for that event in a POS, making sure to fill in the company question. 3. Validate the sale 4. In the backend, check the new event registration that was created. EXPECTED: The company name you filled in is saved to the registration. ACTUAL: The company name is blank. There were three things that needed to be fixed in order for the company name to work: 1. Use `company_name` instead of `company` on the JS side 2. Add `company_name` to the list of loaded POS fields 3. Tell the POS that `company_name` is not computed (this was already being done for name, email, phone) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Live chat agents now see a visitor's recent page visit times in their own timezone instead of UTC. This makes the visitor context banner easier to understand and helps agents respond with accurate timing information.
Original PR description
Before this PR, when browsing a website livechat in the discuss app, the banner containing the 3 last pages browsed by the user showed the utc time instead of the time in the timezone of the agent. Now, the livechat agent is seeing the visit timings in his timezone. To achieve this, we now construct the visit string in the frontend and receive the page and datetime (utc) info from the backend task-4937769 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Restaurant point-of-sale users can now perform Cash In/Out actions even when they are not on the product screen. This prevents an unexpected error caused by having no active selected order in that context, making cash handling more reliable during service.
Original PR description
Before this commit, performing a Cash In/Out operation in a restaurant while not on the product screen caused an error, as there was no selected order in that context. opw-5042755 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
When users switch from a website page into the website management area, the system now keeps the selected debug mode active in the main interface. This avoids confusion for administrators and support teams who rely on debug mode to diagnose or configure website behavior.
Original PR description
Before this commit, the debug mode was not correctly applied in the website backend when navigating from a website page. While the `?debug=assets` URL parameter was present, the debug mode was only active within the website's iframe, not the main backend interface itself. Steps to reproduce: - Go on a website page - Enter debug mode by adding `?debug=assets` to the URL (not ctrl+k) - Click on editor on the top left to navigate to website backend - Check with `odoo.debug` in console - Debug is activated in the iframe not in the backend
This fixes a crash that could happen when running Odoo tests with certain external test tools if no test tag setting was provided. It helps CI test reports run reliably without affecting normal business workflows.
Original PR description
Description of the issue/feature this PR addresses: The issue arises when using pytest (to get junit xml for CI) with [pytest-odoo==1.0.1](https://github.com/camptocamp/pytest-odoo) ``` run_tests def get_method_additional_tags(self, test_method): run_tests """Guess if the test_methods is a query_count and adds an `is_query_count` tag on the test run_tests """ run_tests additional_tags = [] run_tests > if 'is_query_count' in odoo.tools.config['test_tags']: run_tests E TypeError: argument of type 'NoneType' is not iterable run_tests run_tests ../custom/src/odoo/odoo/tests/common.py:778: TypeError ``` Info @wt-io-it --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#225496
This update improves the internal Hoot testing tools used to validate Odoo, making automated tests faster, cleaner, and easier to diagnose when failures happen. The changes are limited to unit testing infrastructure, reducing risk to normal business workflows while helping developers maintain quality more efficiently.
Original PR description
## Pull Request HOOT (PRHOOT) 36 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. Enterprise: https://github.com/odoo/enterprise/pull/93167 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where checkbox-style many-to-many fields did not pass needed context when looking up available records. It helps ensure those fields show the correct choices in cases where business rules or related records depend on context settings.
Original PR description
**Description of the issue/feature this PR addresses:** When `name_search` is called, the `context` is not passed to the method. In some cases, this is necessary, for example, if the field is related to `ir.attachment` and you want to pass `skip_res_field_check` in the context (see https://github.com/OCA/social/pull/1672). **Current behavior before PR:** The `context` is not passed to `name_search`. **Desired behavior after PR is merged:** Ability to pass `context` to `name_search`. From #215420 Forward-Port-Of: odoo/odoo#216588
A new automated test helps ensure contact tags can be searched without causing an error. This reduces the risk of a previous issue returning and supports smoother contact management.
Original PR description
Add basic test case for PR https://github.com/odoo/odoo/pull/221866 to ensure that the _search_display_name method on res.partner.category returns a list domain
The dialog for creating a new website now displays the title "Add Website". This makes the action clearer for users and improves consistency in the website setup flow.
Original PR description
The modal used to create a new website was missing a title. This commit fixes the issue by setting its header to "Add Website". Forward-Port-Of: odoo/odoo#225302
When a recruitment candidate is turned into a contact, Odoo now uses the candidate’s actual name instead of their email address as the contact name. Related point of sale loyalty tests were adjusted to reliably find customers before selecting them, reducing false test failures.
Original PR description
**Steps to reproduce:**
1. Install hr_recruitment
2. Go to the Candidates menu from Applications in recruitment
3. Create a candidate with both a name and an email
4. Search for the email in Contacts
**Issue:**
The created contact uses the email address as the name instead of the candidate’s name.
**Cause:**
The `find_or_create` method for partners was called without passing the candidate’s name in the parameter.
**Solution:**
Embed the candidate’s name into the email string ('Name <email>') so `find_or_create` creates the partner with the correct name.
**Additonally** some test cases were failing in pos_loyalty due to not loaded partners
so added the extra step to search customer before clicking in on the customer.
Ref commit with same issue where alphabatically low ranked partners doesn't loaded:
https://github.com/odoo/odoo/commit/25e31ac6b7966da73dcdd858322e52d5310cbd98
opw-4953299This update fixes an intermittent failure in an automated Web Studio rename test. It helps keep validation checks stable so development and release processes are less likely to be blocked by false test failures.
Original PR description
The def test_rename function (tour web_studio_main_and_rename) crashed undeterministically because the tour engine is now faster, inputs soimetime do not have the time to update. This commit fixes one instance of this. runbot-error-163471
This update cleans up how Odoo’s internal unit tests access shared testing helpers, making the test ecosystem easier to maintain. The change is limited to test code, reducing risk for regular business workflows while supporting more consistent quality checks.
Original PR description
## Pull Request HOOT (PRHOOT) 36 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/221367