Tuesday, October 28, 2025
37 changes · 19.0
Enhancements to existing features
This update simplifies how website builder options are defined and shared across related tools, making it easier for teams to maintain and extend builder features. It affects website features such as live chat, appointments, and rental search, with no expected direct disruption for end users.
Original PR description
The commit: 1. use static property to configure a builder option 2. introduce the concept of dependencies to access the plugin's shared in builder option 3. make a plugin context the same for Plugin,…
The commit:
1. use static property to configure a builder option
2. introduce the concept of dependencies to access the plugin's shared
in builder option
3. make a plugin context the same for Plugin, BuilderOption and
BuilderAction to have the same API in each class.
Before this commit, to define an option, we had to define a javascript
object that would contain the information of the option within the
`builder_options` resource.
```js
class MyPlugin extends Plugin {
resources: {
builder_options: [
{
selector: "div.selector",
template: "my.owlTemplate",
cleanForSave() {}
// ... other option props
}
]
}
}
// For a custom component
class MyPlugin extends Plugin {
resources: {
builder_options: [
{
selector: "div.selector",
template: MyCustomComponent,
cleanForSave() {}
// ... other option props
}
]
}
}
class MyCustomComponent extends BaseOptionComponent {
// ...
}
```
When building anything for the builder, there is 3 classes that are
important: `Plugin`, `BaseOptionComponent`, `BuilderAction`.
In practice, the option object defined in builder_options feels
strange. On the other hand, making the configuration of the option as
a static property of the component somehow feels simpler as everything
related to that option is defined in the same class.
```js
class MyPlugin extends Plugin {
resources: {
builder_options: [MyCustomComponent]
}
}
class MyCustomComponent extends BaseOptionComponent {
static template = "my.owlTemplate";
static selector = "div.selector";
static cleanForSave(context) {}
// ...
}
```
To have the same mental context in the 3 important class, they all
share the same API (`dependencies`, `dispatchTo`, `getResource`, ...)
(see `Editor.getPluginContext`)
To access a plugin shared method, it's now the same for `Plugin`,
`BuliderAction` and `BaseOptionComponent`:
```js
class MyCustomComponent extends BaseOptionComponent {
static selector = "mySelector";
static dependency = "myPlugin";
myMethod() {
this.dependencies.myPlugin.pluginMethod();
}
}
```
To access a resource, dispatch, ...:
```js
class MyCustomComponent extends BaseOptionComponent {
static selector = "mySelector";
myMethod() {
const resource = this.getResource('myResource');
}
}
```
Forward-Port-Of: odoo/enterprise#94102This update simplifies how website builder options are defined and managed behind the scenes. It gives developers a more consistent way to build and maintain editing tools, helping future website editing features be delivered more reliably.
Original PR description
1. use static property to configure a builder option 2. introduce the concept of dependencies to access the plugin's shared in builder option 3. make a plugin context the same for Plugin, BuilderOption and BuilderAction to have the same API in each class. See https://github.com/odoo/odoo/pull/220746 Forward-Port-Of: odoo/odoo#220746
The Colombian reports module test coverage was updated to match new account grouping rules. This is an internal quality improvement that helps ensure trial balance reports continue to be validated correctly without changing day-to-day user workflows.
Original PR description
task-5165175
The Colombian localization now includes predefined account groups to make accounting reports easier to read and better organized. This improves report presentation for new configurations without changing existing customer-defined account groups.
Original PR description
For nicer reports. task-5165175 PR note: no explicit upgrade script, because it likely will cause a mess if users already have `account.group`s defined.
The product information popup in Point of Sale now appears after a shorter long press on a product card. This makes the interaction feel quicker and closer to common mobile behavior, improving usability for sales staff on touch devices.
Original PR description
Before this PR, in order to reach the product information on the frontend, the user had to longpress the product card for 2 secondes. This PR aims to reduce the time necessary to display the product info popup, getting closer to what is done by most mobile OS can provide. --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This update makes the accounting tax calculation helper automatically extract records from the grouping key. It reduces the chance of manual handling errors and makes related tax grouping behavior easier to maintain.
Original PR description
--- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233228 Forward-Port-Of: odoo/odoo#231947
Demo data for WhatsApp accounts has been added back. This helps teams evaluate and demonstrate WhatsApp-related features more easily in demo or test environments.
Original PR description
Purpose of this commit, Adding back the demo data for whatsapp accounts. revert: https://github.com/odoo/enterprise/pull/97138 task-5172791 Forward-Port-Of: odoo/enterprise#98135
Resolved issues and error corrections
This change removes redundant validation rules in the mail module that could block database restores between PostgreSQL versions. It helps reduce upgrade and recovery issues for future databases, while existing databases may still need a manual cleanup before restoring.
Original PR description
Same as #229274 these constraints are redundant with `required=True` and cause issues when restoring a dump from pg17 to pg18. And much like #229274 this only fixes databases going forward, on existing databases the constraints have to be dropped on the source. Forward-Port-Of: odoo/odoo#233186
Code cleanup and technical improvements
This update simplifies internal test files by removing redundant grouping labels that did not add useful information. It does not change product behavior, but it should make future maintenance and reviews of automated tests clearer for development teams.
Original PR description
This commit removes test files using a single 'describe' call to wrap its tests, with a name being either redundant with the test file itself or is too misleading.
Regular expression used to find isolated suites:
```js
/^\s*import.*(?:\n(?!describe\()(?!test\().*)+\ndescribe\("[\w\s.]+",.*(?:\n(?!describe\().*)+\n\}\);\n(?!\n)/
```
Tip for reviewers: tick **"Hide whitespace"** when reviewing diff
<img width="237" height="205" alt="image" src="https://github.com/user-attachments/assets/373f7cc6-5e0e-4599-968a-39aad8fac2f0" />
Community: https://github.com/odoo/odoo/pull/233006
Forward-Port-Of: odoo/enterprise#98206
Forward-Port-Of: odoo/enterprise#98046Documentation and clarification updates
This pull request adds a signed contributor agreement record for the contributor. It is an administrative legal update that helps confirm contribution eligibility and does not affect product features or user workflows.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix prevents an accounting screen or process from failing when it encounters an empty value where a number is expected. It helps users continue their accounting work without seeing an unexpected error message.
Original PR description
Description of the issue/feature this PR addresses: ValueError: invalid literal for int() with base 10: '' Current behavior before PR: ValueError: invalid literal for int() with base 10: '' Desired behavior after PR is merged: not giving valueerror --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#232965
Generating the pricelist report no longer crashes when no pricelist exists. Instead, users are told to configure at least one pricelist first, making the issue clear and easier to resolve.
Original PR description
Current behavior before PR: Generating the Pricelist Report raises a JavaScript error — Cannot read properties of undefined (reading 'id') — when there is no pricelist in the database. Desired behavior after PR is merged: Instead of crashing, the system now validates the presence of at least one pricelist. If none is found, it raises a clear UserError message: “Please configure at least one Pricelist before generating the report.” This prevents the crash and guides the user to properly configure pricelists before running the report. Issue : https://github.com/odoo/odoo/issues/233393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Generating the pricelist report now checks whether at least one pricelist exists before continuing. If none is configured, users see a clear message explaining what needs to be set up instead of encountering a confusing crash.
Original PR description
Current behavior before PR: Generating the Pricelist Report raises a JavaScript error — Cannot read properties of undefined (reading 'id') — when there is no pricelist in the database. Desired behavior after PR is merged: Instead of crashing, the system now validates the presence of at least one pricelist. If none is found, it raises a clear UserError message: “Please configure at least one Pricelist before generating the report.” This prevents the crash and guides the user to properly configure pricelists before running the report. Issue : https://github.com/odoo/odoo/issues/233393 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures certain maintenance commands run without starting or configuring the web server. It prevents unnecessary warning messages, making command-line operations quieter and clearer for administrators.
Original PR description
Description of the issue/feature this PR addresses: Current behavior before PR: Desired behavior after PR is merged: --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fix ensures certain service transactions involving customers in the Canary Islands are assigned the correct Spanish tax reporting key. It helps businesses produce more accurate TicketBAI electronic tax records and reduces the risk of reporting errors.
Original PR description
We check that if the partner is from Canary Islands and we put a no sujeto por reglas de localizacion tax (so for services) we put the 08 key. opw-5099749 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
The AI document sorting wizard was updated so its options are formatted consistently and can be parsed correctly. This helps prevent errors when users configure AI-based document sorting, with no expected change to normal workflows.
Original PR description
Purpose ======= PyJs can parse dictionaries, even if each element does not end with `,`. We didn't use them in ai documents, but for consistency, we now added them.
This fixes a settings issue where users could not save inventory shipping settings after turning off text confirmation for WhatsApp. The WhatsApp template is now only required when text confirmation is enabled, preventing an unnecessary validation error.
Original PR description
Due to this [commit](https://github.com/odoo/enterprise/commit/fd1799dd8e3e190e894914d0c28d77d709e29eb6), The field ```stock_confirmation_wa_template_id``` is visible only when…
Due to this [commit](https://github.com/odoo/enterprise/commit/fd1799dd8e3e190e894914d0c28d77d709e29eb6), The field ```stock_confirmation_wa_template_id``` is visible only when ```stock_confirmation_type``` is set to whatsapp and ```tock_text_confirmation``` is set to True. However, the field ```stock_confirmation_wa_template_id``` is marked as required whenever ```stock_confirmation_type``` is set to whatsapp, regardless of whether ```stock_text_confirmation``` is enabled. As a result, when saving the record with ```stock_text_confirmation``` unchecked, the required field ```stock_confirmation_wa_template_id``` remains invisible and unset — which causes a missing required field error during record save. Steps to reproduce: [Video](https://drive.google.com/file/d/1XVV4mJjSX_8acDDbv83VtWrbZtYz6Kqg/view) 1. go to settings - inventory - shipping 2. check Text Confirmation , set stock_confirmation_type = whatsapp 3. uncheck Text confirmation 4. save the changes To fix this issue, need to just add condition of ```stock_text_confirmation```
This fix prevents users from directly editing linked database users in the database project view. It helps keep database user information controlled through the intended workflow and reduces the risk of accidental changes.
Original PR description
This commit is the counter part of odoo/odoo#231902 which allows to disable the write action on x2many fields. See [1] for details. [1] https://github.com/odoo/enterprise/pull/94207#discussion_r2378129896 Task~5160367
Sales teams can now click product lines on draft sales orders to edit the product or description instead of being taken to the product record. This removes an unnecessary interruption and makes order adjustments faster before confirmation.
Original PR description
Versions -------- - saas-18.3+ Steps ----- 1. Create a sales order; 2. add a product that doesn't have an extra description; 3. save & exit view; 4. go back to view; 5. add a description or change the product on the line. Issue ----- Clicking on the product field opens the product record instead of edit mode. Cause ----- It opens the product record because the `canOpen` property is set to `true`. As this is the default value, and isn't getting changed anywhere, the line will always open the product record outside of edit mode. Solution -------- Instead of using OR, check `props.canOpen` AND additional checks. opw-5172115 Forward-Port-Of: odoo/odoo#232861
This fix prevents a manufacturing planning test from creating a duplicate purchase order line when demo data is used in different time zones. It makes the automated check more reliable, helping avoid false test failures without changing normal business behavior.
Original PR description
The `test_replenish` test was failing with demo data because replenishment created an extra Purchase Order line. The `_run_buy` search domain included `date_planned_mps` with an equality check on a datetime stored in UTC. With demo data loaded in a non-UTC timezone (e.g. Europe/Brussels), the forecast date was converted to 2025-07-31 22:00:00 UTC, which did not match the existing PO at 2025-08-01 00:00:00 UTC. As a result, no PO was found and a duplicate was created. Changes: Set the test user timezone to UTC so that `date_planned_mps` comparisons are stable when using demo data. This ensures replenishment reuses the existing PO instead of creating a duplicate. runbot-230425
This fixes a timezone-related issue that could cause a manufacturing planning test to create a duplicate purchase order line when demo data was loaded. The change makes the test environment consistent, helping ensure reliable validation without affecting day-to-day business workflows.
Original PR description
The `test_replenish` test was failing with demo data because replenishment created an extra Purchase Order line. The `_run_buy` search domain included `date_planned_mps` with an equality check on a datetime stored in `UTC`. With demo data loaded in a non-UTC timezone (e.g. Europe/Brussels), the forecast date was converted to `2025-07-31 22:00:00 UTC`, which did not match the existing PO at `2025-08-01 00:00:00 UTC`. As a result, no PO was found and a duplicate was created. Changes: Set the test user timezone to UTC so that `date_planned_mps` comparisons are stable when using demo data. This ensures replenishment reuses the existing PO instead of creating a duplicate. [runbot-230425](https://runbot.odoo.com/odoo/error/230425)
This update fixes an intermittent automated test failure in the Barcodes area by ensuring the screen has finished updating before the test checks the result. It helps keep quality checks stable and reduces false alarms during development.
Original PR description
This commit fixes a test that sometimes failed, because we didn't wait for an animationFrame after the macro was complete. As a consequence, there was no guarantee that the form view had been updated before the check. runbot error~226829 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#233153
This fix prevents an error when manufacturing quality checks are used without the work order feature installed. It keeps quality point validation working reliably by only checking work-order-specific details where that information exists.
Original PR description
**Issue:** The attribute operation_id for quality.point is defined in the mrp_workorder module. However, quality_mrp module does not list mrp_workorder in its dependencies. As a result in a system where quality_mrp is installed but mrp_workorder is not, the following error is raised when evaluating the constrain for quality points mesured on Operations. `"'quality.point' object has no attribute 'operation_id'"` **Proposed solution:** Override the constraint in quality_mrp_workorder to include conditions related to operation_id, ensuring that it is only evaluated when the field is available. Forward-Port-Of: odoo/enterprise#97801 Forward-Port-Of: odoo/enterprise#97338
This fixes an issue where saving departure notes for an archived employee could fail because the system tried to track a type of rich-text field that is not supported for change tracking. HR users can now update this information without encountering an error.
Original PR description
Html fields are not part of the supported fields for tracking, see https://github.com/odoo/odoo/blob/11289fd128827587f6ed3fc5beed28f461c0e039/addons/mail/models/mail_tracking_value.py#L49 This causes a traceback when saving the `departure_description` on an archived employee. Added in https://github.com/odoo/odoo/commit/aa4d13b89b4497d2e5b33faa49ad86e0788782a2 Previous related fix: 9b723e2591224f2b563924d3b3dfe27ab909b7d0 opw-5140525 Forward-Port-Of: odoo/odoo#230332
This fixes an error that could prevent respondents from completing mandatory matrix questions when the question description included a table. Surveys with richer descriptions now work reliably without interrupting the response process.
Original PR description
A conflict occurs if a matrix question is set to "Mandatory answer" (questionRequired = True) and a table is also added to its description. The issue is that when the system evaluates a required matrix, it gets the subQuestionsIds by looking for the first table within the question's wrapper. If a table exists in the description, the system incorrectly tries to retrieve the IDs from that table. This action throws a traceback because the descriptive table does not contain any sub-question data. This commit fixes the issue by being more specific when looking for the table containing the subQuestionsIds. It adds a specific class to this table and uses it in the selector. An attribute selector, like 'table[data-sub-questions]', could also have been used as an alternative. opw-4931881 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#229909
German e-invoices now use the parent company or contact name when an invoice address has no separate contact name. This prevents labels like “Invoice Address” from appearing in XML invoice files, keeping electronic documents consistent with the PDF invoice.
Original PR description
**Steps to reproduce:** - Install Contacts, Accounting and l10n_de - Switch to a German company (e.g. DE Company) - Go to Contacts - Create a German contact with "XRechnung CIUS" as electronic format…
**Steps to reproduce:** - Install Contacts, Accounting and l10n_de - Switch to a German company (e.g. DE Company) - Go to Contacts - Create a German contact with "XRechnung CIUS" as electronic format - For this contact, create an "Invoice Address" without "Contact Name" - Create an invoice with the invoice address as customer - Confirm the invoice - Generate "XRechnung" via "Send & Print" button **Issue:** In the generated ULB XML and in factur-x.xml file embedded in the PDF, the customer name contains the mention "Invoice Address", which doesn't appear on the PDF of the invoice. **Cause:** The used invoice address has no name, so its "display_name" is build from the name of the parent contact and the type of the child contact (i.e. Invoice Address). **Solution:** Only use "display_name" of a contact if "name" is set. Otherwise fall back on "display_name" of the commercial partner. opw-5159291 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#233128 Forward-Port-Of: odoo/odoo#232819
This change fixes a failing automated test around hiding already paid ecommerce orders from Point of Sale. It removes an unnecessary payment provider dependency from the test setup, helping keep validation reliable without changing customer-facing behavior.
Original PR description
The code of the payment provider is not relevant to the test_ecommerce_paid_order_is_hidden_in_pos test, and pos_sale doesn't have payment_custom in the dependencies. It caused tests to fail so I removed it. Runbot Build Error-233461 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue that stopped users from generating a QR code in the expense Stripe top-up wizard. The wizard now uses the correct contact information, allowing the top-up process to continue as expected.
Original PR description
Fix a bug preventing from creating a qr code in the topup wizard due to a res.partner.bank being used instead of a res.partner
This fixes the thousand separator used for Slovenian in Odoo's base language settings. Slovenian users will now see large numbers formatted correctly and consistently across the system.
Original PR description
TASK-ID: 5183221 --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
This fixes an issue where approval-related automated tests could fail when demo data was installed. The change keeps test setup clean so quality checks run reliably across different environments.
Original PR description
When running with demo data, the tests `test_compute_request_status` and `test_compute_request_status_with_required` fail with the error: `UniqueViolation: duplicate key value violates unique constraint "approval_approver_unique_request_user"` This happens because the category "Business Trip" (`approvals.approval_category_data_business_trip`) already injects approvers into the approval request. The two failing tests were creating additional approvers for the same users, leading to a UNIQUE constraint violation on (request_id, user_id). This commit resets the request approvers (`record.approver_ids = []`) before adding the test-specific approvers, ensuring the test passes both with and without demo data. [RB-230935](https://runbot.odoo.com/odoo/error/230935)
A payroll accounting test for UAE localization was updated so its test user always has the needed payroll permissions. This prevents environment-specific test failures and helps keep validation reliable whether demo data is installed or not.
Original PR description
The test `TestPayslipValidation` in `l10n_ae_hr_payroll_account` was failing on runbot without demo data:
AccessError: You are not allowed to access 'HR Work Entry Type'
This happens because the test user does not belong to a group with access to `hr.work.entry.type`. With demo data, the user inherits the necessary rights, but without demo data it fails.
This commit explicitly grants the test user the `hr_payroll.group_hr_payroll_user` group to ensure consistent access across environments.
[RB-232462](https://runbot.odoo.com/odoo/error/232462)This change strengthens an automated web client test that could fail randomly due to timing in URL state updates. It reduces false test failures without changing normal user behavior, helping keep the release validation process reliable.
Original PR description
Before this commit, the test sometimes failed because the resulting url was `/odoo/action-100/1/action-200/1` whereas it should have been `/odoo/action-100/1/action-200`. The issue occurs because the…
Before this commit, the test sometimes failed because the resulting url was `/odoo/action-100/1/action-200/1` whereas it should have been `/odoo/action-100/1/action-200`. The issue occurs because the `pushState` method of the router by default batches its calls to the next tick (setTimeout(0)). As a consequence, in the test, the actions were sometimes executed too quickly s.t. the state of the different actions were mixed. First, this is an obvious issue of the way the state of the router is updated by the action service, which is highlighted by the test. Second, this issue is very unlikely (not to say impossible) to be reproduced in practice, as it would require the user to click to quickly that more than one action could be executed in the same tick. For those reasons, in 19, we decided to simply strenghten the test such that it no longer fails. In master, we will use the `sync` option of pushState to push the state directly when the controller is mounted. That change being a bit tricky and prone to unexpected effets, we prefered not to do it in stable. runbot error~233361 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
The Field Service map task list now keeps appointment times such as "10:00" on one line. This makes task pins easier to scan and prevents confusing line breaks in the sidebar.
Original PR description
### Steps to Reproduce 1. Open Field Service app 2. Navigate to My Tasks -> Map 3. Observe task pins in the left sidebar list 4. Notice time displays like "10:00" break across multiple lines ### Issue The formatted time display in FSM task map pin list items wraps to multiple lines. ### Current Behaviour Time displays like "10:00" break into separate lines. ### Expected Behaviour Time should display on a single line as one readable unit ### Fix Add text-nowrap class to the time display span in FsmTaskMapRenderer template. This prevents line breaks while preserving the existing layout structure. Task - 5079360 Forward-Port-Of: odoo/enterprise#94778
This update documents why an unused event speaker biography website snippet remains present in this stable version. It helps avoid confusion for maintainers while keeping existing websites unaffected, since the inactive snippet has no related styling or behavior.
Original PR description
Problem introduced at [1] (see [2]). In stable, this comments the code to explain the dead code presence. In master, that snippet will be removed, as nobody seemed to have missed him for 4+ major versions and its structure is not perfect (overflow hidden...). Thankfully it should not come with any compatibility issue as it was not associated with any JS/CSS). Maybe a new equivalent will be introduced in master later on. [1]: https://github.com/odoo/odoo/commit/b5c87d86cad1aa2b44f805da0b2d6635aeb85b96 [2]: https://github.com/odoo/odoo/pull/68644#discussion_r903721785 task-4084801 Forward-Port-Of: odoo/odoo#233203
Rating images in Live Chat and related rating views now use a transparent background instead of showing an unintended white box in dark mode. This improves visual consistency and readability for users working with session history and rating screens.
Original PR description
**Current behavior before PR:** The rating images have an unintended white background in dark mode. **Steps to Reproduce:** - Turn on Dark Mode - Go to livechat - Go to Report > Sessions History…
**Current behavior before PR:** The rating images have an unintended white background in dark mode. **Steps to Reproduce:** - Turn on Dark Mode - Go to livechat - Go to Report > Sessions History **Desired behavior after PR is merged:** This PR fixes the issue by applying a transparent background to rating images through the `img_class` option in image widget. The change is applied to: - discuss.channel (kanban, list, form views) - rating.rating (form, kanban views) --- **Before:** <img width="372" height="202" alt="image" src="https://github.com/user-attachments/assets/d573ab3e-62be-4ab2-9c7f-e39bf97cb542" /> **After:** <img width="394" height="141" alt="image" src="https://github.com/user-attachments/assets/6133c231-c634-4afd-a99f-5440ecfe72be" /> task-[4689867](https://www.odoo.com/odoo/project/1519/tasks/4689867) --- I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr Forward-Port-Of: odoo/odoo#231919 Forward-Port-Of: odoo/odoo#215207
This update simplifies internal test files by removing unnecessary wrapper labels that did not add useful information. It does not change product behavior, but makes the test suite easier for developers to read and maintain.
Original PR description
This commit removes test files using a single 'describe' call to wrap its tests, with a name being either redundant with the test file itself or is too misleading.
Regular expression used to find isolated suites:
```js
/^\s*import.*(?:\n(?!describe\()(?!test\().*)+\ndescribe\("[\w\s.]+",.*(?:\n(?!describe\().*)+\n\}\);\n(?!\n)/
```
Tip for reviewers: tick **"Hide whitespace"** when reviewing diff
<img width="237" height="205" alt="image" src="https://github.com/user-attachments/assets/373f7cc6-5e0e-4599-968a-39aad8fac2f0" />
Enterprise: https://github.com/odoo/enterprise/pull/98046
---
I confirm I have signed the CLA and read the PR guidelines at www.odoo.com/submit-pr
Forward-Port-Of: odoo/odoo#233330
Forward-Port-Of: odoo/odoo#233006The corporate contributor agreement record for ForgeFlow has been updated. This keeps Odoo's legal contribution documentation current and does not change product functionality.
Original PR description
PR: https://github.com/odoo/enterprise/pull/97338 Forward-Port-Of: odoo/odoo#232545 Forward-Port-Of: odoo/odoo#231883