This module allows you to configure domains to filter projects and tasks available for selection in helpdesk tickets. It provides both static domain configuration and dynamic Python-based filtering for enhanced flexibility.
auto_awesome What this module does
AI-generated from the code · Odoo 18.0Lets you control which projects and tasks can be picked on a helpdesk ticket, using filters set globally for the company or per helpdesk team, including dynamic filters written in Python.
When agents create or edit a helpdesk ticket, the Project and Task fields no longer show every project or task. Only the ones matching the filters you configured are offered.
Filters can be set in three places: - Globally in Helpdesk settings, for the whole company (Project Domain and Task Domain). - On each helpdesk team, in new 'Project Domain' and 'Task Domain' tabs, with a simple filter builder and an optional Python code box. - The company filter, the team filter and the team's Python code are all combined, so every condition must be met.
Business rules and automatic behaviour: - The list of allowed projects and tasks is recalculated automatically when the team, customer, category, priority or company on the ticket changes. - If a project is already chosen on the ticket, the task list is automatically limited to tasks of that project. - Python code entered on a team is checked for syntax errors when saved; invalid code raises a validation error. - If no filter is configured, all projects and tasks remain available.
It touches helpdesk.ticket, helpdesk.ticket.team, res.company and res.config.settings, and adds fields to the ticket form, the team form and the Helpdesk settings screen.
Depends on
Models and fields (4)
- res.company · extends an existing modelhelpdesk_mgmt_task_domain (Task Domain), helpdesk_mgmt_project_domain (Project Domain)
- helpdesk.ticket · extends an existing modeltask_domain_ids (Available Tasks), project_domain_ids (Available Projects)
- res.config.settings · extends an existing modelhelpdesk_mgmt_task_domain (Task Domain), helpdesk_mgmt_project_domain (Project Domain)
- helpdesk.ticket.team · extends an existing modeltask_domain, project_domain, task_domain_python (Task Domain Python Code), project_domain_python (Project Domain Python Code)
Text generated by AI (DeepSeek) from reading the Odoo 18.0 code on GitHub; it may contain mistakes, so check the code before deciding. View the code on GitHub
Availability by version
Reviewed: 2026-11-03Confirmation status: 3 confirmed, 6 with no information of 9 versions.
Sources · Odoo 17.0
Confirmed on 2026-11-03 in branch 17.0 of OCA/helpdesk.
terminal Installation and usage
OCA documentation · Odoo 18.0Configuration
Source · Odoo 18.0To configure this module, you need to:
- Configure global project and task domains at company level.
- Configure team-specific project and task domains.
- Set up Python-based dynamic domains (optional).
Global Configuration (Company)
- Go to Settings > Helpdesk to configure the global project and task domains.
- In the "Project & Task Domain Configuration" section, set the Project Domain field using the visual domain builder.
- Set the Task Domain field using the visual domain builder.
- These domains will be applied to all teams that don't have their own domains configured.
- You can also Activate or Deactivate the global domains.
Team Configuration
- Go to Helpdesk > Configuration > Teams to configure team-specific domains.
- Edit or create a team.
- In the Project Domain tab:
- Set the Project Domain field using the visual domain builder.
- Configure the Project Domain Python Code field for dynamic domains (optional).
- In the Task Domain tab:
- Set the Task Domain field using the visual domain builder.
- Configure the Task Domain Python Code field for dynamic domains (optional).
- Team domains will be combined with the company domain using AND logic.
Domain Builder Usage
Both "Project Domain" and "Task Domain" fields use a visual builder that allows:
- Click on the field to open the domain builder.
- Select the field from the Project/Task model (e.g., Active, Partner, Type, User).
- Choose the operator (e.g., =, !=, >, <, in, not in).
- Define the value (e.g., True, False, partner name, user name).
- Add more conditions with AND/OR logic.
- Save the domain configuration.
Domain Examples
Project Domain Examples
Only Active Projects
- Field: Active
- Operator: =
- Value: True
- Domain:
[('active', '=', True)]
Projects with Partner
- Field: Partner
- Operator: !=
- Value: False
- Domain:
[('partner_id', '!=', False)]
Projects from Specific Client
- Field: Partner
- Operator: =
- Value: [Client Name]
- Domain:
[('partner_id', '=', 123)](where 123 is the client ID)
Projects by Tags (Internal Projects)
- Field: Tags
- Operator: in
- Value: [Internal]
- Domain:
[('tag_ids', 'in', [4])](where 4 is the tag ID)
Projects by Tags (External Projects)
- Field: Tags
- Operator: in
- Value: [External]
- Domain:
[('tag_ids', 'in', [5])](where 5 is the tag ID)
Mixed Project Tags (Internal OR External)
- Field: Tags
- Operator: in
- Value: [Internal, External]
- Domain:
['|', ('tag_ids', 'in', [4]), ('tag_ids', 'in', [5])]
Task Domain Examples
Only Active Tasks
- Field: Active
- Operator: =
- Value: True
- Domain:
[('active', '=', True)]
Tasks by Tags (Development)
- Field: Tags
- Operator: in
- Value: [Development]
- Domain:
[('tag_ids', 'in', [1])](where 1 is the tag ID)
Tasks by Tags (Testing)
- Field: Tags
- Operator: in
- Value: [Testing]
- Domain:
[('tag_ids', 'in', [2])](where 2 is the tag ID)
Mixed Task Tags (Development OR Testing)
- Field: Tags
- Operator: in
- Value: [Development, Testing]
- Domain:
['|', ('tag_ids', 'in', [1]), ('tag_ids', 'in', [2])]
Unassigned Tasks
- Field: User
- Operator: =
- Value: False
- Domain:
[('user_ids', '=', False)]
Tasks Assigned to Specific User
- Field: User
- Operator: in
- Value: [User Name]
- Domain:
[('user_ids', 'in', [123])](where 123 is the user ID)
Tasks with High Priority
- Field: Priority
- Operator: =
- Value: 1
- Domain:
[('priority', '=', '1')]
Python Domain Code
For advanced users, you can use Python code to create dynamic domains:
- Go to the team configuration.
- Edit the Project Domain Python Code or Task Domain Python Code field.
- Write Python code that returns a domain list.
- Available variables: ticket, env, user, company, AND, OR, normalize.
Example Python Code
Project Domain Example - Client Projects Team
# Filter projects based on ticket partner (from demo data)
if ticket.partner_id:
domain = [('commercial_partner_id', '=', ticket.commercial_partner_id.id)]
else:
domain = [('id', '=', 0)] # No projects if no partnerTask Domain Example - Unassigned Tasks
# Filter tasks not assigned to anyone (from demo data)
domain = [('user_ids', '=', False)]Task Domain Example - Project-based Filtering
# Filter tasks based on ticket project
if ticket.project_id:
domain = [('project_id', '=', ticket.project_id.id)]
else:
domain = [('id', '=', 0)] # No tasks if no project selectedTask Domain Example - Mixed Tags
# Filter tasks by development or testing tags (from demo data)
domain = ['|', ('tag_ids', 'in', [1]), ('tag_ids', 'in', [2])]Task Domain Example - Priority and Assignment
# Filter high priority tasks assigned to specific users
if ticket.partner_id:
domain = AND([
[('priority', '=', '1')], # High priority
[('user_ids', '!=', False)] # Assigned tasks
])
else:
domain = [('priority', '=', '1')] # High priority onlyDomain Combination Logic
All domains are combined using AND logic:
For Projects:
- Company global project domain (base filter for all teams).
- Team static project domain (always combined with company domain).
- Team Python project code (always combined with company + team domains).
For Tasks:
- Company global task domain (base filter for all teams).
- Team static task domain (always combined with company domain).
- Team Python task code (always combined with company + team domains).
The final project domain will be: Company Project Domain AND Team Project Domain AND Python Project Domain.
The final task domain will be: Company Task Domain AND Team Task Domain AND Python Task Domain.
Permissions
There are no specific permissions required for this module. The domain filtering respects the user's existing project access permissions set in the system.
Troubleshooting
If domains are not working as expected:
- Check that the domain syntax is correct.
- Verify that the Python code (if used) has no syntax errors.
- Ensure that the fields referenced in domains exist in the Project model.
- Check the Odoo logs for any domain evaluation errors.
Usage
Source · Odoo 18.0How It Works
Project Filtering
- Ticket Creation: When a ticket is created, the system checks:
- If the team has a configured project domain
- If not, uses the company's global project domain
- If no domain is configured, all projects remain available
- Ticket Editing: The project domain is automatically applied to the "Project" field of the ticket
- Validation: If the project domain is invalid, the system ignores it and shows all projects
Task Filtering
- Project Selection: When a project is selected in a ticket:
- The system applies the configured task domain
- Tasks are automatically filtered by the selected project
- Only tasks belonging to the selected project are shown
- Dynamic Filtering: Task filtering is updated when:
- The project field changes
- The team changes
- Other relevant ticket fields change
- Smart Filtering: The system ensures tasks are always relevant to the selected project, preventing selection of tasks from other projects
Domain Application
- Static Domains: Applied immediately when fields change
- Python Domains: Evaluated dynamically based on current ticket data
- Combination Logic: All applicable domains are combined using AND logic
- Fallback Behavior: If any domain fails, the system gracefully falls back to showing all available options
No verified information in OCA: Installation.
Installation instructions, the distribution package, dependencies and configuration steps are not shown because they have not yet been verified in the module documentation for any version.
Data imported from GitHub: this sheet reflects the latest catalog review, not a live lookup. Always check the module documentation and staging before installing in production.