DEV Community

Cover image for How to Configure Multiple Conditions in Odoo XML Views
Jeevachaithanyan Sivanandan
Jeevachaithanyan Sivanandan

Posted on

How to Configure Multiple Conditions in Odoo XML Views

When developing or customizing modules in Odoo, you often need to configure fields based on specific conditions. For example, a field may need to be required only when certain statuses are met, or it may need to be displayed based on a combination of different conditions. Odoo provides a powerful way to handle this using domains in XML views.

This article will walk you through how to set up multiple conditions using the attrs attribute in Odoo XML views and how to combine logical operators like & (AND) and | (OR) effectively.

Understanding the attrs Attribute in Odoo
In Odoo, the attrs attribute is used to apply conditions that control the visibility, read-only state, or required state of fields in a form view. This attribute accepts a dictionary where keys like 'invisible', 'readonly', or 'required' define the behavior of the field, and the values are conditions (domains) based on the field values.

For example, if you want to make a field required based on the value of another field, you'd write something like this:

In this case, the test_results field will only be required when the status field is set to 'done'.

Combining Conditions with Logical Operators
Sometimes, simple conditions are not enough, and you need to combine multiple conditions. Odoo uses two primary logical operators for combining conditions:

& (AND): Both conditions must be true.
| (OR): One of the conditions must be true.
Each | operator must combine exactly two conditions. This is important because if you add more than two conditions, you’ll need to nest the | operators correctly. The same applies to &, where two conditions need to be evaluated together.

Example: Combining Multiple Conditions
Let’s say you have a custom field in a project management module, and you want the field to be required under the following conditions:

  • The task’s status is not_started, and the issue type is either bug, change, or non_issue.
  • The task’s status is in_progress, and the issue type is either bug, change, or enhancement.
  • The task’s status is completed, and the issue type is either bug or feature.
  • The task’s status is rejected, and the issue type is either bug, change, or question.

*XML Code for This Configuration
*

To achieve this, you will need to use multiple | (OR) and & (AND) operators in your XML code:

<field name="test_results" nolabel="1"
attrs="{
'required': [
'|', '|', '|', // You need 3
|operators for 4 condition groups
'&', ('status', '=', 'not_started'), ('issue_type', 'in', ['bug', 'change', 'non_issue']),
'&', ('status', '=', 'in_progress'), ('issue_type', 'in', ['bug', 'change', 'enhancement']),
'&', ('status', '=', 'completed'), ('issue_type', 'in', ['bug', 'feature']),
'&', ('status', '=', 'rejected'), ('issue_type', 'in', ['bug', 'change', 'question'])
]
}"
/>

The | operators combine different sets of conditions, making sure the system checks for each group independently.
Inside each group, the & operators combine two conditions using the AND logic. For example, for the status to be not_started, the issue_type must also match one of the specified types like bug or change.
In this case, the test_results field will be required if any one of these groups of conditions is true.

Step-by-Step Breakdown of Condition Nesting
Step 1: Start with Two Conditions
When you only have two conditions, Odoo doesn’t require complex nesting:

<field name="test_results"
    attrs="{'required': ['&', ('status', '=', 'done'), ('issue_type', 'in', ['bug', 'change'])]}"/>
Enter fullscreen mode Exit fullscreen mode

This will make the field required only if the status is done AND the issue type is bug or change.

Step 2: Adding More Conditions
When you add more conditions, you must start using | (OR) operators. Since Odoo's domain syntax allows only two conditions per |, each time you add more conditions, you need an additional | operator.

For example, with three conditions:

<field name="test_results"
    attrs="{
        'required': [
            '|',
            '&', ('status', '=', 'done'), ('issue_type', 'in', ['bug', 'change']),
            '&', ('status', '=', 'in_progress'), ('issue_type', 'in', ['enhancement', 'bug'])
        ]
    }"
/>

Enter fullscreen mode Exit fullscreen mode

Here, the | allows the system to check if either the status is done with an issue type of bug or change, or if the status is in_progress with an issue type of enhancement or bug.

Step 3: Scaling Up to More Complex Conditions
If you have five condition groups, you'll need four | operators to correctly combine them. For example:

<field name="test_results"
    attrs="{
        'required': [
            '|', '|', '|', '|',  // 4 ORs to combine 5 AND blocks
            '&', ('status', '=', 'not_started'), ('issue_type', 'in', ['bug', 'change', 'non_issue']),
            '&', ('status', '=', 'in_progress'), ('issue_type', 'in', ['bug', 'change', 'enhancement']),
            '&', ('status', '=', 'completed'), ('issue_type', 'in', ['bug', 'feature']),
            '&', ('status', '=', 'rejected'), ('issue_type', 'in', ['bug', 'change', 'question']),
            '&', ('status', '=', 'archived'), ('issue_type', 'in', ['documentation', 'archived'])
        ]
    }"
/>
Enter fullscreen mode Exit fullscreen mode

Here, Odoo will evaluate all these condition groups, and if any one group is true, the test_results field will be required.

Use Commas Between Operators and Conditions: Ensure that each | and & operator is followed by a comma, separating it from the next condition.

Keep Track of the Number of | Operators: Remember that each | operator combines exactly two conditions. When adding more conditions, always make sure the number of | operators matches the number of condition pairs.

Structure Conditions Clearly: It’s easy to get lost when working with many conditions, so structure your conditions clearly. If you find that the logic is becoming too complex, consider refactoring your conditions or moving some logic to a Python method.

Configuring multiple conditions in Odoo XML views can be a powerful way to add flexibility to your forms. Whether you’re handling task management, bug tracking, or order processing, combining the | (OR) and & (AND) operators lets you define complex logic that adapts to real-world business scenarios. By carefully nesting these conditions and ensuring proper syntax, you can create dynamic forms that respond intelligently to user inputs.

Top comments (0)