project.task: fields, relations and API
The project.task model ("Task") is a persistent model declared by the Project module, then extended by 8 other modules. It exposes 144 fields, 102 of them declared directly on the model; 18 fields from other models point to it. Below you will find every field with its technical name, type, label and relations, followed by an Odoo 19 JSON-2 API call.
Model identity
- Technical name
project.task- Label
- Task
- Type
- Persistent (models.Model)
- SQL table
project_task- Origin module
- Project (
project) - Extended by
- hr_timesheet, project_hr_skills, sale_project, project_sms, project_timesheet_holidays, project_todo, sale_timesheet, website_project
- Default order (_order)
priority desc, sequence, date_deadline asc, id desc
Model fields
102 own fields, 39 inherited from mixins and 3 automatic ORM fields. Click a name to get a direct link to that field.
144 of 144 fields shown
| Technical name | Label | Type | Details |
|---|---|---|---|
| active | Active | boolean | |
| allocated_hours | Allocated Time | float | |
| allow_billable | Allow Billable | boolean | related: added by Sales - Project ( |
| allow_milestones | Allow Milestones | boolean | related: |
| allow_recurring_tasks | Allow Recurring Tasks | boolean | related: |
| allow_task_dependencies | Allow Task Dependencies | boolean | related: |
| allow_timesheets | Allow timesheets | boolean | read-onlycomputed added by Task Logs ( |
| analytic_account_active | Active Analytic Account | boolean | related: added by Task Logs ( |
| attachment_ids | Attachments Attachments that don't come from a message | one2many | computed |
| child_ids | Sub-tasks | one2many | inverse: |
| closed_depend_on_count | Closed Depending on Tasks | integer | computed |
| closed_subtask_count | Closed Sub-tasks Count | integer | computed |
| color | Color Index | integer | |
| company_id | Company | many2one | computed, stored |
| create_date | Created On | datetime | read-only |
| current_user_same_company_partner | Current User Same Company Partner | boolean | computed |
| date_assign | Assigning Date Date on which this task was last assigned (or unassigned). Based on this, you can get statistics on the time it usually takes to assign tasks. | datetime | read-only |
| date_deadline | Deadline | datetime | |
| date_end | Ending Date | datetime | |
| date_last_stage_update | Last Stage Update Date on which the state of your task has last been modified. Based on this information you can identify tasks that are stalling and get statistics on the time it usually takes to move tasks from one stage/state to another. | datetime | read-only |
| depend_on_count | Depending on Tasks | integer | computed |
| depend_on_ids | Blocked By | many2many | |
| dependent_ids | Block | many2many | |
| dependent_tasks_count | Dependent Tasks | integer | computed |
| description | Description | html | |
| display_follow_button | Display Follow Button | boolean | computed |
| display_in_project | Display In Project | boolean | computed, stored |
| display_name | Display Name Use these keywords in the title to set new tasks: 30h Allocate 30 hours to the task #tags Set tags on the task @user Assign the task to a user ! Set the task a medium priority !! Set the task a high priority !!! Set the task a urgent priority Make sure to use the right format and order e.g. Improve the configuration screen 5h #feature #v16 @Mitchell ! | char | |
| display_parent_task_button | Display Parent Task Button | boolean | computed |
| display_sale_order_button | Display Sales Order | boolean | computed added by Sales - Project ( |
| displayed_image_id | Cover Image | many2one | |
| effective_hours | Time Spent | float | computed, stored added by Task Logs ( |
| email_cc | Email Cc Email addresses that were in the CC of the incoming emails from this task and that are not currently linked to an existing customer. | char | |
| email_from | Email From | char | |
| encode_uom_in_days | Encode Uom In Days | boolean | computed added by Task Logs ( |
| has_late_and_unreached_milestone | Has Late And Unreached Milestone | boolean | computed |
| has_multi_sol | Has Multi Sol | boolean | computed added by Sales Timesheet ( |
| has_project_template | Has Project Template | boolean | related: |
| has_template_ancestor | Has Template Ancestor | boolean | computed, stored |
| is_closed | Closed state | boolean | computed |
| is_project_map_empty | Is Project map empty | boolean | computed added by Sales Timesheet ( |
| is_template | Is Template | boolean | |
| is_timeoff_task | Is Time off Task | boolean | computed added by Timesheet when on Time Off ( |
| last_sol_of_customer | Last Sol Of Customer | many2one | computed added by Sales Timesheet ( |
| leave_types_count | Time Off Types Count | integer | computed added by Timesheet when on Time Off ( |
| link_preview_name | Link Preview Name | char | computed |
| milestone_id | Milestone Deliver your services automatically when a milestone is reached by linking it to a sales order item. | many2one | computed, stored |
| name | Title | char | required |
| overtime | Overtime | float | computed, stored added by Task Logs ( |
| parent_id | Parent Task | many2one | |
| partner_company_name | Company Name | char | related: added by Online Task Submission ( |
| partner_id | Customer | many2one | computed, stored |
| partner_name | Customer Name | char | related: added by Online Task Submission ( |
| partner_phone | Contact Number | char | computed, stored |
| personal_stage_id | Personal Stage State The current user's personal stage. | many2one | computed |
| personal_stage_type_id | Personal Stage The current user's personal task stage. | many2one | related: |
| personal_stage_type_ids | Personal Stages | many2many | |
| portal_user_names | Portal User Names | char | computed |
| pricing_type | Pricing Type | selection | related: added by Sales Timesheet ( |
| priority | Priority | selection | Values: |
| progress | Progress | float | computed, stored added by Task Logs ( |
| project_id | Project | many2one | computed, stored |
| project_privacy_visibility | Project Visibility | selection | related: |
| project_sale_order_id | Project's sale order | many2one | related: added by Sales - Project ( |
| rating_active | Stage Rating Status | boolean | related: |
| recurrence_id | Recurrence | many2one | |
| recurring_count | Tasks in Recurrence | integer | computed |
| recurring_task | Recurrent | boolean | |
| remaining_hours | Time Remaining Number of allocated hours minus the number of hours spent. | float | read-onlycomputed, stored added by Task Logs ( |
| remaining_hours_available | Remaining Hours Available | boolean | related: added by Sales Timesheet ( |
| remaining_hours_percentage | Remaining Hours Percentage | float | computed added by Task Logs ( |
| remaining_hours_so | Time Remaining on SO | float | computed added by Sales Timesheet ( |
| repeat_interval | Repeat Every | integer | computed |
| repeat_type | Until | selection | computed Values: |
| repeat_unit | Repeat Unit | selection | computed Values: |
| repeat_until | End Date | date | computed |
| role_ids | Project Roles When you create a project from a template, you can choose which employee takes each role. These employees will be added to the tasks, along with anyone already assigned. | many2many | |
| sale_line_id | Sales Order Item Sales Order Item to which the time spent on this task will be added in order to be invoiced to your customer. By default the sales order item set on the project will be selected. In the absence of one, the last prepaid sales order item that has time remaining will be used. Remove the sales order item in order to make this task non billable. You can also change or remove the sales order item of each timesheet entry individually. | many2one | computed, stored added by Sales - Project ( |
| sale_order_id | Sales Order Sales order to which the task is linked. | many2one | computed, stored added by Sales - Project ( |
| sale_order_state | Sale Order State | selection | related: added by Sales - Project ( |
| sequence | Sequence | integer | |
| stage_id | Stage | many2one | computed, stored |
| stage_id_color | Stage Color | integer | related: |
| state | State | selection | requiredcomputed, stored Values computed at runtime |
| subtask_allocated_hours | Sub-tasks Allocated Time Sum of the hours allocated for all the sub-tasks (and their own sub-tasks) linked to this task. Usually less than or equal to the allocated hours of this task. | float | computed |
| subtask_completion_percentage | Subtask Completion Percentage | float | computed |
| subtask_count | Sub-task Count | integer | computed |
| subtask_effective_hours | Time Spent on Sub-tasks Time spent on the sub-tasks (and their own sub-tasks) of this task. | float | computed, stored added by Task Logs ( |
| tag_ids | Tags | many2many | |
| task_properties | Properties | properties | |
| task_to_invoice | To invoice | boolean | computed added by Sales - Project ( |
| timesheet_ids | Timesheets | one2many | inverse: added by Task Logs ( |
| timesheet_product_id | Timesheet Product | many2one | related: added by Sales Timesheet ( |
| total_hours_spent | Total Time Spent Time spent on this task and its sub-tasks (and their own sub-tasks). | float | computed, stored added by Task Logs ( |
| user_ids | Assignees | many2many | |
| user_skill_ids | User Skill | one2many | related: added by Project - Skills ( |
| website_message_ids | Website Message | one2many | |
| working_days_close | Working Days to Close | float | computed, stored |
| working_days_open | Working Days to Assign | float | computed, stored |
| working_hours_close | Working Hours to Close | float | computed, stored |
| working_hours_open | Working Hours to Assign | float | computed, stored |
| write_date | Last Updated On | datetime | read-only |
| access_token | Security Token | char | inherited from portal.mixin |
| access_url | Portal Access URL Customer Portal URL | char | computed inherited from portal.mixin |
| access_warning | Access warning | text | computed inherited from portal.mixin |
| activity_calendar_event_id | Next Activity Calendar Event | many2one | computed inherited from mail.activity.mixin |
| activity_date_deadline | Next Activity Deadline | date | read-onlycomputed inherited from mail.activity.mixin |
| activity_exception_decoration | Activity Exception Decoration Type of the exception activity on record. | selection | computed Values: inherited from mail.activity.mixin |
| activity_exception_icon | Icon Icon to indicate an exception activity. | char | computed inherited from mail.activity.mixin |
| activity_ids | Activities | one2many | inverse: inherited from mail.activity.mixin |
| activity_state | Activity State Status based on activities Overdue: Due date is already passed Today: Activity date is today Planned: Future activities. | selection | computed Values: inherited from mail.activity.mixin |
| activity_summary | Next Activity Summary | char | related: inherited from mail.activity.mixin |
| activity_type_icon | Activity Type Icon | char | related: inherited from mail.activity.mixin |
| activity_type_id | Next Activity Type | many2one | related: inherited from mail.activity.mixin |
| activity_user_id | Responsible User | many2one | read-onlycomputed inherited from mail.activity.mixin |
| duration_tracking | Status time JSON that maps ids from a many2one field to seconds spent | json | computed inherited from mail.tracking.duration.mixin |
| has_message | Has Message | boolean | computed inherited from mail.thread |
| html_field_history | History data | json | read-only inherited from html.field.history.mixin |
| html_field_history_metadata | History metadata | json | computed inherited from html.field.history.mixin |
| is_rotting | Rotting | boolean | computed inherited from mail.tracking.duration.mixin |
| message_attachment_count | Attachment Count | integer | computed inherited from mail.thread |
| message_follower_ids | Followers | one2many | inverse: inherited from mail.thread |
| message_has_error | Message Delivery error If checked, some messages have a delivery error. | boolean | computed inherited from mail.thread |
| message_has_error_counter | Number of errors Number of messages with delivery error | integer | computed inherited from mail.thread |
| message_has_sms_error | SMS Delivery error If checked, some messages have a delivery error. | boolean | computed inherited from mail.thread |
| message_ids | Messages | one2many | inverse: inherited from mail.thread |
| message_is_follower | Is Follower | boolean | computed inherited from mail.thread |
| message_needaction | Action Needed If checked, new messages require your attention. | boolean | computed inherited from mail.thread |
| message_needaction_counter | Number of Actions Number of messages requiring action | integer | computed inherited from mail.thread |
| message_partner_ids | Followers (Partners) | many2many | computed inherited from mail.thread |
| my_activity_date_deadline | My Activity Deadline | date | read-onlycomputed inherited from mail.activity.mixin |
| rating_avg | Average Rating | float | computed inherited from rating.mixin |
| rating_avg_text | Rating Avg Text | selection | computed Values: inherited from rating.mixin |
| rating_count | Rating count | integer | computed inherited from rating.mixin |
| rating_ids | Ratings | one2many | inverse: inherited from mail.thread |
| rating_last_feedback | Rating Last Feedback | text | related: inherited from rating.mixin |
| rating_last_image | Rating Last Image | binary | related: inherited from rating.mixin |
| rating_last_text | Rating Text | selection | related: inherited from rating.mixin |
| rating_last_value | Rating Last Value | float | computed, stored inherited from rating.mixin |
| rating_percentage_satisfaction | Rating Satisfaction | float | computed inherited from rating.mixin |
| rotting_days | Days Rotting Day count since this resource was last updated | integer | computed inherited from mail.tracking.duration.mixin |
| create_uid | Created by | many2one | read-onlyautomatic |
| id | ID | integer | read-onlyautomatic |
| write_uid | Last Updated by | many2one | read-onlyautomatic |
Relations
Models linked from this model
- account.analytic.line: timesheet_ids
- hr.employee.skill: user_skill_ids
- ir.attachment: attachment_ids, displayed_image_id
- mail.message: website_message_ids
- product.product: timesheet_product_id
- project.milestone: milestone_id
- project.project: project_id
- project.role: role_ids
- project.tags: tag_ids
- project.task: child_ids, depend_on_ids, dependent_ids, parent_id
- project.task.recurrence: recurrence_id
- project.task.stage.personal: personal_stage_id
- project.task.type: personal_stage_type_id, personal_stage_type_ids, stage_id
- res.company: company_id
- res.partner: partner_id
- res.users: user_ids
- sale.order: project_sale_order_id, sale_order_id
- sale.order.line: last_sol_of_customer, sale_line_id
Fields of other models pointing here
- account.analytic.line: parent_task_id, task_id
- product.template: task_template_id
- project.tags: task_ids
- project.task: depend_on_ids, dependent_ids, parent_id
- project.task.stage.personal: task_id
- report.project.task.user: dependent_ids, parent_id, task_id
- res.company: leave_timesheet_task_id
- res.config.settings: leave_timesheet_task_id
- sale.order: tasks_ids
- sale.order.line: task_id
- task.share.wizard: task_id
- timesheets.analysis.report: parent_task_id, task_id
Reading this model through the API
Odoo 19 JSON-2 API call reading the first five records with real fields of the model. Replace the instance, database and API key with your own.
curl -X POST "https://your-instance.odoo.com/json/2/project.task/search_read" \
-H "Authorization: bearer $ODOO_API_KEY" \
-H "X-Odoo-Database: your-db" \
-H "Content-Type: application/json" \
-d '{"domain":[],"fields":["name","state","company_id","displayed_image_id","milestone_id"],"limit":5}'import requests
BASE_URL = "https://your-instance.odoo.com/json/2"
headers = {"Authorization": f"bearer {API_KEY}", "X-Odoo-Database": "your-db"}
res = requests.post(
f"{BASE_URL}/project.task/search_read",
headers=headers,
json={"domain": [], "fields": ["name","state","company_id","displayed_image_id","milestone_id"], "limit": 5},
)
res.raise_for_status()
print(res.json())- External API access requires Odoo's Custom plan.
- XML-RPC and JSON-RPC will be removed in Odoo 22 (fall 2028): use JSON-2.
- The access rights and record rules of the key's user apply.
Cite this tool
Writing a tutorial, internal documentation or a forum answer? Copy this link to send your readers to the up-to-date reference.
<a href="https://aidoo.ai/en/outils/explorateur-modeles-odoo/project-task">project.task (Odoo 19.0)</a>Sources
Data verified on September 23, 2026 · Odoo 19.0 Community
Have an Odoo project, or want to put your ERP to work with AI? Let's talk
Implementation, custom module development, connecting Claude or ChatGPT to your data: tell us about your context and we will reply within 24 business hours.