Project

project
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/project
VERSION
VERSION 1.4
CATEGORY
CATEGORYServices/Project
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Thibault Delavallée, Denis Ledoux, David Monjoie, Géry Debongnie, Aaron Bohy, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Toufik Ben Jaa, Julien Castiaux, Romeo Fragomeli, Victor Feyens, Adrien Dieudonné, Paul Morelle, Enric Tobella, Sébastien Theys, Julien Mougenot, Achraf (abz), Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, abd-msyukyu-odoo, William Braeckman, Romain Estievenart, Didier (did), Audric Onockx (auon), Abdelouahab (abla), Nicolas Bayet, Hubert Van De Walle, Mathieu Walravens, luvi, Renaud Thiry, Vincent Larcin, damr, alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), tsm-odoo, Maximilien (malb), Victor Piryns (pivi), Dylan Kiss (dyki), Rahul Prajapati, Chong Wang (cwg), Odoo, Xavier Bol (xbo), Brieuc-brd, omra-odoo, Andrzej(pian), rajh-odoo, Giang Pham, Walid (wasa), sesn-odoo, kdeb@odoo.com, maad-odoo, Deependra Solanki, Youssef Bashandy, bary, Maryam Kia, Maxime de Neuville, suth-odoo, Abderraouf Ghrissi (abgh), Bastien Fafchamps (bafa), Julien Carion (juca), adsh-odoo, Tanguy Quéguineur, Julien Segers (juse), dise, Rodolpho Lima, sami odoo, asno-odoo, mano-odoo, aamo-odoo, guce, yagp-odoo, sabr, Pierre Pulinckx (PIPU), st-yes, Chris Duvivier, Cuong, Nguyen Minh Tran Manh, Michaël Mattiello, Pierre Pulinckx, Bastien PIERRE, K Theja (kthe), zel-odoo, Raja Prasad, yame-odoo, bona-odoo, Krzysztof Magusiak (krma), Ajit Singh, utma-odoo, Hadi El Yakhni, Maeva De Keyser (MDEK), vpan-odoo, mjvi-odoo, desh, bhna-odoo, dise-odoo, K Theja (kthe@odoo.com), Quentin Colla (qucol), oumaima-aarabe, path-odoo, Yash Pathak, Elliot ELCO, Vincent Janssen, Shubham Patel, Waleed Elgamal, Maxime de Neuville (mane), Aurélien Bertrand, rapa, damrOdoo, mibav-odoo, abbhi-Odoo, Sébastien Geelen, saurabh, dhtr-odoo, Abdelouahab Laaroussi (abla), Kadam Darji, raja prasad, Farah (ahmfa), ksin-odoo, ELCO, maap-odoo, njor-odoo, chpa-odoo, nikhil, Abdullah (abye), Dhruvkumar Nagar, rusi-odoo, makb-odoo, shib-odoo, ksja-odoo, pcbe-odoo, djhan
WEBSITE
WEBSITEhttps://www.odoo.com/app/project
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 14:10:20
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - analytic
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - portal
    - http_routing
    - auth_signup
    - rating
    - resource
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (131)
XML IDNameModelTypeStatus
account_analytic_account_view_form_inherit account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
digest_digest_view_form digest.digest.view.form.inherit.project.task digest.digest xpath Inherits digest.digest_digest_view_form
edit_project project.project.form project.project form New
mail_activity_plan_view_form_project_and_task mail.activity.plan.view.form.project.and.task mail.activity.plan xpath Inherits mail.mail_activity_plan_view_form
open_view_all_tasks_list_view open.view.all.tasks.list.view project.task list Inherits view_task_tree2
open_view_blocked_by_list_view open.view.blocked.by.list.view project.task list Inherits project.open_view_all_tasks_list_view
open_view_my_tasks_list_view open.view.my.tasks.list.view project.task list Inherits view_task_tree2
portal_layout Portal layout: project menu entry ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home Projects / Tasks ir.ui.view qweb Inherits portal.portal_my_home
portal_my_project My Project ir.ui.view qweb New
portal_my_projects My Projects ir.ui.view qweb New
portal_my_task My Task ir.ui.view qweb Inherits portal.portal_sidebar
portal_my_task_allocated_hours_template portal_my_task_allocated_hours_template ir.ui.view qweb New
portal_my_tasks My Tasks ir.ui.view qweb New
portal_my_tasks_badge_widget_template badge Widget Template ir.ui.view qweb New
portal_my_tasks_priority_widget_template Priority Widget Template ir.ui.view qweb New
portal_my_tasks_state_widget_template Status Widget Template ir.ui.view qweb New
portal_task_share_wizard task.share.wizard task.share.wizard xpath Inherits portal.portal_share_wizard
portal_tasks_list Tasks List ir.ui.view qweb New
project.milestone_deadline project.milestone_deadline ir.ui.view qweb New
project_kanban_view_group_stage project.project.kanban.group.stage project.project xpath Inherits view_project_kanban
project_list_view_group_stage project.project.list.group.stage project.project list Inherits view_project
project_message_user_assigned project_message_user_assigned ir.ui.view qweb New
project_milestone_view_form project.milestone.view.form project.milestone form New
project_milestone_view_kanban project.milestone.view.kanban project.milestone kanban New
project_milestone_view_tree project.milestone.view.list project.milestone list New
project_project_stage_view_form project.project.stage.view.form project.project.stage form New
project_project_stage_view_form_quick_create project.project.stage.view.form.quick.create project.project.stage form New
project_project_stage_view_kanban project.project.stage.view.kanban project.project.stage kanban New
project_project_stage_view_search project.project.stage.view.search project.project.stage search New
project_project_stage_view_tree project.project.stage.view.list project.project.stage list New
project_project_view_activity project.project.view.activity project.project activity New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_project_view_form_simplified_footer project.project.view.form.simplified project.project xpath Inherits project.project_project_view_form_simplified
project_project_view_form_simplified_template project.project.create.wizard.form project.template.create.wizard form New
project_role_view_form project.role.form project.role form New
project_role_view_kanban project.role.kanban project.role kanban New
project_role_view_list project.role.list project.role list New
project_role_view_search project.role.search project.role search New
project_share_wizard_confirm_form project.share.wizard.view.form project.share.wizard form New
project_share_wizard_view_form project.share.wizard.view.form project.share.wizard form New
project_sharing_portal Project Sharing View Embed ir.ui.view qweb New
project_sharing_project_task_view_form project.sharing.project.task.view.form project.task form New
project_sharing_project_task_view_kanban project.sharing.project.task.view.kanban project.task kanban New
project_sharing_project_task_view_search project.task.search.form project.task filter Inherits project.view_task_search_form_base
project_sharing_project_task_view_tree project.sharing.project.task.list project.task list Inherits project_task_view_tree_main_base
project_sharing_quick_create_task_form project.task.form.quick_create project.task form New
project_sub_task_view_kanban_mobile project.task.kanban project.task xpath Inherits project.view_task_kanban
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
project_tags_tree_view Tags project.tags list New
project_task_burndown_chart_report_view_graph project.task.burndown.chart.report.view.graph project.task.burndown.chart.report graph New
project_task_burndown_chart_report_view_search project.task.burndown.chart.report.view.search project.task.burndown.chart.report search New
project_task_convert_to_subtask_view_form project.task.convert.to.subtask.form project.task form New
project_task_graph_view_project_milestone project.task.view.graph.project.milestone project.task xpath Inherits view_project_task_graph
project_task_kanban_view_project_milestone project.task.kanban.inherit.project.milestone project.task xpath Inherits view_task_kanban
project_task_pivot_view_project_milestone project.task.view.pivot.project.milestone project.task xpath Inherits view_project_task_pivot
project_task_templates_kanban project.task.templates.list project.task kanban Inherits view_task_kanban
project_task_templates_list project.task.templates.list project.task field Inherits project_task_view_tree_base
project_task_tree_view_project_milestone project.task.view.tree.project.milestone project.task xpath Inherits project_task_view_tree_base
project_task_view_activity project.task.activity project.task activity New
project_task_view_tree_base project.task.view.list.base project.task list Inherits project_task_view_tree_main_base
project_task_view_tree_main_base project.task.view.list.main.base project.task list New
project_templates_view_form project.project.template.form project.project form Inherits project.edit_project
project_templates_view_kanban project.project.template.kanban project.project kanban Inherits project.view_project_kanban
project_templates_view_list project.project.template.list project.project list Inherits project.view_project
project_update_default_description Project Update Description ir.ui.view qweb New
project_update_view_form project.update.view.form project.update form New
project_update_view_kanban project.update.view.kanban project.update kanban New
project_update_view_search project.update.view.search project.update search New
project_update_view_tree project.update.view.list project.update list New
project_view_kanban project.project.kanban project.project kanban New
project_view_kanban_inherit_project project.kanban.inherit.project project.project xpath Inherits project.view_project_kanban
quick_create_project_form project.form.quick_create project.project form New
quick_create_task_form project.task.form.quick_create project.task form New
quick_create_task_form_inherit_view_default_project project.task.form.quick.create project.task field Inherits quick_create_task_form
quick_create_task_form_res_partner project.task.form.quick_create.res.partner project.task xpath Inherits quick_create_task_form
rating_rating_view_form_project rating.rating.form.project rating.rating xpath Inherits rating.rating_rating_view_form_text
rating_rating_view_graph rating.rating.view.graph.project rating.rating xpath Inherits rating.rating_rating_view_graph
rating_rating_view_pivot rating.rating.view.pivot.project rating.rating xpath Inherits rating.rating_rating_view_pivot
rating_rating_view_search_project rating.rating.search.project rating.rating xpath Inherits rating.rating_rating_view_search
rating_rating_view_tree_project rating.rating.list.project rating.rating field Inherits rating.rating_rating_view_tree
res_config_settings_view_form res.config.settings.view.form.inherit.project res.config.settings xpath Inherits base.res_config_settings_view_form
task_invitation_follower task_invitation_follower ir.ui.view qweb New
task_link_preview_front_end task_link_preview_front_end ir.ui.view qweb Inherits portal.frontend_layout
task_link_preview_portal_layout task_link_preview_portal_layout ir.ui.view qweb Inherits portal.portal_layout
task_track_depending_tasks task_track_depending_tasks ir.ui.view qweb New
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.list project.task.type list New
task_type_tree_inherited project.task.type.list.inherited project.task.type xpath Inherits task_type_tree
view_account_analytic_account_list_inherit account.analytic.account.list.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_list
view_project project.project.list project.project list New
view_project_calendar project.project.calendar project.project calendar New
view_project_config project.project.list.config project.project xpath Inherits project.view_project
view_project_config_group_stage project.project.list.config.group.stage project.project list Inherits view_project_config
view_project_config_kanban project.kanban.inherit.config.project project.project xpath Inherits view_project_kanban
view_project_config_kanban_group_stage project.kanban.inherit.config.project.group.stage project.project xpath Inherits view_project_config_kanban
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_project_stage_delete_wizard project.project.stage.delete.wizard.form project.project.stage.delete.wizard form New
view_project_project_stage_unarchive_wizard project.project.stage.delete.wizard.form project.project.stage.delete.wizard form New
view_project_task_graph project.task.graph project.task graph New
view_project_task_graph_inherit project.task.graph.inherit project.task xpath Inherits project.view_project_task_graph
view_project_task_pivot project.task.pivot project.task pivot New
view_project_task_pivot_inherit project.task.pivot.inherit project.task xpath Inherits project.view_project_task_pivot
view_project_task_type_delete_confirmation_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_delete_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_kanban project.task.type.kanban project.task.type kanban New
view_project_task_type_unarchive_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_task_all_calendar project.task.all.calendar project.task xpath Inherits view_task_calendar
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_form_res_partner project.task.form.res.partner project.task xpath Inherits view_task_form2
view_task_kanban project.task.kanban project.task kanban New
view_task_kanban_inherit_all_task project.task.kanban.inherit.all.task project.task xpath Inherits view_task_kanban
view_task_kanban_inherit_my_task project.task.kanban.inherit.my.task project.task xpath Inherits view_task_kanban
view_task_kanban_inherit_view_default_project project.task.kanban project.task kanban Inherits view_task_kanban
view_task_kanban_res_partner project.task.kanban.res.partner project.task xpath Inherits view_task_kanban_inherit_all_task
view_task_partner_info_form res.partner.task.buttons res.partner div Inherits base.view_partner_form
view_task_project_user_fsm_graph_base report.project.task.user.graph report.project.task.user graph Inherits view_task_project_user_graph
view_task_project_user_fsm_pivot_base report.project.task.user.pivot report.project.task.user pivot Inherits view_task_project_user_pivot
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search Inherits project.view_task_search_form_project_fsm_base
view_task_search_form project.task.search.form project.task filter Inherits view_task_search_form_project_base
view_task_search_form_base project.task.search.form project.task search New
view_task_search_form_project_base project.task.search.form.project.base project.task filter Inherits view_task_search_form_project_fsm_base
view_task_search_form_project_fsm_base project.task.search.form.project.base project.task field Inherits view_task_search_form_base
view_task_template_search_form project.task.search.form project.task filter Inherits view_task_search_form
view_task_tree2 project.task.list project.task list Inherits project_task_view_tree_base
Models touched (29)

New fields (2)
  • project_count Integer
    compute='_compute_project_count' export_string_translation=False args: 'Project Count'
  • project_ids One2many → project.project
    export_string_translation=False string='Projects' args: 'project.project', 'account_id'
Public methods (1)
  • action_view_projects(self)

New fields (2)
  • kpi_project_task_opened Boolean
    args: 'Open Tasks'
  • kpi_project_task_opened_value Integer
    compute='_compute_project_task_opened_value' export_string_translation=False
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • action_send_mail(self)

New fields (4)
  • limited_access Boolean
    default=False export_string_translation=False args: 'Limited Access'
  • partner_email Char
    export_string_translation=False related='partner_id.email'
  • partner_id Many2one → res.partner
    export_string_translation=False readonly=True required=True args: 'res.partner', 'Collaborator'
  • project_id Many2one → project.project
    domain=[('privacy_visibility', 'in', ['portal', 'invited_users']), ('is_template', '=', False)] export_string_translation=False readonly=True required=True args: 'project.project', 'Project Shared'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)

New fields (13)
  • can_be_marked_as_done Boolean
    compute='_compute_can_be_marked_as_done' export_string_translation=False
  • deadline Date
    copy=False tracking=True
  • done_task_count Integer
    compute='_compute_task_count' export_string_translation=False groups='project.group_project_milestone' args: '# of Done Tasks'
  • is_deadline_exceeded Boolean
    compute='_compute_is_deadline_exceeded' export_string_translation=False
  • is_deadline_future Boolean
    compute='_compute_is_deadline_future' export_string_translation=False
  • is_reached Boolean
    copy=False default=False string='Reached'
  • name Char
    required=True
  • project_allow_milestones Boolean
    compute='_compute_project_allow_milestones' compute_sudo=True export_string_translation=False search='_search_project_allow_milestones'
  • project_id Many2one → project.project
    default=_get_default_project_id domain=[('is_template', '=', False)] index=True ondelete='cascade' required=True args: 'project.project'
  • reached_date Date
    compute='_compute_reached_date' export_string_translation=False store=True
  • sequence Integer
    default=10 args: 'Sequence'
  • task_count Integer
    compute='_compute_task_count' export_string_translation=False groups='project.group_project_milestone' args: '# of Tasks'
  • task_ids One2many → project.task
    export_string_translation=False args: 'project.task', 'milestone_id', 'Tasks'
Public methods (3)
  • action_view_tasks(self)
  • copy(self, default=None)
  • toggle_is_reached(self, is_reached)

New fields (53)
  • access_instruction_message Char
    compute='_compute_access_instruction_message' export_string_translation=False args: 'Access Instruction Message'
  • account_id Many2one → account.analytic.account
    copy=False domain="['|', ('company_id', '=', False), ('company_id', '=?', company_id)]" ondelete='set null' args: 'account.analytic.account'
  • active Boolean
    copy=False default=True export_string_translation=False
  • alias_id Many2one
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).'
  • allow_milestones Boolean
    inverse='_inverse_allow_milestones' args: 'Milestones'
  • allow_recurring_tasks Boolean
    inverse='_inverse_allow_recurring_tasks' args: 'Recurring Tasks'
  • allow_task_dependencies Boolean
    inverse='_inverse_allow_task_dependencies' args: 'Task Dependencies'
  • analytic_account_balance Monetary
    related='account_id.balance'
  • can_mark_milestone_as_done Boolean
    compute='_compute_next_milestone_id' export_string_translation=False groups='project.group_project_milestone'
  • closed_task_count Integer
    compute='_compute_closed_task_count' export_string_translation=False
  • collaborator_count Integer
    compute='_compute_collaborator_count' compute_sudo=True export_string_translation=False args: '# Collaborators'
  • collaborator_ids One2many → project.collaborator
    copy=False export_string_translation=False string='Collaborators' args: 'project.collaborator', 'project_id'
  • color Integer
    export_string_translation=False string='Color Index'
  • company_id Many2one → res.company
    compute='_compute_company_id' inverse='_inverse_company_id' readonly=False store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency_id' export_string_translation=False readonly=True string='Currency' args: 'res.currency'
  • date Date
    copy=False help='Date on which this project ends. The timeframe defined on the project is taken into account when viewing its planning.' index=True string='Expiration Date' tracking=True
  • date_start Date
    copy=False string='Start Date'
  • description Html
    help='Description to provide more information and context about this project'
  • duration_tracking Json
    groups='project.group_project_stages'
  • favorite_user_ids Many2many → res.users
    copy=False export_string_translation=False string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' compute_sudo=True export_string_translation=False readonly=False search='_search_is_favorite' string='Show Project on Dashboard'
  • is_milestone_deadline_exceeded Boolean
    compute='_compute_next_milestone_id' export_string_translation=False groups='project.group_project_milestone'
  • is_milestone_exceeded Boolean
    compute='_compute_is_milestone_exceeded' export_string_translation=False search='_search_is_milestone_exceeded'
  • is_template Boolean
    copy=False export_string_translation=False
  • label_tasks Char
    default=<expr> help='Name used to refer to the tasks of your project e.g. tasks, tickets, sprints, etc...' string='Use Tasks as' translate=True
  • last_update_color Integer
    compute='_compute_last_update_color' export_string_translation=False
  • last_update_id Many2one → project.update
    copy=False export_string_translation=False string='Last Update' args: 'project.update'
  • last_update_status Selection
    compute='_compute_last_update_status' default='to_define' export_string_translation=False readonly=False required=True selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold'), ('to_define', 'Set Status'), ('done', 'Complete')] store=True
  • milestone_count Integer
    compute='_compute_milestone_count' export_string_translation=False groups='project.group_project_milestone'
  • milestone_count_reached Integer
    compute='_compute_milestone_reached_count' export_string_translation=False groups='project.group_project_milestone'
  • milestone_ids One2many → project.milestone
    copy=True export_string_translation=False args: 'project.milestone', 'project_id'
  • milestone_progress Integer
    compute='_compute_milestone_reached_count' export_string_translation=False groups='project.group_project_milestone' args: 'Milestones Reached'
  • name Char
    default_export_compatible=True index='trigram' required=True tracking=True translate=True args: 'Name'
  • next_milestone_id Many2one → project.milestone
    compute='_compute_next_milestone_id' export_string_translation=False groups='project.group_project_milestone' args: 'project.milestone'
  • open_task_count Integer
    compute='_compute_open_task_count' export_string_translation=False string='Open Task Count'
  • partner_id Many2one → res.partner
    bypass_search_access=True domain="['|', ('company_id', '=?', company_id), ('company_id', '=', False)]" index='btree_not_null' string='Customer' tracking=True args: 'res.partner'
  • privacy_visibility Selection
    default='portal' help='Project and Task Visibility:\n- Invited internal users: Can access only the project or tasks they follow. Assignees automatically get access.\n- Invited internal and portal users: Same as above, extended to portal users.\n- All internal users: Full access to the project and all its tasks.\n- All internal and invited portal users: Internal users get full access. Portal users can access only the project or tasks they follow.\n\nPortal Access Levels:\n- Read-only: Portal users see tasks via their portal but can’t edit them.\n- Edit (limited): Portal users access kanban/list views and can edit limited fields on followed tasks.\n- Edit: Same as above, with access to all tasks.\n\nOther Rules:\n- Internal users can open a task from a direct link, even without project access.\n- Project admins have access to private projects, even if not followers.\n' required=True string='Visibility' tracking=True args: [('followers', 'Invited internal users'), ('invited_users', 'Invited internal and portal users'), ('employees', 'All internal users'), ('portal', ' All internal users and invited portal users')]
  • privacy_visibility_warning Char
    compute='_compute_privacy_visibility_warning' export_string_translation=False args: 'Privacy Visibility Warning'
  • resource_calendar_id Many2one → resource.calendar
    compute='_compute_resource_calendar_id' export_string_translation=False string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10 export_string_translation=False
  • show_ratings Boolean
    compute='_compute_show_ratings' export_string_translation=False
  • stage_id Many2one → project.project.stage
    copy=False default=_default_stage_id group_expand='_read_group_expand_full' groups='project.group_project_stages' index=True ondelete='restrict' string='Stage' tracking=True args: 'project.project.stage'
  • stage_id_color Integer
    export_string_translation=False related='stage_id.color' string='Stage Color'
  • tag_ids Many2many → project.tags
    relation='project_project_project_tags_rel' string='Tags' args: 'project.tags'
  • task_completion_percentage Float
    compute='_compute_task_completion_percentage' export_string_translation=False
  • task_count Integer
    compute='_compute_task_count' export_string_translation=False string='Task Count'
  • task_ids One2many → project.task
    domain="[('is_closed', '=', False)]" export_string_translation=False string='Tasks' args: 'project.task', 'project_id'
  • task_properties_definition PropertiesDefinition
    args: 'Task Properties'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    export_string_translation=False string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • update_count Integer
    compute='_compute_total_update_ids' export_string_translation=False
  • update_ids One2many → project.update
    export_string_translation=False args: 'project.update', 'project_id'
  • user_id Many2one → res.users
    default=<expr> falsy_value_label=_lt('👤 Unassigned') string='Project Manager' tracking=True args: 'res.users'
Public methods (30)
  • action_create_from_template(self, values=None, role_to_users_mapping=None)
  • action_create_template_from_project(self)
  • action_get_list_view(self)
  • action_open_share_project_wizard(self)
  • action_profitability_items(self, section_name, domain=None, res_id=False)
  • action_project_task_burndown_chart_report(self)
  • action_toggle_project_template_mode(self)
  • action_undo_convert_to_template(self)
  • action_view_all_rating(self)
    return the action to see all the rating of the project and activate default filters
  • action_view_tasks(self)
  • action_view_tasks_analysis(self)
    return the action to see the tasks analysis report of the project
  • action_view_tasks_from_project_milestone(self)
  • check_features_enabled(self, updated_features=None)
    @api.model
  • copy(self, default=None)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • create_template_from_project_undo_callback(self, callbacks)
  • get_last_update_or_default(self)
  • get_milestones(self)
  • get_panel_data(self)
  • get_template_tasks(self)
  • map_tasks(self, new_project_id)
    copy and map tasks from old to new project
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
    Subscribe to newly created task but not all existing active task when subscribing to a project. User update notification preference of project its propagated to all the tasks that the user is currently following.
  • message_unsubscribe(self, partner_ids=None)
  • name_create(self, name)
    @api.model
  • project_update_all_action(self)
  • template_to_project_confirmation_callback(self, callbacks)
  • toggle_favorite(self)
  • unlink(self)
  • write(self, vals)

New fields (7)
  • active Boolean
    default=True export_string_translation=False
  • color Integer
    export_string_translation=False string='Color'
  • company_id Many2one → res.company
    string='Company' args: 'res.company'
  • fold Boolean
    help='If enabled, this stage will be displayed as folded in the Kanban and List views of your projects. Projects in a folded stage are considered as closed.' args: 'Folded'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.project')] help='If set, an email will be automatically sent to the customer when the project reaches this stage.' string='Email Template' args: 'mail.template'
  • name Char
    required=True translate=True
  • sequence Integer
    default=50 export_string_translation=False
Public methods (4)
  • action_unarchive(self)
  • copy_data(self, default=None)
  • unlink_wizard(self, stage_view=False)
  • write(self, vals)

New fields (3)
  • projects_count Integer
    compute='_compute_projects_count' export_string_translation=False args: 'Number of Projects'
  • stage_ids Many2many → project.project.stage
    context={'active_test': False} export_string_translation=False ondelete='cascade' string='Stages To Delete' args: 'project.project.stage'
  • stages_active Boolean
    compute='_compute_stages_active' export_string_translation=False
Public methods (3)
  • action_archive(self)
  • action_unarchive_project(self)
  • action_unlink(self)

New fields (4)
  • active Boolean
    default=True
  • color Integer
    default=_get_default_color
  • name Char
    required=True translate=True
  • sequence Integer
    export_string_translation=False
Public methods (1)
  • copy_data(self, default=None)

New fields (4)
  • access_mode Selection
    default='read' help='Read: collaborators can view tasks but cannot edit them.\nEdit with limited access: collaborators can view and edit tasks they follow in the Kanban view.\nEdit: collaborators can view and edit all tasks in the Kanban view. Additionally, they can choose which tasks they want to follow.' required=True args: [('read', 'Read'), ('edit_limited', 'Edit with limited access'), ('edit', 'Edit')]
  • parent_wizard_id Many2one → project.share.wizard
    export_string_translation=False args: 'project.share.wizard'
  • partner_id Many2one → res.partner
    required=True string='Collaborator' args: 'res.partner'
  • send_invitation Boolean
    compute='_compute_send_invitation' default=True readonly=False store=True string='Send Invitation'
Public methods (0)

No public methods.

New fields (3)
  • collaborator_ids One2many → project.share.collaborator.wizard
    string='Collaborators' args: 'project.share.collaborator.wizard', 'parent_wizard_id'
  • existing_partner_ids Many2many → res.partner
    compute='_compute_existing_partner_ids' export_string_translation=False args: 'res.partner'
  • share_link Char
    help='Anyone with this link can access the project in read mode.' args: 'Public Link'
Public methods (4)
  • action_send_mail(self)
  • action_share_record(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (4)
  • color Integer
    default=_get_default_color help='Transparent tags are not visible in the kanban view of your projects and tasks.' string='Color'
  • name Char
    required=True translate=True args: 'Name'
  • project_ids Many2many → project.project
    export_string_translation=False string='Projects' args: 'project.project', 'project_project_project_tags_rel'
  • task_ids Many2many → project.task
    export_string_translation=False string='Tasks' args: 'project.task'
Public methods (5)
  • arrange_tag_list_by_id(self, tag_list, id_order)
    @api.model
    Re-order a list of record values (dict) following a given id sequence, in O(n). :param tag_list: ordered (by id) list of record values, each record being a dict containing at least an 'id' key :param id_order: list of value (int) corresponding to the id of the records to re-arrange :returns: Sorted list of record values (dict)
  • formatted_read_group(self, domain, groupby=(), aggregates=(), having=(), offset=0, limit=None, order=None) -> <expr>
    @api.model
  • name_create(self, name)
    @api.model
  • name_search(self, name='', domain=None, operator='ilike', limit=100)
    @api.model
  • search_read(self, domain=None, fields=None, offset=0, limit=None, order=None)
    @api.model

New fields (72)
  • active Boolean
    default=True export_string_translation=False
  • allocated_hours Float
    tracking=True args: 'Allocated Time'
  • allow_milestones Boolean
    export_string_translation=False related='project_id.allow_milestones'
  • allow_recurring_tasks Boolean
    export_string_translation=False related='project_id.allow_recurring_tasks'
  • allow_task_dependencies Boolean
    export_string_translation=False related='project_id.allow_task_dependencies'
  • attachment_ids One2many → ir.attachment
    compute='_compute_attachment_ids' export_string_translation=False help="Attachments that don't come from a message" string='Attachments' args: 'ir.attachment'
  • child_ids One2many → project.task
    domain="[('recurring_task', '=', False)]" export_string_translation=False string='Sub-tasks' args: 'project.task', 'parent_id'
  • closed_depend_on_count Integer
    compute='_compute_depend_on_count' compute_sudo=True string='Closed Depending on Tasks'
  • closed_subtask_count Integer
    compute='_compute_subtask_count' export_string_translation=False args: 'Closed Sub-tasks Count'
  • color Integer
    export_string_translation=False string='Color Index'
  • company_id Many2one → res.company
    compute='_compute_company_id' copy=True default=_default_company_id readonly=False recursive=True store=True string='Company' args: 'res.company'
  • create_date Datetime
    index=True readonly=True args: 'Created On'
  • current_user_same_company_partner Boolean
    compute='_compute_current_user_same_company_partner' compute_sudo=True export_string_translation=False
  • date_assign Datetime
    copy=False help='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.' readonly=True string='Assigning Date'
  • date_deadline Datetime
    copy=False index=True string='Deadline' tracking=True
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False help='Date on which the state of your task has last been modified.\nBased 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.' index=True readonly=True string='Last Stage Update'
  • depend_on_count Integer
    compute='_compute_depend_on_count' compute_sudo=True string='Depending on Tasks'
  • depend_on_ids Many2many → project.task
    column1='task_id' column2='depends_on_id' copy=False domain="[('project_id', '!=', False), ('id', '!=', id)]" relation='task_dependencies_rel' string='Blocked By' tracking=True args: 'project.task'
  • dependent_ids Many2many → project.task
    column1='depends_on_id' column2='task_id' copy=False domain="[('project_id', '!=', False), ('id', '!=', id)]" export_string_translation=False relation='task_dependencies_rel' string='Block' args: 'project.task'
  • dependent_tasks_count Integer
    compute='_compute_dependent_tasks_count' export_string_translation=False string='Dependent Tasks'
  • description Html
    sanitize_attributes=False string='Description'
  • display_follow_button Boolean
    compute='_compute_display_follow_button' compute_sudo=True export_string_translation=False
  • display_in_project Boolean
    compute='_compute_display_in_project' export_string_translation=False store=True
  • display_name Char
    help='Use these keywords in the title to set new tasks:\n\n #tags Set tags on the task\n @user Assign the task to a user\n ! Set the task a medium priority\n !! Set the task a high priority\n !!! Set the task a urgent priority\n\n Make sure to use the right format and order e.g. Improve the configuration screen #feature #v16 @Mitchell !' inverse='_inverse_display_name'
  • display_parent_task_button Boolean
    compute='_compute_display_parent_task_button' compute_sudo=True export_string_translation=False
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Cover Image' args: 'ir.attachment'
  • email_cc Char
    help='Email addresses that were in the CC of the incoming emails from this task and that are not currently linked to an existing customer.'
  • email_from Char
    args: 'Email From'
  • has_late_and_unreached_milestone Boolean
    compute='_compute_has_late_and_unreached_milestone' export_string_translation=False search='_search_has_late_and_unreached_milestone'
  • has_project_template Boolean
    export_string_translation=False related='project_id.is_template' string='Has Project Template'
  • has_template_ancestor Boolean
    compute='_compute_has_template_ancestor' export_string_translation=False recursive=True search='_search_has_template_ancestor' store=True
  • is_closed Boolean
    compute='_compute_is_closed' search='_search_is_closed' args: 'Closed state'
  • is_template Boolean
    export_string_translation=False
  • link_preview_name Char
    compute='_compute_link_preview_name' export_string_translation=False
  • milestone_id Many2one → project.milestone
    compute='_compute_milestone_id' domain="[('project_id', '=', project_id)]" help='Deliver your services automatically when a milestone is reached by linking it to a sales order item.' index='btree_not_null' readonly=False store=True tracking=True args: 'project.milestone', 'Milestone'
  • name Char
    index='trigram' required=True string='Title' tracking=True
  • parent_id Many2one → project.task
    domain="['!', ('id', 'child_of', id), ('project_id', '!=', False)]" index=True inverse='_inverse_parent_id' string='Parent Task' tracking=True args: 'project.task'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' domain="['|', ('company_id', '=?', company_id), ('company_id', '=', False)]" index='btree_not_null' readonly=False recursive=True store=True string='Customer' tracking=True args: 'res.partner'
  • partner_phone Char
    compute='_compute_partner_phone' copy=False inverse='_inverse_partner_phone' readonly=False store=True string='Contact Number'
  • personal_stage_id Many2one → project.task.stage.personal
    compute='_compute_personal_stage_id' compute_sudo=False group_expand='_read_group_personal_stage_type_ids' help="The current user's personal stage." search='_search_personal_stage_id' string='Personal Stage State' args: 'project.task.stage.personal'
  • personal_stage_type_id Many2one → project.task.type
    domain="[('user_id', '=', uid)]" group_expand='_read_group_personal_stage_type_ids' help="The current user's personal task stage." readonly=False related='personal_stage_id.stage_id' store=False string='Personal Stage' args: 'project.task.type'
  • personal_stage_type_ids Many2many → project.task.type
    column1='task_id' column2='stage_id' copy=False domain="[('user_id', '=', uid)]" export_string_translation=False group_expand='_read_group_personal_stage_type_ids' ondelete='restrict' string='Personal Stages' args: 'project.task.type', 'project_task_user_rel'
  • portal_user_names Char
    compute='_compute_portal_user_names' compute_sudo=True export_string_translation=False search='_search_portal_user_names'
  • priority Selection
    default='0' index=True string='Priority' tracking=True args: [('0', 'Low priority'), ('1', 'Medium priority'), ('2', 'High priority'), ('3', 'Urgent')]
  • project_id Many2one → project.project
    change_default=True compute='_compute_project_id' domain="['|', ('company_id', '=', False), ('company_id', '=?', company_id)]" falsy_value_label=_lt('🔒 Private') index=True precompute=True readonly=False recursive=True store=True string='Project' tracking=True args: 'project.project'
  • project_privacy_visibility Selection
    related='project_id.privacy_visibility' string='Project Visibility' tracking=False
  • rating_active Boolean
    related='stage_id.rating_active' string='Stage Rating Status'
  • recurrence_id Many2one → project.task.recurrence
    copy=False index='btree_not_null' args: 'project.task.recurrence'
  • recurring_count Integer
    compute='_compute_recurring_count' string='Tasks in Recurrence'
  • recurring_task Boolean
    string='Recurrent'
  • repeat_interval Integer
    compute='_compute_repeat' compute_sudo=True default=1 readonly=False string='Repeat Every'
  • repeat_type Selection
    compute='_compute_repeat' compute_sudo=True default='forever' readonly=False string='Until' args: [('forever', 'Forever'), ('until', 'Until')]
  • repeat_unit Selection
    compute='_compute_repeat' compute_sudo=True default='week' readonly=False args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    compute='_compute_repeat' compute_sudo=True readonly=False string='End Date'
  • role_ids Many2many → project.role
    help='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.' string='Project Roles' args: 'project.role'
  • sequence Integer
    default=10 export_string_translation=False string='Sequence'
  • stage_id Many2one → project.task.type
    compute='_compute_stage_id' default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'project.task.type'
  • stage_id_color Integer
    export_string_translation=False related='stage_id.color' string='Stage Color'
  • state Selection
    compute='_compute_state' copy=False default='01_in_progress' index=True inverse='_inverse_state' readonly=False recursive=True required=True store=True string='State' tracking=True args: [('01_in_progress', 'In Progress'), ('02_changes_requested', 'Changes Requested'), ('03_approved', 'Approved'), *CLOSED_STATES.items(), ('04_waiting_normal', 'Waiting')]
  • subtask_allocated_hours Float
    compute='_compute_subtask_allocated_hours' export_string_translation=False help='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.' args: 'Sub-tasks Allocated Time'
  • subtask_completion_percentage Float
    compute='_compute_subtask_completion_percentage' export_string_translation=False
  • subtask_count Integer
    compute='_compute_subtask_count' export_string_translation=False args: 'Sub-task Count'
  • tag_ids Many2many → project.tags
    string='Tags' args: 'project.tags'
  • task_properties Properties
    copy=True definition='project_id.task_properties_definition' args: 'Properties'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' context={'active_test': False} default=_default_user_ids domain="[('share', '=', False), ('active', '=', True)]" falsy_value_label=_lt('👤 Unassigned') relation='project_task_user_rel' string='Assignees' tracking=True args: 'res.users'
  • website_message_ids One2many
    domain=<expr> export_string_translation=False
  • working_days_close Float
    aggregator='avg' compute='_compute_elapsed' store=True string='Working Days to Close'
  • working_days_open Float
    aggregator='avg' compute='_compute_elapsed' store=True string='Working Days to Assign'
  • working_hours_close Float
    aggregator='avg' compute='_compute_elapsed' digits=(16, 2) store=True string='Working Hours to Close'
  • working_hours_open Float
    aggregator='avg' compute='_compute_elapsed' digits=(16, 2) store=True string='Working Hours to Assign'
  • write_date Datetime
    readonly=True args: 'Last Updated On'
Public methods (39)
  • OPEN_STATES(self)
    @property
    Return a list of the technical names complementing the CLOSED_STATES, a.k.a the open states
  • TASK_PORTAL_READABLE_FIELDS(self)
    @property
  • TASK_PORTAL_WRITABLE_FIELDS(self)
    @property
  • action_archive(self)
  • action_convert_to_subtask(self)
  • action_convert_to_template(self)
  • action_create_from_template(self, values=None)
  • action_dependent_tasks(self)
  • action_open_parent_task(self)
  • action_open_ratings(self)
  • action_open_task(self)
  • action_project_sharing_open_blocking(self)
  • action_project_sharing_open_subtasks(self)
  • action_project_sharing_open_task(self)
  • action_project_sharing_recurring_tasks(self)
  • action_project_sharing_view_parent_task(self)
  • action_recurring_tasks(self)
  • action_redirect_to_project_task_form(self)
  • action_undo_convert_to_template(self)
  • action_unlink_recurrence(self)
  • copy(self, default=None)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • get_empty_list_help(self, help_message)
    @api.model
  • get_import_templates(self)
    @api.model
  • get_mention_suggestions(self, search, limit=8)
    Return the 'limit'-first followers of the given task or followers of its project matching a 'search' string as a list of partner data (returned by `_to_store()`). See similar method for all partners `get_mention_suggestions()`.
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • is_blocked_by_dependences(self)
  • message_new(self, msg_dict, custom_values=None)
    @api.model
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
  • message_update(self, msg_dict, update_vals=None)
  • plan_task_in_calendar(self, vals)
  • project_sharing_toggle_is_follower(self)
  • rating_apply(self, rate, token=None, rating=None, feedback=None, subtype_xmlid=None, notify_delay_send=False)
  • stage_find(self, section_id, domain=[], order='sequence, id')
    Override of the base.stage method Parameter of the stage search taken from the lead: :param section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • unlink(self)
  • update_date_end(self, stage_id)
  • write(self, vals)

New fields (13)
  • allocated_hours Float
    readonly=True string='Allocated Time'
  • date Datetime
    readonly=True args: 'Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_last_stage_update Date
    readonly=True string='Last Stage Update'
  • is_closed Selection
    readonly=True string='Closing Stage' args: [('closed', 'Closed tasks'), ('open', 'Open tasks')]
  • milestone_id Many2one → project.milestone
    readonly=True args: 'project.milestone'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • project_id Many2one → project.project
    readonly=True args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True args: 'project.task.type'
  • state Selection
    readonly=True string='State' args: [('01_in_progress', 'In Progress'), ('1_done', 'Done'), ('04_waiting_normal', 'Waiting'), ('03_approved', 'Approved'), ('1_canceled', 'Cancelled'), ('02_changes_requested', 'Changes Requested')]
  • tag_ids Many2many → project.tags
    column1='project_task_id' column2='project_tags_id' readonly=True relation='project_tags_project_task_rel' string='Tags' args: 'project.tags'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
Public methods (1)
  • task_specific_fields(self)
    @property

New fields (5)
  • repeat_interval Integer
    default=1 string='Repeat Every'
  • repeat_type Selection
    default='forever' string='Until' args: [('forever', 'Forever'), ('until', 'Until')]
  • repeat_unit Selection
    default='week' export_string_translation=False args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    string='End Date'
  • task_ids One2many → project.task
    copy=False args: 'project.task', 'recurrence_id'
Public methods (0)

No public methods.

New fields (3)
  • stage_id Many2one → project.task.type
    domain="[('user_id', '=', user_id)]" export_string_translation=False ondelete='set null' args: 'project.task.type'
  • task_id Many2one → project.task
    export_string_translation=False index=True ondelete='cascade' required=True args: 'project.task'
  • user_id Many2one → res.users
    export_string_translation=False index=True ondelete='cascade' required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (15)
  • active Boolean
    default=True export_string_translation=False args: 'Active'
  • auto_validation_state Boolean
    default=False help="Automatically modify the state when the customer replies to the feedback for this stage.\n * Good feedback from the customer will update the state to 'Approved' (green bullet).\n * Neutral or bad feedback will set the kanban state to 'Changes Requested' (orange bullet).\n" args: 'Automatic Kanban Status'
  • color Integer
    export_string_translation=False string='Color'
  • fold Boolean
    string='Folded'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set, an email will be automatically sent to the customer when the task reaches this stage.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Name' translate=True
  • project_ids Many2many → project.project
    default=<expr> help='Projects in which this stage is present. If you follow a similar workflow in several projects, you can share this stage among them and get consolidated information this way.' string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • rating_active Boolean
    args: 'Send a customer rating request'
  • rating_request_deadline Datetime
    compute='_compute_rating_request_deadline' export_string_translation=False store=True
  • rating_status Selection
    default='stage' help='Collect feedback from your customers by sending them a rating request when a task enters a certain stage. To do so, define a rating email template on the stage.\nRating when changing stage: an email will be automatically sent when a task reaches the stage.\nPeriodic rating: an email will be automatically sent at regular intervals as long as the task remains in the stage.' required=True selection=[('stage', 'when reaching this stage'), ('periodic', 'on a periodic basis')] string='Customer Ratings Status'
  • rating_status_period Selection
    default='monthly' required=True selection=[('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a Month'), ('monthly', 'Once a Month'), ('quarterly', 'Quarterly'), ('yearly', 'Yearly')] string='Rating Frequency'
  • rating_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set, a rating request will automatically be sent by email to the customer when the task reaches this stage. \nAlternatively, it will be sent at a regular interval as long as the task remains in this stage.' string='Rating Email Template' args: 'mail.template'
  • rotting_threshold_days Integer
    default=0 help='Day count before tasks in this stage become stale. Set to 0 to disable Changing this parameter will not affect the rotting status/date of resources last updated before this change.' args: 'Days to rot'
  • sequence Integer
    default=1
  • user_id Many2one → res.users
    compute='_compute_user_id' default=_default_user_id index=True store=True args: 'res.users', 'Stage Owner'
Public methods (4)
  • action_unarchive(self)
  • copy_data(self, default=None)
  • unlink_wizard(self, stage_view=False)
  • write(self, vals)

New fields (4)
  • project_ids Many2many → project.project
    domain="['|', ('active', '=', False), ('active', '=', True)]" export_string_translation=False ondelete='cascade' string='Projects' args: 'project.project'
  • stage_ids Many2many → project.task.type
    export_string_translation=False ondelete='cascade' string='Stages To Delete' args: 'project.task.type'
  • stages_active Boolean
    compute='_compute_stages_active' export_string_translation=False
  • tasks_count Integer
    compute='_compute_tasks_count' export_string_translation=False args: 'Number of Tasks'
Public methods (4)
  • action_archive(self)
  • action_confirm(self)
  • action_unarchive_task(self)
  • action_unlink(self)

New fields (8)
  • alias_domain_id Many2one → mail.alias.domain
    string='Alias Domain' args: 'mail.alias.domain'
  • alias_name Char
    string='Alias Name'
  • date Date
    string='Expiration Date'
  • date_start Date
    string='Start Date'
  • name Char
    required=True string='Name'
  • role_to_users_ids One2many → project.template.role.to.users.map
    default=_default_role_to_users_ids args: 'project.template.role.to.users.map', 'wizard_id'
  • template_has_dates Boolean
    compute='_compute_template_has_dates'
  • template_id Many2one → project.project
    default=<expr> args: 'project.project'
Public methods (2)
  • action_open_template_view(self)
    @api.model
  • create_project_from_template(self)

New fields (3)
  • role_id Many2one → project.role
    required=True string='Project Role' args: 'project.role'
  • user_ids Many2many → res.users
    domain=[('share', '=', False), ('active', '=', True)] string='Assignees' args: 'res.users'
  • wizard_id Many2one → project.template.create.wizard
    export_string_translation=False args: 'project.template.create.wizard'
Public methods (0)

No public methods.

New fields (14)
  • closed_task_count Integer
    export_string_translation=False readonly=True args: 'Closed Task Count'
  • closed_task_percentage Integer
    compute='_compute_closed_task_percentage' export_string_translation=False args: 'Closed Task Percentage'
  • color Integer
    compute='_compute_color' export_string_translation=False
  • date Date
    default=fields.Date.context_today tracking=True
  • description Html
  • label_tasks Char
    related='project_id.label_tasks'
  • name Char
    required=True tracking=True args: 'Title'
  • name_cropped Char
    compute='_compute_name_cropped' export_string_translation=False
  • progress Integer
    tracking=True
  • progress_percentage Float
    compute='_compute_progress_percentage' export_string_translation=False
  • project_id Many2one → project.project
    domain=[('is_template', '=', False)] export_string_translation=False index=True required=True args: 'project.project'
  • status Selection
    export_string_translation=False required=True selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold'), ('done', 'Complete')] tracking=True
  • task_count Integer
    export_string_translation=False readonly=True args: 'Task Count'
  • user_id Many2one → res.users
    default=<expr> required=True string='Author' args: 'res.users'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model
  • unlink(self)

New fields (33)
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • create_date Datetime
    readonly=True args: 'Create Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Datetime
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • delay_endings_days Float
    aggregator='avg' digits=(16, 2) readonly=True string='Days to Deadline'
  • dependent_ids Many2many → project.task
    column1='depends_on_id' column2='task_id' domain="[('allow_task_dependencies', '=', True), ('id', '!=', id)]" readonly=True relation='task_dependencies_rel' string='Block' args: 'project.task'
  • description Text
    readonly=True
  • display_in_project Boolean
    export_string_translation=False
  • has_template_ancestor Boolean
    readonly=True
  • is_closed Boolean
    readonly=True string='Closed state'
  • is_template Boolean
    readonly=True
  • message_is_follower Boolean
    related='task_id.message_is_follower'
  • milestone_id Many2one → project.milestone
    readonly=True args: 'project.milestone'
  • name Char
    readonly=True string='Task Title'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • parent_id Many2one → project.task
    readonly=True string='Parent Task' args: 'project.task'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • personal_stage_type_ids Many2many → project.task.type
    column1='task_id' column2='stage_id' readonly=True relation='project_task_user_rel' string='Personal Stage' args: 'project.task.type'
  • priority Selection
    readonly=True string='Priority' args: [('0', 'Low priority'), ('1', 'Medium priority'), ('2', 'High priority'), ('3', 'Urgent')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • rating_avg Float
    aggregator='avg' readonly=True args: 'Average Rating (1-5)'
  • rating_last_value Float
    aggregator='avg' readonly=True args: 'Last Rating (1-5)'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='State' args: [('01_in_progress', 'In Progress'), ('1_done', 'Done'), ('04_waiting_normal', 'Waiting'), ('03_approved', 'Approved'), ('1_canceled', 'Cancelled'), ('02_changes_requested', 'Changes Requested')]
  • tag_ids Many2many → project.tags
    column1='project_task_id' column2='project_tags_id' readonly=True relation='project_tags_project_task_rel' string='Tags' args: 'project.tags'
  • task_id Many2one → project.task
    readonly=True string='Task' args: 'project.task'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
  • working_days_close Float
    aggregator='avg' digits=(16, 2) readonly=True string='Working Days to Close'
  • working_days_open Float
    aggregator='avg' digits=(16, 2) readonly=True string='Working Days to Assign'
  • working_hours_close Float
    aggregator='avg' digits=(16, 2) readonly=True string='Working Hours to Close'
  • working_hours_open Float
    aggregator='avg' digits=(16, 2) readonly=True string='Working Hours to Assign'
Public methods (1)
  • init(self)

New fields (2)
  • group_project_stages Boolean
    implied_group='project.group_project_stages' args: 'Project Stages'
  • module_hr_timesheet Boolean
    string='Task Logs'
Public methods (1)
  • set_values(self)

New fields (3)
  • project_ids One2many → project.project
    export_string_translation=False string='Projects' args: 'project.project', 'partner_id'
  • task_count Integer
    compute='_compute_task_count' export_string_translation=False string='# Tasks'
  • task_ids One2many → project.task
    export_string_translation=False string='Tasks' args: 'project.task', 'partner_id'
Public methods (1)
  • action_view_tasks(self)

New fields (1)
  • favorite_project_ids Many2many → project.project
    copy=False export_string_translation=False string='Favorite Projects' args: 'project.project', 'project_favorite_user_rel', 'user_id', 'project_id'
Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (0)

No new fields.

Public methods (1)
  • get_embedded_actions_settings(self)

New fields (2)
  • project_privacy_visibility Selection
    related='task_id.project_privacy_visibility'
  • task_id Many2one → project.task
    default=<expr> args: 'project.task'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/project
VERSION
VERSION 1.3
CATEGORY
CATEGORYServices/Project
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, Damien Bouvy, Yannick Tivisse, qsm-odoo, Odoo Online, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Toufik Ben Jaa, Enric Tobella, Sébastien Theys, Julien Mougenot, Nasreddin Boulif (bon), Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, abd-msyukyu-odoo, Romain Estievenart, Krzysztof Magusiak, Abdelouahab (abla), Nicolas Bayet, Jinjiu Liu, Hubert Van De Walle, luvi, Renaud Thiry, Vincent Larcin, Habib (ayh), damr, Thomas Lefebvre (thle), alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), tsm-odoo, Walid, Maximilien (malb), Victor Piryns (pivi), Yash Vaishnav, amdi-odoo, Simon Genin (ges), Pierre-Yves Dufays, Levi Siuzdak (sile), Dylan Kiss (dyki), Sébastien Geelen (sge), FrancoisGe, Michael (mcm), Odoo, Leloup Loïc (lole), Hugo Carlier (Huca), bram1000, Xavier Bol (xbo), Nguyễn Đại Dương, Sarah Bellefroid, ilru-odoo, Noe Antoine, omra-odoo, Andrzej(pian), rajh-odoo, Giang Pham, shag-odoo, Walid (wasa), sesn-odoo, kdeb@odoo.com, stefanorigano (SRI), ravb-odoo, Youssef Bashandy, Ethan Vincent, lase@odoo.com, bary, Maryam Kia, Maxime de Neuville, suth-odoo, Abderraouf Ghrissi (abgh), Nathaniel (naja), Bastien Fafchamps (bafa), Julien Carion (juca), kcv-odoo, Tanguy Quéguineur, Ritika Rathore, Julien Segers (juse), Louis Gobert, dise, Chrysanthe (chgo), Rodolpho Lima, sami odoo, Louis (wil), mano-odoo, kais-odoo, Elisabeth Dickinson, Xavier Luyckx (xlu), mash, Manushi Shah, Pierre Pulinckx (PIPU), Abdessamad Zouiten (abzo), luve-odoo, Ian, st-yes, Chris Duvivier, Cuong, Nguyen Minh Tran Manh, aych-odoo, Michaël Mattiello, Pierre Pulinckx (pipu), Pierre Pulinckx, fdardenne, Bastien PIERRE, K Theja (kthe), AnhBT, kpt-odoo, kusi-odoo, Raja Prasad, Panagiotis Kyriakou, yame-odoo, Bastien (bvdn), Krzysztof Magusiak (krma), rupa-odoo, utma-odoo, Hadi El Yakhni, Maeva De Keyser (MDEK), lakhichand borse, mjvi-odoo, desh, dise-odoo, Quentin Colla (qucol), Killian Frappart, shap@odoo.com, shiyam kumar, padh-odoo, Shubham Patel, Maxime de Neuville (mane), Aurélien Bertrand, rapa, damrOdoo, mibav-odoo, abbhi-Odoo, raja prasad, Arnaud Gony, maap-odoo
WEBSITE
WEBSITEhttps://www.odoo.com/app/project
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - analytic
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - rating
    - resource
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (116)
XML IDNameModelTypeStatus
account_analytic_account_view_form_inherit account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
digest_digest_view_form digest.digest.view.form.inherit.project.task digest.digest xpath Inherits digest.digest_digest_view_form
edit_project project.project.form project.project form New
mail_activity_plan_view_form_project_and_task mail.activity.plan.view.form.project.and.task mail.activity.plan xpath Inherits mail.mail_activity_plan_view_form
open_view_all_tasks_list_view open.view.all.tasks.list.view project.task list Inherits view_task_tree2
open_view_blocked_by_list_view open.view.blocked.by.list.view project.task list Inherits project.open_view_all_tasks_list_view
open_view_my_tasks_list_view open.view.my.tasks.list.view project.task list Inherits view_task_tree2
portal_layout Portal layout: project menu entry ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home Projects / Tasks ir.ui.view qweb Inherits portal.portal_my_home
portal_my_project My Project ir.ui.view qweb New
portal_my_projects My Projects ir.ui.view qweb New
portal_my_task My Task ir.ui.view qweb Inherits portal.portal_sidebar
portal_my_task_allocated_hours_template portal_my_task_allocated_hours_template ir.ui.view qweb New
portal_my_tasks My Tasks ir.ui.view qweb New
portal_my_tasks_priority_widget_template Priority Widget Template ir.ui.view qweb New
portal_my_tasks_state_widget_template Status Widget Template ir.ui.view qweb New
portal_tasks_list Tasks List ir.ui.view qweb New
project.milestone_deadline project.milestone_deadline ir.ui.view qweb New
project_kanban_view_group_stage project.project.kanban.group.stage project.project xpath Inherits view_project_kanban
project_list_view_group_stage project.project.list.group.stage project.project list Inherits view_project
project_message_user_assigned project_message_user_assigned ir.ui.view qweb New
project_milestone_view_form project.milestone.view.form project.milestone form New
project_milestone_view_tree project.milestone.view.list project.milestone list New
project_project_stage_view_form project.project.stage.view.form project.project.stage form New
project_project_stage_view_form_quick_create project.project.stage.view.form.quick.create project.project.stage form New
project_project_stage_view_kanban project.project.stage.view.kanban project.project.stage kanban New
project_project_stage_view_search project.project.stage.view.search project.project.stage search New
project_project_stage_view_tree project.project.stage.view.list project.project.stage list New
project_project_view_activity project.project.view.activity project.project activity New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_project_view_form_simplified_footer project.project.view.form.simplified project.project xpath Inherits project.project_project_view_form_simplified
project_share_wizard_confirm_form project.share.wizard.view.form project.share.wizard form New
project_share_wizard_view_form project.share.wizard.view.form project.share.wizard form New
project_sharing Project Sharing View ir.ui.view qweb New
project_sharing_embed Project Sharing View Embed ir.ui.view qweb New
project_sharing_portal My Project ir.ui.view qweb New
project_sharing_project_task_view_form project.sharing.project.task.view.form project.task form New
project_sharing_project_task_view_kanban project.sharing.project.task.view.kanban project.task kanban New
project_sharing_project_task_view_search project.task.search.form project.task filter Inherits project.view_task_search_form_base
project_sharing_project_task_view_tree project.sharing.project.task.list project.task list Inherits project_task_view_tree_main_base
project_sharing_quick_create_task_form project.task.form.quick_create project.task form New
project_sub_task_view_kanban_mobile project.task.kanban project.task xpath Inherits project.view_task_kanban
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
project_tags_tree_view Tags project.tags list New
project_task_burndown_chart_report_view_graph project.task.burndown.chart.report.view.graph project.task.burndown.chart.report graph New
project_task_burndown_chart_report_view_search project.task.burndown.chart.report.view.search project.task.burndown.chart.report search New
project_task_convert_to_subtask_view_form project.task.convert.to.subtask.form project.task form New
project_task_view_activity project.task.activity project.task activity New
project_task_view_tree_base project.task.view.list.base project.task list Inherits project_task_view_tree_main_base
project_task_view_tree_main_base project.task.view.list.main.base project.task list New
project_update_default_description Project Update Description ir.ui.view qweb New
project_update_view_form project.update.view.form project.update form New
project_update_view_kanban project.update.view.kanban project.update kanban New
project_update_view_search project.update.view.search project.update search New
project_update_view_tree project.update.view.list project.update list New
project_view_kanban project.project.kanban project.project kanban New
project_view_kanban_inherit_project project.kanban.inherit.project project.project xpath Inherits project.view_project_kanban
quick_create_project_form project.form.quick_create project.project form New
quick_create_task_form project.task.form.quick_create project.task form New
quick_create_task_form_inherit_view_default_project project.task.form.quick.create.sale.order.inherited project.task field Inherits quick_create_task_form
quick_create_task_form_res_partner project.task.form.quick_create.res.partner project.task xpath Inherits quick_create_task_form
rating_rating_project_view_kanban rating.rating.kanban.project rating.rating xpath Inherits rating.rating_rating_view_kanban
rating_rating_view_form_project rating.rating.form.project rating.rating xpath Inherits rating.rating_rating_view_form_text
rating_rating_view_graph rating.rating.view.graph.project rating.rating xpath Inherits rating.rating_rating_view_graph
rating_rating_view_pivot rating.rating.view.pivot.project rating.rating xpath Inherits rating.rating_rating_view_pivot
rating_rating_view_search_project rating.rating.search.project rating.rating xpath Inherits rating.rating_rating_view_search
rating_rating_view_tree_project rating.rating.list.project rating.rating field Inherits rating.rating_rating_view_tree
res_config_settings_view_form res.config.settings.view.form.inherit.project res.config.settings xpath Inherits base.res_config_settings_view_form
task_invitation_follower task_invitation_follower ir.ui.view qweb New
task_link_preview_front_end task_link_preview_front_end ir.ui.view qweb Inherits portal.frontend_layout
task_link_preview_portal_layout task_link_preview_portal_layout ir.ui.view qweb Inherits portal.portal_layout
task_track_depending_tasks task_track_depending_tasks ir.ui.view qweb New
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.list project.task.type list New
task_type_tree_inherited project.task.type.list.inherited project.task.type xpath Inherits task_type_tree
view_account_analytic_account_list_inherit account.analytic.account.list.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_list
view_project project.project.list project.project list New
view_project_calendar project.project.calendar project.project calendar New
view_project_config project.project.list.config project.project xpath Inherits project.view_project
view_project_config_group_stage project.project.list.config.group.stage project.project list Inherits view_project_config
view_project_config_kanban project.kanban.inherit.config.project project.project xpath Inherits view_project_kanban
view_project_config_kanban_group_stage project.kanban.inherit.config.project.group.stage project.project xpath Inherits view_project_config_kanban
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_project_stage_delete_wizard project.project.stage.delete.wizard.form project.project.stage.delete.wizard form New
view_project_project_stage_unarchive_wizard project.project.stage.delete.wizard.form project.project.stage.delete.wizard form New
view_project_task_graph project.task.graph project.task graph New
view_project_task_graph_inherit project.task.graph.inherit project.task xpath Inherits project.view_project_task_graph
view_project_task_pivot project.task.pivot project.task pivot New
view_project_task_pivot_inherit project.task.pivot.inherit project.task xpath Inherits project.view_project_task_pivot
view_project_task_type_delete_confirmation_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_delete_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_kanban project.task.type.kanban project.task.type kanban New
view_project_task_type_unarchive_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_task_all_calendar project.task.all.calendar project.task xpath Inherits view_task_calendar
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_form_res_partner project.task.form.res.partner project.task xpath Inherits view_task_form2
view_task_kanban project.task.kanban project.task kanban New
view_task_kanban_inherit_all_task project.task.kanban.inherit.all.task project.task xpath Inherits view_task_kanban
view_task_kanban_inherit_my_task project.task.kanban.inherit.my.task project.task xpath Inherits view_task_kanban
view_task_kanban_inherit_view_default_project project.task.kanban.sale.order project.task kanban Inherits view_task_kanban
view_task_kanban_res_partner project.task.kanban.res.partner project.task xpath Inherits view_task_kanban_inherit_all_task
view_task_partner_info_form res.partner.task.buttons res.partner div Inherits base.view_partner_form
view_task_project_user_fsm_graph_base report.project.task.user.graph report.project.task.user graph Inherits view_task_project_user_graph
view_task_project_user_fsm_pivot_base report.project.task.user.pivot report.project.task.user pivot Inherits view_task_project_user_pivot
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search Inherits project.view_task_search_form_project_fsm_base
view_task_search_form project.task.search.form project.task filter Inherits view_task_search_form_project_base
view_task_search_form_base project.task.search.form project.task search New
view_task_search_form_project_base project.task.search.form.project.base project.task filter Inherits view_task_search_form_project_fsm_base
view_task_search_form_project_fsm_base project.task.search.form.project.base project.task field Inherits view_task_search_form_base
view_task_tree2 project.task.list project.task list Inherits project_task_view_tree_base
Models touched (22)

New fields (2)
  • project_count Integer
    compute='_compute_project_count' export_string_translation=False args: 'Project Count'
  • project_ids One2many → project.project
    export_string_translation=False string='Projects' args: 'project.project', 'account_id'
Public methods (1)
  • action_view_projects(self)

New fields (2)
  • kpi_project_task_opened Boolean
    args: 'Open Tasks'
  • kpi_project_task_opened_value Integer
    compute='_compute_project_task_opened_value' export_string_translation=False
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • init(self)

New fields (4)
  • limited_access Boolean
    default=False export_string_translation=False args: 'Limited Access'
  • partner_email Char
    export_string_translation=False related='partner_id.email'
  • partner_id Many2one → res.partner
    export_string_translation=False readonly=True required=True args: 'res.partner', 'Collaborator'
  • project_id Many2one → project.project
    domain=[('privacy_visibility', '=', 'portal')] export_string_translation=False readonly=True required=True args: 'project.project', 'Project Shared'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)

New fields (11)
  • can_be_marked_as_done Boolean
    compute='_compute_can_be_marked_as_done' export_string_translation=False
  • deadline Date
    copy=False tracking=True
  • done_task_count Integer
    compute='_compute_task_count' export_string_translation=False groups='project.group_project_milestone' args: '# of Done Tasks'
  • is_deadline_exceeded Boolean
    compute='_compute_is_deadline_exceeded' export_string_translation=False
  • is_deadline_future Boolean
    compute='_compute_is_deadline_future' export_string_translation=False
  • is_reached Boolean
    copy=False default=False string='Reached'
  • name Char
    required=True
  • project_id Many2one → project.project
    default=_get_default_project_id ondelete='cascade' required=True args: 'project.project'
  • reached_date Date
    compute='_compute_reached_date' export_string_translation=False store=True
  • task_count Integer
    compute='_compute_task_count' export_string_translation=False groups='project.group_project_milestone' args: '# of Tasks'
  • task_ids One2many → project.task
    export_string_translation=False args: 'project.task', 'milestone_id', 'Tasks'
Public methods (3)
  • action_view_tasks(self)
  • copy(self, default=None)
  • toggle_is_reached(self, is_reached)

New fields (53)
  • access_instruction_message Char
    compute='_compute_access_instruction_message' export_string_translation=False args: 'Access Instruction Message'
  • account_id Many2one → account.analytic.account
    copy=False domain="['|', ('company_id', '=', False), ('company_id', '=?', company_id)]" ondelete='set null' args: 'account.analytic.account'
  • active Boolean
    copy=False default=True export_string_translation=False
  • alias_id Many2one
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).'
  • allow_milestones Boolean
    default=<expr> args: 'Milestones'
  • allow_task_dependencies Boolean
    default=<expr> inverse='_inverse_allow_task_dependencies' args: 'Task Dependencies'
  • analytic_account_balance Monetary
    related='account_id.balance'
  • can_mark_milestone_as_done Boolean
    compute='_compute_next_milestone_id' export_string_translation=False groups='project.group_project_milestone'
  • closed_task_count Integer
    compute='_compute_closed_task_count' export_string_translation=False
  • collaborator_count Integer
    compute='_compute_collaborator_count' compute_sudo=True export_string_translation=False args: '# Collaborators'
  • collaborator_ids One2many → project.collaborator
    copy=False export_string_translation=False string='Collaborators' args: 'project.collaborator', 'project_id'
  • color Integer
    export_string_translation=False string='Color Index'
  • company_id Many2one → res.company
    compute='_compute_company_id' inverse='_inverse_company_id' readonly=False store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency_id' export_string_translation=False readonly=True string='Currency' args: 'res.currency'
  • date Date
    help='Date on which this project ends. The timeframe defined on the project is taken into account when viewing its planning.' index=True string='Expiration Date' tracking=True
  • date_start Date
    string='Start Date'
  • description Html
    help='Description to provide more information and context about this project'
  • duration_tracking Json
    groups='project.group_project_stages'
  • favorite_user_ids Many2many → res.users
    copy=False export_string_translation=False string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' compute_sudo=True export_string_translation=False readonly=False search='_search_is_favorite' string='Show Project on Dashboard'
  • is_milestone_deadline_exceeded Boolean
    compute='_compute_next_milestone_id' export_string_translation=False groups='project.group_project_milestone'
  • is_milestone_exceeded Boolean
    compute='_compute_is_milestone_exceeded' export_string_translation=False search='_search_is_milestone_exceeded'
  • label_tasks Char
    default=<expr> help='Name used to refer to the tasks of your project e.g. tasks, tickets, sprints, etc...' string='Use Tasks as' translate=True
  • last_update_color Integer
    compute='_compute_last_update_color' export_string_translation=False
  • last_update_id Many2one → project.update
    copy=False export_string_translation=False string='Last Update' args: 'project.update'
  • last_update_status Selection
    compute='_compute_last_update_status' default='to_define' export_string_translation=False readonly=False required=True selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold'), ('to_define', 'Set Status'), ('done', 'Done')] store=True
  • milestone_count Integer
    compute='_compute_milestone_count' export_string_translation=False groups='project.group_project_milestone'
  • milestone_count_reached Integer
    compute='_compute_milestone_reached_count' export_string_translation=False groups='project.group_project_milestone'
  • milestone_ids One2many → project.milestone
    copy=True export_string_translation=False args: 'project.milestone', 'project_id'
  • milestone_progress Integer
    compute='_compute_milestone_reached_count' export_string_translation=False groups='project.group_project_milestone' args: 'Milestones Reached'
  • name Char
    default_export_compatible=True index='trigram' required=True tracking=True translate=True args: 'Name'
  • next_milestone_id Many2one → project.milestone
    compute='_compute_next_milestone_id' export_string_translation=False groups='project.group_project_milestone' args: 'project.milestone'
  • open_task_count Integer
    compute='_compute_open_task_count' export_string_translation=False string='Open Task Count'
  • partner_id Many2one → res.partner
    auto_join=True domain="['|', ('company_id', '=?', company_id), ('company_id', '=', False)]" string='Customer' tracking=True args: 'res.partner'
  • privacy_visibility Selection
    default='portal' help='People to whom this project and its tasks will be visible.\n\n- Invited internal users: when following a project, internal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n A user with the project > administrator access right level can still access this project and its tasks, even if they are not explicitly part of the followers.\n\n- All internal users: all internal users can access the project and all of its tasks without distinction.\n\n- Invited portal users and all internal users: all internal users can access the project and all of its tasks without distinction.\nWhen following a project, portal users will only get access to the specific tasks they are following.\n\nWhen a project is shared in read-only, the portal user is redirected to their portal. They can view the tasks they are following, but not edit them.\nWhen a project is shared in edit, the portal user is redirected to the kanban and list views of the tasks. They can modify a selected number of fields on the tasks.\n\nIn any case, an internal user with no project access rights can still access a task, provided that they are given the corresponding URL (and that they are part of the followers if the project is private).' required=True string='Visibility' tracking=True args: [('followers', 'Invited internal users (private)'), ('employees', 'All internal users'), ('portal', 'Invited portal users and all internal users (public)')]
  • privacy_visibility_warning Char
    compute='_compute_privacy_visibility_warning' export_string_translation=False args: 'Privacy Visibility Warning'
  • rating_active Boolean
    default=<expr> args: 'Customer Ratings'
  • rating_request_deadline Datetime
    compute='_compute_rating_request_deadline' export_string_translation=False store=True
  • rating_status Selection
    default='stage' help='Collect feedback from your customers by sending them a rating request when a task enters a certain stage. To do so, define a rating email template on the corresponding stages.\nRating when changing stage: an email will be automatically sent when the task reaches the stage on which the rating email template is set.\nPeriodic rating: an email will be automatically sent at regular intervals as long as the task remains in the stage in which the rating email template is set.' required=True args: [('stage', 'when reaching a given stage'), ('periodic', 'on a periodic basis')], 'Customer Ratings Status'
  • rating_status_period Selection
    default='monthly' required=True args: [('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a Month'), ('monthly', 'Once a Month'), ('quarterly', 'Quarterly'), ('yearly', 'Yearly')], 'Rating Frequency'
  • resource_calendar_id Many2one → resource.calendar
    compute='_compute_resource_calendar_id' export_string_translation=False string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10 export_string_translation=False
  • stage_id Many2one → project.project.stage
    copy=False default=_default_stage_id group_expand='_read_group_expand_full' groups='project.group_project_stages' index=True ondelete='restrict' string='Stage' tracking=True args: 'project.project.stage'
  • tag_ids Many2many → project.tags
    relation='project_project_project_tags_rel' string='Tags' args: 'project.tags'
  • task_completion_percentage Float
    compute='_compute_task_completion_percentage' export_string_translation=False
  • task_count Integer
    compute='_compute_task_count' export_string_translation=False string='Task Count'
  • task_ids One2many → project.task
    domain=<expr> export_string_translation=False string='Tasks' args: 'project.task', 'project_id'
  • task_properties_definition PropertiesDefinition
    args: 'Task Properties'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    export_string_translation=False string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • update_count Integer
    compute='_compute_total_update_ids' export_string_translation=False
  • update_ids One2many → project.update
    export_string_translation=False args: 'project.update', 'project_id'
  • user_id Many2one → res.users
    default=<expr> string='Project Manager' tracking=True args: 'res.users'
Public methods (21)
  • action_get_list_view(self)
  • action_open_share_project_wizard(self)
  • action_profitability_items(self, section_name, domain=None, res_id=False)
  • action_project_task_burndown_chart_report(self)
  • action_view_all_rating(self)
    return the action to see all the rating of the project and activate default filters
  • action_view_tasks(self)
  • action_view_tasks_analysis(self)
    return the action to see the tasks analysis report of the project
  • copy(self, default=None)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • get_last_update_or_default(self)
  • get_milestones(self)
  • get_panel_data(self)
  • map_tasks(self, new_project_id)
    copy and map tasks from old to new project
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
    Subscribe to newly created task but not all existing active task when subscribing to a project. User update notification preference of project its propagated to all the tasks that the user is currently following.
  • message_unsubscribe(self, partner_ids=None)
  • name_create(self, name)
    @api.model
  • project_update_all_action(self)
  • toggle_favorite(self)
  • unlink(self)
  • write(self, vals)

New fields (6)
  • active Boolean
    default=True export_string_translation=False
  • company_id Many2one → res.company
    string='Company' args: 'res.company'
  • fold Boolean
    help='If enabled, this stage will be displayed as folded in the Kanban view of your projects. Projects in a folded stage are considered as closed.' args: 'Folded in Kanban'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.project')] help='If set, an email will be automatically sent to the customer when the project reaches this stage.' string='Email Template' args: 'mail.template'
  • name Char
    required=True translate=True
  • sequence Integer
    default=50 export_string_translation=False
Public methods (4)
  • copy_data(self, default=None)
  • toggle_active(self)
  • unlink_wizard(self, stage_view=False)
  • write(self, vals)

New fields (3)
  • projects_count Integer
    compute='_compute_projects_count' export_string_translation=False args: 'Number of Projects'
  • stage_ids Many2many → project.project.stage
    context={'active_test': False} export_string_translation=False ondelete='cascade' string='Stages To Delete' args: 'project.project.stage'
  • stages_active Boolean
    compute='_compute_stages_active' export_string_translation=False
Public methods (3)
  • action_archive(self)
  • action_unarchive_project(self)
  • action_unlink(self)

New fields (4)
  • access_mode Selection
    default='read' help='Read: collaborators can view tasks but cannot edit them.\nEdit with limited access: collaborators can view and edit tasks they follow in the Kanban view.\nEdit: collaborators can view and edit all tasks in the Kanban view. Additionally, they can choose which tasks they want to follow.' required=True args: [('read', 'Read'), ('edit_limited', 'Edit with limited access'), ('edit', 'Edit')]
  • parent_wizard_id Many2one → project.share.wizard
    export_string_translation=False args: 'project.share.wizard'
  • partner_id Many2one → res.partner
    required=True string='Collaborator' args: 'res.partner'
  • send_invitation Boolean
    compute='_compute_send_invitation' default=True readonly=False store=True string='Send Invitation'
Public methods (0)

No public methods.

New fields (3)
  • collaborator_ids One2many → project.share.collaborator.wizard
    string='Collaborators' args: 'project.share.collaborator.wizard', 'parent_wizard_id'
  • existing_partner_ids Many2many → res.partner
    compute='_compute_existing_partner_ids' export_string_translation=False args: 'res.partner'
  • share_link Char
    help='Anyone with this link can access the project in read mode.' args: 'Public Link'
Public methods (4)
  • action_send_mail(self)
  • action_share_record(self)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
    @api.model

New fields (4)
  • color Integer
    default=_get_default_color help='Transparent tags are not visible in the kanban view of your projects and tasks.' string='Color'
  • name Char
    required=True translate=True args: 'Name'
  • project_ids Many2many → project.project
    export_string_translation=False string='Projects' args: 'project.project', 'project_project_project_tags_rel'
  • task_ids Many2many → project.task
    export_string_translation=False string='Tasks' args: 'project.task'
Public methods (5)
  • arrange_tag_list_by_id(self, tag_list, id_order)
    @api.model
    arrange_tag_list_by_id re-order a list of record values (dict) following a given id sequence complexity: O(n) param: - tag_list: ordered (by id) list of record values, each record being a dict containing at least an 'id' key - id_order: list of value (int) corresponding to the id of the records to re-arrange result: - Sorted list of record values (dict)
  • name_create(self, name)
    @api.model
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • search_read(self, domain=None, fields=None, offset=0, limit=None, order=None)
    @api.model

New fields (65)
  • active Boolean
    default=True export_string_translation=False
  • allocated_hours Float
    tracking=True args: 'Allocated Time'
  • allow_milestones Boolean
    export_string_translation=False related='project_id.allow_milestones'
  • allow_task_dependencies Boolean
    export_string_translation=False related='project_id.allow_task_dependencies'
  • attachment_ids One2many → ir.attachment
    compute='_compute_attachment_ids' export_string_translation=False help="Attachments that don't come from a message" string='Attachments' args: 'ir.attachment'
  • child_ids One2many → project.task
    domain="[('recurring_task', '=', False)]" export_string_translation=False string='Sub-tasks' args: 'project.task', 'parent_id'
  • closed_depend_on_count Integer
    compute='_compute_depend_on_count' compute_sudo=True string='Closed Depending on Tasks'
  • closed_subtask_count Integer
    compute='_compute_subtask_count' export_string_translation=False args: 'Closed Sub-tasks Count'
  • color Integer
    export_string_translation=False string='Color Index'
  • company_id Many2one → res.company
    compute='_compute_company_id' copy=True default=_default_company_id readonly=False recursive=True store=True string='Company' args: 'res.company'
  • create_date Datetime
    index=True readonly=True args: 'Created On'
  • current_user_same_company_partner Boolean
    compute='_compute_current_user_same_company_partner' compute_sudo=True export_string_translation=False
  • date_assign Datetime
    copy=False help='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.' readonly=True string='Assigning Date'
  • date_deadline Datetime
    index=True string='Deadline' tracking=True
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False help='Date on which the state of your task has last been modified.\nBased 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.' index=True readonly=True string='Last Stage Update'
  • depend_on_count Integer
    compute='_compute_depend_on_count' compute_sudo=True string='Depending on Tasks'
  • depend_on_ids Many2many → project.task
    column1='task_id' column2='depends_on_id' copy=False domain="[('project_id', '!=', False), ('id', '!=', id)]" relation='task_dependencies_rel' string='Blocked By' tracking=True args: 'project.task'
  • dependent_ids Many2many → project.task
    column1='depends_on_id' column2='task_id' copy=False domain="[('project_id', '!=', False), ('id', '!=', id)]" export_string_translation=False relation='task_dependencies_rel' string='Block' args: 'project.task'
  • dependent_tasks_count Integer
    compute='_compute_dependent_tasks_count' export_string_translation=False string='Dependent Tasks'
  • description Html
    sanitize_attributes=False string='Description'
  • display_follow_button Boolean
    compute='_compute_display_follow_button' compute_sudo=True export_string_translation=False
  • display_in_project Boolean
    compute='_compute_display_in_project' export_string_translation=False readonly=False store=True
  • display_name Char
    compute='_compute_display_name' help='Use these keywords in the title to set new tasks:\n\n #tags Set tags on the task\n @user Assign the task to a user\n !\xa0Set the task a high priority\n\n Make sure to use the right format and order\xa0e.g. Improve the configuration screen #feature #v16 @Mitchell !' inverse='_inverse_display_name' search='_search_display_name'
  • display_parent_task_button Boolean
    compute='_compute_display_parent_task_button' compute_sudo=True export_string_translation=False
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Cover Image' args: 'ir.attachment'
  • email_cc Char
    help='Email addresses that were in the CC of the incoming emails from this task and that are not currently linked to an existing customer.'
  • has_late_and_unreached_milestone Boolean
    compute='_compute_has_late_and_unreached_milestone' export_string_translation=False search='_search_has_late_and_unreached_milestone'
  • is_closed Boolean
    compute='_compute_is_closed' search='_search_is_closed' args: 'Closed state'
  • link_preview_name Char
    compute='_compute_link_preview_name' export_string_translation=False
  • milestone_id Many2one → project.milestone
    compute='_compute_milestone_id' domain="[('project_id', '=', project_id)]" help='Deliver your services automatically when a milestone is reached by linking it to a sales order item.' index='btree_not_null' readonly=False store=True tracking=True args: 'project.milestone', 'Milestone'
  • name Char
    index='trigram' required=True string='Title' tracking=True
  • parent_id Many2one → project.task
    domain="['!', ('id', 'child_of', id), ('project_id', '!=', False)]" index=True string='Parent Task' tracking=True args: 'project.task'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' domain="['|', ('company_id', '=?', company_id), ('company_id', '=', False)]" readonly=False recursive=True store=True string='Customer' tracking=True args: 'res.partner'
  • personal_stage_id Many2one → project.task.stage.personal
    compute='_compute_personal_stage_id' compute_sudo=False help="The current user's personal stage." string='Personal Stage State' args: 'project.task.stage.personal'
  • personal_stage_type_id Many2one → project.task.type
    compute='_compute_personal_stage_type_id' default=_default_personal_stage_type_id domain="[('user_id', '=', uid)]" help="The current user's personal task stage." inverse='_inverse_personal_stage_type_id' search='_search_personal_stage_type_id' store=False string='Personal Stage' args: 'project.task.type'
  • personal_stage_type_ids Many2many → project.task.type
    column1='task_id' column2='stage_id' copy=False domain="[('user_id', '=', uid)]" export_string_translation=False group_expand='_read_group_personal_stage_type_ids' ondelete='restrict' string='Personal Stages' args: 'project.task.type', 'project_task_user_rel'
  • portal_user_names Char
    compute='_compute_portal_user_names' compute_sudo=True export_string_translation=False search='_search_portal_user_names'
  • priority Selection
    default='0' index=True string='Priority' tracking=True args: [('0', 'Low'), ('1', 'High')]
  • project_id Many2one → project.project
    change_default=True compute='_compute_project_id' domain="['|', ('company_id', '=', False), ('company_id', '=?', company_id)]" index=True precompute=True readonly=False recursive=True store=True string='Project' tracking=True args: 'project.project'
  • project_privacy_visibility Selection
    related='project_id.privacy_visibility' string='Project Visibility' tracking=False
  • rating_active Boolean
    related='project_id.rating_active' string='Project Rating Status'
  • recurrence_id Many2one → project.task.recurrence
    copy=False args: 'project.task.recurrence'
  • recurring_count Integer
    compute='_compute_recurring_count' string='Tasks in Recurrence'
  • recurring_task Boolean
    string='Recurrent'
  • repeat_interval Integer
    compute='_compute_repeat' compute_sudo=True default=1 readonly=False string='Repeat Every'
  • repeat_type Selection
    compute='_compute_repeat' compute_sudo=True default='forever' readonly=False string='Until' args: [('forever', 'Forever'), ('until', 'Until')]
  • repeat_unit Selection
    compute='_compute_repeat' compute_sudo=True default='week' readonly=False args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    compute='_compute_repeat' compute_sudo=True readonly=False string='End Date'
  • sequence Integer
    default=10 export_string_translation=False string='Sequence'
  • show_display_in_project Boolean
    compute='_compute_show_display_in_project'
  • stage_id Many2one → project.task.type
    compute='_compute_stage_id' default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'project.task.type'
  • state Selection
    compute='_compute_state' copy=False default='01_in_progress' index=True inverse='_inverse_state' readonly=False recursive=True required=True store=True string='State' tracking=True args: [('01_in_progress', 'In Progress'), ('02_changes_requested', 'Changes Requested'), ('03_approved', 'Approved'), *CLOSED_STATES.items(), ('04_waiting_normal', 'Waiting')]
  • subtask_allocated_hours Float
    compute='_compute_subtask_allocated_hours' export_string_translation=False help='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.' args: 'Sub-tasks Allocated Time'
  • subtask_completion_percentage Float
    compute='_compute_subtask_completion_percentage' export_string_translation=False
  • subtask_count Integer
    compute='_compute_subtask_count' export_string_translation=False args: 'Sub-task Count'
  • tag_ids Many2many → project.tags
    string='Tags' args: 'project.tags'
  • task_properties Properties
    copy=True definition='project_id.task_properties_definition' args: 'Properties'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' context={'active_test': False} default=_default_user_ids domain="[('share', '=', False), ('active', '=', True)]" relation='project_task_user_rel' string='Assignees' tracking=True args: 'res.users'
  • website_message_ids One2many
    domain=<expr> export_string_translation=False
  • working_days_close Float
    aggregator='avg' compute='_compute_elapsed' store=True string='Working Days to Close'
  • working_days_open Float
    aggregator='avg' compute='_compute_elapsed' store=True string='Working Days to Assign'
  • working_hours_close Float
    aggregator='avg' compute='_compute_elapsed' digits=(16, 2) store=True string='Working Hours to Close'
  • working_hours_open Float
    aggregator='avg' compute='_compute_elapsed' digits=(16, 2) store=True string='Working Hours to Assign'
  • write_date Datetime
    readonly=True args: 'Last Updated On'
Public methods (38)
  • OPEN_STATES(self)
    @property
    Return a list of the technical names complementing the CLOSED_STATES, a.k.a the open states
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITABLE_FIELDS(self)
    @property
  • action_archive(self)
  • action_convert_to_subtask(self)
  • action_dependent_tasks(self)
  • action_open_parent_task(self)
  • action_open_ratings(self)
  • action_open_task(self)
  • action_project_sharing_open_blocking(self)
  • action_project_sharing_open_subtasks(self)
  • action_project_sharing_open_task(self)
  • action_project_sharing_recurring_tasks(self)
  • action_project_sharing_view_parent_task(self)
  • action_recurring_tasks(self)
  • action_redirect_to_project_task_form(self)
  • action_unlink_recurrence(self)
  • check_field_access_rights(self, operation, field_names)
    @api.model
  • copy(self, default=None)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, default_fields)
    @api.model
  • email_split(self, msg)
  • fields_get(self, allfields=None, attributes=None)
    @api.model
  • get_empty_list_help(self, help)
    @api.model
  • get_mention_suggestions(self, search, limit=8)
    Return the 'limit'-first followers of the given task or followers of its project matching a 'search' string as a list of partner data (returned by `_to_store()`). See similar method for all partners `get_mention_suggestions()`.
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • is_blocked_by_dependences(self)
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
    Set task notification based on project notification preference if user follow the project
  • message_update(self, msg, update_vals=None)
    Override to update the task according to the email.
  • project_sharing_toggle_is_follower(self)
  • rating_apply(self, rate, token=None, rating=None, feedback=None, subtype_xmlid=None, notify_delay_send=False)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • stage_find(self, section_id, domain=[], order='sequence, id')
    Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • unlink(self)
  • update_date_end(self, stage_id)
  • write(self, vals)

New fields (13)
  • allocated_hours Float
    readonly=True string='Allocated Time'
  • date Datetime
    readonly=True args: 'Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_last_stage_update Date
    readonly=True string='Last Stage Update'
  • is_closed Selection
    readonly=True string='Closing Stage' args: [('closed', 'Closed tasks'), ('open', 'Open tasks')]
  • milestone_id Many2one → project.milestone
    readonly=True args: 'project.milestone'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • project_id Many2one → project.project
    readonly=True args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True args: 'project.task.type'
  • state Selection
    readonly=True string='State' args: [('01_in_progress', 'In Progress'), ('1_done', 'Done'), ('04_waiting_normal', 'Waiting'), ('03_approved', 'Approved'), ('1_canceled', 'Cancelled'), ('02_changes_requested', 'Changes Requested')]
  • tag_ids Many2many → project.tags
    column1='project_task_id' column2='project_tags_id' readonly=True relation='project_tags_project_task_rel' string='Tags' args: 'project.tags'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
Public methods (1)
  • task_specific_fields(self)
    @property

New fields (5)
  • repeat_interval Integer
    default=1 string='Repeat Every'
  • repeat_type Selection
    default='forever' string='Until' args: [('forever', 'Forever'), ('until', 'Until')]
  • repeat_unit Selection
    default='week' export_string_translation=False args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    string='End Date'
  • task_ids One2many → project.task
    copy=False args: 'project.task', 'recurrence_id'
Public methods (0)

No public methods.

New fields (3)
  • stage_id Many2one → project.task.type
    domain="[('user_id', '=', user_id)]" export_string_translation=False ondelete='set null' args: 'project.task.type'
  • task_id Many2one → project.task
    export_string_translation=False index=True ondelete='cascade' required=True args: 'project.task'
  • user_id Many2one → res.users
    export_string_translation=False index=True ondelete='cascade' required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (10)
  • active Boolean
    default=True export_string_translation=False args: 'Active'
  • auto_validation_state Boolean
    default=False help="Automatically modify the state when the customer replies to the feedback for this stage.\n * Good feedback from the customer will update the state to 'Approved' (green bullet).\n * Neutral or bad feedback will set the kanban state to 'Changes Requested' (orange bullet).\n" args: 'Automatic Kanban Status'
  • disabled_rating_warning Text
    compute='_compute_disabled_rating_warning' export_string_translation=False
  • fold Boolean
    string='Folded in Kanban'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set, an email will be automatically sent to the customer when the task reaches this stage.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Name' translate=True
  • project_ids Many2many → project.project
    default=<expr> help='Projects in which this stage is present. If you follow a similar workflow in several projects, you can share this stage among them and get consolidated information this way.' string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • rating_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help="If set, a rating request will automatically be sent by email to the customer when the task reaches this stage. \nAlternatively, it will be sent at a regular interval as long as the task remains in this stage, depending on the configuration of your project. \nTo use this feature make sure that the 'Customer Ratings' option is enabled on your project." string='Rating Email Template' args: 'mail.template'
  • sequence Integer
    default=1
  • user_id Many2one → res.users
    compute='_compute_user_id' default=_default_user_id index=True store=True args: 'res.users', 'Stage Owner'
Public methods (4)
  • copy_data(self, default=None)
  • toggle_active(self)
  • unlink_wizard(self, stage_view=False)
  • write(self, vals)

New fields (4)
  • project_ids Many2many → project.project
    domain="['|', ('active', '=', False), ('active', '=', True)]" export_string_translation=False ondelete='cascade' string='Projects' args: 'project.project'
  • stage_ids Many2many → project.task.type
    export_string_translation=False ondelete='cascade' string='Stages To Delete' args: 'project.task.type'
  • stages_active Boolean
    compute='_compute_stages_active' export_string_translation=False
  • tasks_count Integer
    compute='_compute_tasks_count' export_string_translation=False args: 'Number of Tasks'
Public methods (4)
  • action_archive(self)
  • action_confirm(self)
  • action_unarchive_task(self)
  • action_unlink(self)

New fields (13)
  • closed_task_count Integer
    export_string_translation=False readonly=True args: 'Closed Task Count'
  • closed_task_percentage Integer
    compute='_compute_closed_task_percentage' export_string_translation=False args: 'Closed Task Percentage'
  • color Integer
    compute='_compute_color' export_string_translation=False
  • date Date
    default=fields.Date.context_today tracking=True
  • description Html
  • name Char
    required=True tracking=True args: 'Title'
  • name_cropped Char
    compute='_compute_name_cropped' export_string_translation=False
  • progress Integer
    tracking=True
  • progress_percentage Float
    compute='_compute_progress_percentage' export_string_translation=False
  • project_id Many2one → project.project
    export_string_translation=False required=True args: 'project.project'
  • status Selection
    export_string_translation=False required=True selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold'), ('done', 'Done')] tracking=True
  • task_count Integer
    export_string_translation=False readonly=True args: 'Task Count'
  • user_id Many2one → res.users
    default=<expr> required=True string='Author' args: 'res.users'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
  • unlink(self)

New fields (31)
  • active Boolean
    readonly=True
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • create_date Datetime
    readonly=True args: 'Create Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Datetime
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • delay_endings_days Float
    aggregator='avg' digits=(16, 2) readonly=True string='Days to Deadline'
  • dependent_ids Many2many → project.task
    column1='depends_on_id' column2='task_id' domain="[('allow_task_dependencies', '=', True), ('id', '!=', id)]" readonly=True relation='task_dependencies_rel' string='Block' args: 'project.task'
  • description Text
    readonly=True
  • is_closed Boolean
    readonly=True string='Closed state'
  • message_is_follower Boolean
    related='task_id.message_is_follower'
  • milestone_id Many2one → project.milestone
    readonly=True args: 'project.milestone'
  • name Char
    readonly=True string='Task'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • parent_id Many2one → project.task
    readonly=True string='Parent Task' args: 'project.task'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • personal_stage_type_ids Many2many → project.task.type
    column1='task_id' column2='stage_id' readonly=True relation='project_task_user_rel' string='Personal Stage' args: 'project.task.type'
  • priority Selection
    readonly=True string='Priority' args: [('0', 'Low'), ('1', 'High')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • rating_avg Float
    aggregator='avg' groups='project.group_project_rating' readonly=True args: 'Average Rating (1-5)'
  • rating_last_value Float
    aggregator='avg' groups='project.group_project_rating' readonly=True args: 'Last Rating (1-5)'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='State' args: [('01_in_progress', 'In Progress'), ('1_done', 'Done'), ('04_waiting_normal', 'Waiting'), ('03_approved', 'Approved'), ('1_canceled', 'Cancelled'), ('02_changes_requested', 'Changes Requested')]
  • tag_ids Many2many → project.tags
    column1='project_task_id' column2='project_tags_id' readonly=True relation='project_tags_project_task_rel' string='Tags' args: 'project.tags'
  • task_id Many2one → project.task
    readonly=True string='Tasks' args: 'project.task'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
  • working_days_close Float
    aggregator='avg' digits=(16, 2) readonly=True string='Working Days to Close'
  • working_days_open Float
    aggregator='avg' digits=(16, 2) readonly=True string='Working Days to Assign'
  • working_hours_close Float
    aggregator='avg' digits=(16, 2) readonly=True string='Working Hours to Close'
  • working_hours_open Float
    aggregator='avg' digits=(16, 2) readonly=True string='Working Hours to Assign'
Public methods (1)
  • init(self)

New fields (6)
  • group_project_milestone Boolean
    group='base.group_portal,base.group_user' implied_group='project.group_project_milestone' args: 'Milestones'
  • group_project_rating Boolean
    implied_group='project.group_project_rating' args: 'Customer Ratings'
  • group_project_recurring_tasks Boolean
    group='base.group_portal,base.group_user' implied_group='project.group_project_recurring_tasks' args: 'Recurring Tasks'
  • group_project_stages Boolean
    implied_group='project.group_project_stages' args: 'Project Stages'
  • group_project_task_dependencies Boolean
    implied_group='project.group_project_task_dependencies' args: 'Task Dependencies'
  • module_hr_timesheet Boolean
    string='Task Logs'
Public methods (1)
  • set_values(self)

New fields (3)
  • project_ids One2many → project.project
    export_string_translation=False string='Projects' args: 'project.project', 'partner_id'
  • task_count Integer
    compute='_compute_task_count' export_string_translation=False string='# Tasks'
  • task_ids One2many → project.task
    export_string_translation=False string='Tasks' args: 'project.task', 'partner_id'
Public methods (1)
  • action_view_tasks(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/project
VERSION
VERSION 1.3
CATEGORY
CATEGORYServices/Project
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Xavier ALT, Christophe Simonis, Xavier Morel, Nicolas Lempereur, Géry Debongnie, Aaron Bohy, GitHub, Damien Bouvy, Barad Mahendra, Yannick Tivisse, qsm-odoo, Odoo Online, Pierre Masereel, Romain Derie, Adrien Dieudonne, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Toufik Ben Jaa, Romeo Fragomeli, Victor Feyens, Adrien Dieudonné, Sébastien Theys, Joseph Caburnay, Julien Mougenot, Samuel Degueldre, std-odoo, Nasreddin Boulif (bon), Prakash Prajapati, Tiffany Chang (tic), Rémy Voet (ryv), Pierre Rousseau, Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, William Braeckman, Romain Estievenart, odoo, Xavier BOL (xbo), Benoit Socias, Hubert Van de Walle (huvw), william-andre, MerlinGuillaume, Audric Onockx (auon), Abdelouahab (abla), Nicolas Bayet, Jinjiu Liu, Laurent Stukkens (LTU), Hubert Van De Walle, luvi, Valentin Chevalier, Renaud Thiry, Vincent Larcin, niyasraphy, damr, Thomas Lefebvre (thle), alsh-odoo, Gaetan Vanden Bergh (gavb), Louis Wicket (wil), Walid, Adrien Widart (awt), Gurupreet Singh, Victor Piryns (pivi), Yash Vaishnav, miad-odoo, maximilien(malb), Pierre-Yves Dufays, pash-odoo, Levi Siuzdak (sile), Dylan Kiss (dyki), Sébastien Geelen (sge), Bruno Boi, Kamlesh Pathekar, Pratik Awasthi, FrancoisGe, Michael (mcm), paso-odoo, Odoo, prye-odoo, Adrien Schoffeniels, Raouf, Kartik Chavda, Hugo Carlier (Huca), Xavier Bol (xbo), Brieuc-brd, Renilkumar Kajavadra, Nguyễn Đại Dương, Sarah Bellefroid, ilru-odoo, Andrzej(pian), Giang Pham, Astik Singh, ravb-odoo, Youssef Bashandy, Ethan Vincent, lase@odoo.com, bary, Maryam Kia, Eteil Djoumatchoua (etdj), Maxime de Neuville, Abderraouf Ghrissi (abgh), Nathaniel (naja), det, Julien Carion (juca), kcv-odoo, mega, Tanguy Quéguineur, Ritika Rathore, Julien Segers (juse), Louis Gobert, dise, Chrysanthe (chgo), shsa-odoo, sami odoo, Louis (wil), Adesh Jolhe (adjo), mano-odoo, kais-odoo, Elisabeth Dickinson, mash, Antoine (anso), Manushi Shah, Abdessamad Zouiten (abzo), luve-odoo, Ian, Michaël Mattiello, Pierre Pulinckx (pipu), Dhrumil Shah, fdardenne, Bastien PIERRE, K Theja (kthe), AnhBT, Aman Patel, kpt-odoo, ska-ibees, Raja Prasad, hiroh-odoo, Panagiotis Kyriakou, yame-odoo, Bastien (bvdn), nsirjacobs, lakhichand borse, mjvi-odoo, bhra-odoo, dise-odoo, Soncrits, suresh badikala, shiyam kumar, padh-odoo, Shubham Patel, Maxime de Neuville (mane), Yashkumar Vaishnav, Aurélien Bertrand, rapa, arpr-odoo, damrOdoo, mibav-odoo, abbhi-Odoo, Rohit Kumar
WEBSITE
WEBSITEhttps://www.odoo.com/app/project
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:09
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - analytic
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - rating
    - resource
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (109)
XML IDNameModelTypeStatus
account_analytic_account_view_form_inherit account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
digest_digest_view_form digest.digest.view.form.inherit.project.task digest.digest xpath Inherits digest.digest_digest_view_form
edit_project project.project.form project.project form New
mail_activity_plan_view_form_project_and_task mail.activity.plan.view.form.project.and.task mail.activity.plan xpath Inherits mail.mail_activity_plan_view_form
open_view_all_tasks_list_view open.view.all.tasks.list.view project.task tree Inherits view_task_tree2
open_view_my_tasks_list_view open.view.my.tasks.list.view project.task tree Inherits view_task_tree2
personal_task_type_edit project.task.type.form project.task.type form New
portal_layout Portal layout: project menu entry ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home Show Projects / Tasks ir.ui.view qweb Inherits portal.portal_my_home
portal_my_project My Project ir.ui.view qweb New
portal_my_projects My Projects ir.ui.view qweb New
portal_my_task My Task ir.ui.view qweb Inherits portal.portal_sidebar
portal_my_task_allocated_hours_template portal_my_task_allocated_hours_template ir.ui.view qweb New
portal_my_tasks My Tasks ir.ui.view qweb New
portal_my_tasks_priority_widget_template Priority Widget Template ir.ui.view qweb New
portal_my_tasks_state_widget_template Status Widget Template ir.ui.view qweb New
portal_tasks_list Tasks List ir.ui.view qweb New
project.milestone_deadline project.milestone_deadline ir.ui.view qweb New
project_collaborator_view_search project.collaborator.view.search project.collaborator search New
project_kanban_view_group_stage project.project.kanban.group.stage project.project xpath Inherits view_project_kanban
project_list_view_group_stage project.project.tree.group.stage project.project tree Inherits view_project
project_message_user_assigned project_message_user_assigned ir.ui.view qweb New
project_milestone_view_form project.milestone.view.form project.milestone form New
project_milestone_view_tree project.milestone.view.tree project.milestone tree New
project_project_stage_view_form project.project.stage.view.form project.project.stage form New
project_project_stage_view_form_quick_create project.project.stage.view.form.quick.create project.project.stage form New
project_project_stage_view_kanban project.project.stage.view.kanban project.project.stage kanban New
project_project_stage_view_search project.project.stage.view.search project.project.stage search New
project_project_stage_view_tree project.project.stage.view.tree project.project.stage tree New
project_project_view_activity project.project.view.activity project.project activity New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_project_view_form_simplified_footer project.project.view.form.simplified project.project xpath Inherits project.project_project_view_form_simplified
project_share_wizard_confirm_form project.share.wizard.view.form project.share.wizard form New
project_share_wizard_view_form project.share.wizard.view.form project.share.wizard form New
project_sharing Project Sharing View ir.ui.view qweb New
project_sharing_access_view_tree project.collaborator.view.tree project.collaborator tree New
project_sharing_embed Project Sharing View Embed ir.ui.view qweb New
project_sharing_portal My Project ir.ui.view qweb New
project_sharing_project_task_view_form project.sharing.project.task.view.form project.task form New
project_sharing_project_task_view_kanban project.sharing.project.task.view.kanban project.task kanban New
project_sharing_project_task_view_search project.task.search.form project.task search Inherits project.view_task_search_form_project_base
project_sharing_project_task_view_tree project.sharing.project.task.tree project.task tree Inherits project_task_view_tree_main_base
project_sharing_quick_create_task_form project.task.form.quick_create project.task form New
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
project_tags_tree_view Tags project.tags tree New
project_task_burndown_chart_report_view_graph project.task.burndown.chart.report.view.graph project.task.burndown.chart.report graph New
project_task_burndown_chart_report_view_search project.task.burndown.chart.report.view.search project.task.burndown.chart.report search New
project_task_convert_to_subtask_view_form project.task.convert.to.subtask.form project.task form New
project_task_view_activity project.task.activity project.task activity New
project_task_view_tree_base project.task.view.tree.base project.task tree Inherits project_task_view_tree_main_base
project_task_view_tree_main_base project.task.view.tree.main.base project.task tree New
project_update_default_description Project Update Description ir.ui.view qweb New
project_update_view_form project.update.view.form project.update form New
project_update_view_kanban project.update.view.kanban project.update kanban New
project_update_view_search project.update.view.search project.update search New
project_update_view_tree project.update.view.tree project.update tree New
project_view_kanban project.project.kanban project.project kanban New
project_view_kanban_inherit_project project.kanban.inherit.project project.project xpath Inherits project.view_project_kanban
quick_create_project_form project.form.quick_create project.project form New
quick_create_task_form project.task.form.quick_create project.task form New
quick_create_task_form_inherit_view_default_project project.task.form.quick.create.sale.order.inherited project.task field Inherits quick_create_task_form
rating_rating_project_view_kanban rating.rating.kanban.project rating.rating xpath Inherits rating.rating_rating_view_kanban
rating_rating_view_form_project rating.rating.form.project rating.rating xpath Inherits rating.rating_rating_view_form_text
rating_rating_view_graph rating.rating.view.graph.project rating.rating xpath Inherits rating.rating_rating_view_graph
rating_rating_view_pivot rating.rating.view.pivot.project rating.rating xpath Inherits rating.rating_rating_view_pivot
rating_rating_view_search_project rating.rating.search.project rating.rating xpath Inherits rating.rating_rating_view_search
rating_rating_view_tree_project rating.rating.tree.project rating.rating field Inherits rating.rating_rating_view_tree
res_config_settings_view_form res.config.settings.view.form.inherit.project res.config.settings xpath Inherits base.res_config_settings_view_form
task_link_preview_front_end task_link_preview_front_end ir.ui.view qweb Inherits portal.frontend_layout
task_link_preview_portal_layout task_link_preview_portal_layout ir.ui.view qweb Inherits portal.portal_layout
task_track_depending_tasks task_track_depending_tasks ir.ui.view qweb New
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
task_type_tree_inherited project.task.type.tree.inherited project.task.type xpath Inherits task_type_tree
view_project project.project.tree project.project tree New
view_project_calendar project.project.calendar project.project calendar New
view_project_config project.project.tree.config project.project xpath Inherits project.view_project
view_project_config_group_stage project.project.tree.config.group.stage project.project tree Inherits view_project_config
view_project_config_kanban project.kanban.inherit.config.project project.project xpath Inherits view_project_kanban
view_project_config_kanban_group_stage project.kanban.inherit.config.project.group.stage project.project xpath Inherits view_project_config_kanban
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_project_stage_delete_wizard project.project.stage.delete.wizard.form project.project.stage.delete.wizard form New
view_project_project_stage_unarchive_wizard project.project.stage.delete.wizard.form project.project.stage.delete.wizard form New
view_project_task_graph project.task.graph project.task graph New
view_project_task_pivot project.task.pivot project.task pivot New
view_project_task_pivot_inherit project.task.pivot.inherit project.task xpath Inherits project.view_project_task_pivot
view_project_task_type_delete_confirmation_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_delete_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_kanban project.task.type.kanban project.task.type kanban New
view_project_task_type_unarchive_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_task_all_calendar project.task.all.calendar project.task xpath Inherits view_task_calendar
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_kanban project.task.kanban project.task kanban New
view_task_kanban_inherit_all_task project.task.kanban.inherit.all.task project.task xpath Inherits view_task_kanban
view_task_kanban_inherit_my_task project.task.kanban.inherit.my.task project.task xpath Inherits view_task_kanban
view_task_kanban_inherit_view_default_project project.task.kanban.sale.order project.task kanban Inherits view_task_kanban
view_task_partner_info_form res.partner.task.buttons res.partner div Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search Inherits project.view_task_search_form_project_fsm_base
view_task_search_form project.task.search.form project.task filter Inherits view_task_search_form_project_base
view_task_search_form_base project.task.search.form project.task search New
view_task_search_form_project_base project.task.search.form.project.base project.task filter Inherits view_task_search_form_project_fsm_base
view_task_search_form_project_fsm_base project.task.search.form.project.base project.task field Inherits view_task_search_form_base
view_task_tree2 project.task.tree project.task tree Inherits project_task_view_tree_base
Models touched (24)

New fields (2)
  • project_count Integer
    compute='_compute_project_count' args: 'Project Count'
  • project_ids One2many → project.project
    string='Projects' args: 'project.project', 'analytic_account_id'
Public methods (1)
  • action_view_projects(self)

New fields (2)
  • kpi_project_task_opened Boolean
    args: 'Open Tasks'
  • kpi_project_task_opened_value Integer
    compute='_compute_project_task_opened_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • init(self)

New fields (3)
  • partner_email Char
    related='partner_id.email'
  • partner_id Many2one → res.partner
    readonly=True required=True args: 'res.partner', 'Collaborator'
  • project_id Many2one → project.project
    domain=[('privacy_visibility', '=', 'portal')] readonly=True required=True args: 'project.project', 'Project Shared'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • unlink(self)

New fields (11)
  • can_be_marked_as_done Boolean
    compute='_compute_can_be_marked_as_done' groups='project.group_project_milestone'
  • deadline Date
    copy=False tracking=True
  • done_task_count Integer
    compute='_compute_task_count' groups='project.group_project_milestone' args: '# of Done Tasks'
  • is_deadline_exceeded Boolean
    compute='_compute_is_deadline_exceeded'
  • is_deadline_future Boolean
    compute='_compute_is_deadline_future'
  • is_reached Boolean
    copy=False default=False string='Reached'
  • name Char
    required=True
  • project_id Many2one → project.project
    default=_get_default_project_id ondelete='cascade' required=True args: 'project.project'
  • reached_date Date
    compute='_compute_reached_date' store=True
  • task_count Integer
    compute='_compute_task_count' groups='project.group_project_milestone' args: '# of Tasks'
  • task_ids One2many → project.task
    args: 'project.task', 'milestone_id', 'Tasks'
Public methods (3)
  • action_view_tasks(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • toggle_is_reached(self, is_reached)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (48)
  • access_instruction_message Char
    compute='_compute_access_instruction_message' args: 'Access Instruction Message'
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the project without removing it.'
  • alias_id Many2one
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).'
  • allow_milestones Boolean
    default=<expr> args: 'Milestones'
  • allow_rating Boolean
    compute='_compute_allow_rating' default=<expr> args: 'Allow Customer Ratings'
  • allow_task_dependencies Boolean
    default=<expr> inverse='_inverse_allow_task_dependencies' args: 'Task Dependencies'
  • analytic_account_balance Monetary
    related='analytic_account_id.balance'
  • analytic_account_id Many2one → account.analytic.account
    check_company=True copy=False domain="['|', ('company_id', '=', False), ('company_id', '=?', company_id)]" help='Analytic account to which this project, its tasks and its timesheets are linked. \nTrack the costs and revenues of your project by setting this analytic account on your related documents (e.g. sales orders, invoices, purchase orders, vendor bills, expenses etc.).\nThis analytic account can be changed on each task individually if necessary.\nAn analytic account is required in order to use timesheets.' ondelete='set null' string='Analytic Account' args: 'account.analytic.account'
  • closed_task_count Integer
    compute='_compute_task_count' string='Closed Task Count'
  • collaborator_count Integer
    compute='_compute_collaborator_count' compute_sudo=True args: '# Collaborators'
  • collaborator_ids One2many → project.collaborator
    copy=False string='Collaborators' args: 'project.collaborator', 'project_id'
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    compute='_compute_company_id' inverse='_inverse_company_id' readonly=False store=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    compute='_compute_currency_id' readonly=True string='Currency' args: 'res.currency'
  • date Date
    help='Date on which this project ends. The timeframe defined on the project is taken into account when viewing its planning.' index=True string='Expiration Date' tracking=True
  • date_start Date
    string='Start Date'
  • description Html
    help='Description to provide more information and context about this project'
  • doc_count Integer
    compute='_compute_attached_docs_count' string='Number of documents attached'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' compute_sudo=True inverse='_inverse_is_favorite' search='_search_is_favorite' string='Show Project on Dashboard'
  • is_milestone_exceeded Boolean
    compute='_compute_is_milestone_exceeded' search='_search_is_milestone_exceeded'
  • label_tasks Char
    default=<expr> help='Name used to refer to the tasks of your project e.g. tasks, tickets, sprints, etc...' string='Use Tasks as' translate=True
  • last_update_color Integer
    compute='_compute_last_update_color'
  • last_update_id Many2one → project.update
    copy=False string='Last Update' args: 'project.update'
  • last_update_status Selection
    compute='_compute_last_update_status' default='to_define' readonly=False required=True selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold'), ('to_define', 'Set Status'), ('done', 'Done')] store=True
  • milestone_count Integer
    compute='_compute_milestone_count' groups='project.group_project_milestone'
  • milestone_count_reached Integer
    compute='_compute_milestone_reached_count' groups='project.group_project_milestone'
  • milestone_ids One2many → project.milestone
    args: 'project.milestone', 'project_id'
  • name Char
    default_export_compatible=True index='trigram' required=True tracking=True translate=True args: 'Name'
  • open_task_count Integer
    compute='_compute_task_count' string='Open Task Count'
  • partner_id Many2one → res.partner
    auto_join=True domain="['|', ('company_id', '=?', company_id), ('company_id', '=', False)]" string='Customer' tracking=True args: 'res.partner'
  • privacy_visibility Selection
    default='portal' help='People to whom this project and its tasks will be visible.\n\n- Invited internal users: when following a project, internal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n A user with the project > administrator access right level can still access this project and its tasks, even if they are not explicitly part of the followers.\n\n- All internal users: all internal users can access the project and all of its tasks without distinction.\n\n- Invited portal users and all internal users: all internal users can access the project and all of its tasks without distinction.\nWhen following a project, portal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n\nWhen a project is shared in read-only, the portal user is redirected to their portal. They can view the tasks, but not edit them.\nWhen a project is shared in edit, the portal user is redirected to the kanban and list views of the tasks. They can modify a selected number of fields on the tasks.\n\nIn any case, an internal user with no project access rights can still access a task, provided that they are given the corresponding URL (and that they are part of the followers if the project is private).' required=True string='Visibility' args: [('followers', 'Invited internal users (private)'), ('employees', 'All internal users'), ('portal', 'Invited portal users and all internal users (public)')]
  • privacy_visibility_warning Char
    compute='_compute_privacy_visibility_warning' args: 'Privacy Visibility Warning'
  • rating_active Boolean
    default=<expr> args: 'Customer Ratings'
  • rating_request_deadline Datetime
    compute='_compute_rating_request_deadline' store=True
  • rating_status Selection
    default='stage' help='Collect feedback from your customers by sending them a rating request when a task enters a certain stage. To do so, define a rating email template on the corresponding stages.\nRating when changing stage: an email will be automatically sent when the task reaches the stage on which the rating email template is set.\nPeriodic rating: an email will be automatically sent at regular intervals as long as the task remains in the stage in which the rating email template is set.' required=True args: [('stage', 'when reaching a given stage'), ('periodic', 'on a periodic basis')], 'Customer Ratings Status'
  • rating_status_period Selection
    default='monthly' required=True args: [('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a Month'), ('monthly', 'Once a Month'), ('quarterly', 'Quarterly'), ('yearly', 'Yearly')], 'Rating Frequency'
  • resource_calendar_id Many2one → resource.calendar
    compute='_compute_resource_calendar_id' string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10
  • stage_id Many2one → project.project.stage
    copy=False default=_default_stage_id group_expand='_read_group_stage_ids' groups='project.group_project_stages' index=True ondelete='restrict' string='Stage' tracking=True args: 'project.project.stage'
  • tag_ids Many2many → project.tags
    relation='project_project_project_tags_rel' string='Tags' args: 'project.tags'
  • task_count Integer
    compute='_compute_task_count' string='Task Count'
  • task_ids One2many → project.task
    domain=<expr> string='Tasks' args: 'project.task', 'project_id'
  • task_properties_definition PropertiesDefinition
    args: 'Task Properties'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • update_ids One2many → project.update
    args: 'project.update', 'project_id'
  • user_id Many2one → res.users
    default=<expr> string='Project Manager' tracking=True args: 'res.users'
Public methods (20)
  • action_get_list_view(self)
  • action_profitability_items(self, section_name, domain=None, res_id=False)
  • action_project_sharing(self)
  • action_project_task_burndown_chart_report(self)
  • action_project_timesheets(self)
  • action_view_all_rating(self)
    return the action to see all the rating of the project and activate default filters
  • action_view_tasks(self)
  • action_view_tasks_analysis(self)
    return the action to see the tasks analysis report of the project
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals_list)
    @api.model_create_multi
  • get_last_update_or_default(self)
  • get_milestones(self)
  • get_panel_data(self)
  • map_tasks(self, new_project_id)
    copy and map tasks from old to new project
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
    Subscribe to newly created task but not all existing active task when subscribing to a project. User update notification preference of project its propagated to all the tasks that the user is currently following.
  • name_create(self, name)
    @api.model
  • project_update_all_action(self)
  • toggle_favorite(self)
  • unlink(self)
  • write(self, vals)

New fields (6)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    string='Company' args: 'res.company'
  • fold Boolean
    help='If enabled, this stage will be displayed as folded in the Kanban view of your projects. Projects in a folded stage are considered as closed.' args: 'Folded in Kanban'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.project')] help='If set, an email will be automatically sent to the customer when the project reaches this stage.' string='Email Template' args: 'mail.template'
  • name Char
    required=True translate=True
  • sequence Integer
    default=50
Public methods (4)
  • copy(self, default=None)
  • toggle_active(self)
  • unlink_wizard(self, stage_view=False)
  • write(self, vals)

New fields (3)
  • projects_count Integer
    compute='_compute_projects_count' args: 'Number of Projects'
  • stage_ids Many2many → project.project.stage
    context={'active_test': False} ondelete='cascade' string='Stages To Delete' args: 'project.project.stage'
  • stages_active Boolean
    compute='_compute_stages_active'
Public methods (3)
  • action_archive(self)
  • action_unarchive_project(self)
  • action_unlink(self)

New fields (2)
  • access_mode Selection
    args: [('read', 'Readonly'), ('edit', 'Edit')]
  • display_access_mode Boolean
Public methods (3)
  • action_send_mail(self)
  • action_share_record(self)
  • default_get(self, fields)
    @api.model

New fields (4)
  • color Integer
    default=_get_default_color help='Transparent tags are not visible in the kanban view of your projects and tasks.' string='Color'
  • name Char
    required=True translate=True args: 'Name'
  • project_ids Many2many → project.project
    string='Projects' args: 'project.project', 'project_project_project_tags_rel'
  • task_ids Many2many → project.task
    string='Tasks' args: 'project.task'
Public methods (4)
  • arrange_tag_list_by_id(self, tag_list, id_order)
    @api.model
    arrange_tag_list_by_id re-order a list of record values (dict) following a given id sequence complexity: O(n) param: - tag_list: ordered (by id) list of record values, each record being a dict containing at least an 'id' key - id_order: list of value (int) corresponding to the id of the records to re-arrange result: - Sorted list of record values (dict)
  • name_create(self, name)
    @api.model
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • search_read(self, domain=None, fields=None, offset=0, limit=None, order=None)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (58)
  • active Boolean
    default=True
  • allocated_hours Float
    tracking=True args: 'Allocated Time'
  • allow_milestones Boolean
    related='project_id.allow_milestones'
  • allow_task_dependencies Boolean
    related='project_id.allow_task_dependencies'
  • analytic_account_id Many2one → account.analytic.account
    compute='_compute_analytic_account_id' domain="[('company_id', '=?', company_id)]" help='Analytic account to which this task and its timesheets are linked.\nTrack the costs and revenues of your task by setting its analytic account on your related documents (e.g. sales orders, invoices, purchase orders, vendor bills, expenses etc.).\nBy default, the analytic account of the project is set. However, it can be changed on each task individually if necessary.' ondelete='set null' readonly=False store=True args: 'account.analytic.account'
  • attachment_ids One2many → ir.attachment
    compute='_compute_attachment_ids' help="Attachments that don't come from a message." string='Main Attachments' args: 'ir.attachment'
  • child_ids One2many → project.task
    domain="[('recurring_task', '=', False)]" string='Sub-tasks' args: 'project.task', 'parent_id'
  • closed_subtask_count Integer
    compute='_compute_subtask_count' args: 'Closed Sub-tasks Count'
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    compute='_compute_company_id' copy=True default=_default_company_id readonly=False recursive=True store=True string='Company' args: 'res.company'
  • create_date Datetime
    index=True readonly=True args: 'Created On'
  • date_assign Datetime
    copy=False help='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.' readonly=True string='Assigning Date'
  • date_deadline Datetime
    index=True string='Deadline' tracking=True
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False help='Date on which the state of your task has last been modified.\nBased 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.' index=True readonly=True string='Last Stage Update'
  • depend_on_ids Many2many → project.task
    column1='task_id' column2='depends_on_id' copy=False domain="[('project_id', '!=', False), ('id', '!=', id)]" relation='task_dependencies_rel' string='Blocked By' tracking=True args: 'project.task'
  • dependent_ids Many2many → project.task
    column1='depends_on_id' column2='task_id' copy=False domain="[('project_id', '!=', False), ('id', '!=', id)]" relation='task_dependencies_rel' string='Block' args: 'project.task'
  • dependent_tasks_count Integer
    compute='_compute_dependent_tasks_count' string='Dependent Tasks'
  • description Html
    sanitize_attributes=False string='Description'
  • display_in_project Boolean
    default=True readonly=True
  • display_name Char
    compute='_compute_display_name' help='Use these keywords in the title to set new tasks:\n\n #tags Set tags on the task\n @user Assign the task to a user\n !\xa0Set the task a high priority\n\n Make sure to use the right format and order\xa0e.g. Improve the configuration screen #feature #v16 @Mitchell !' inverse='_inverse_display_name'
  • display_parent_task_button Boolean
    compute='_compute_display_parent_task_button' compute_sudo=True
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Cover Image' args: 'ir.attachment'
  • email_cc Char
    help='Email addresses that were in the CC of the incoming emails from this task and that are not currently linked to an existing customer.'
  • has_late_and_unreached_milestone Boolean
    compute='_compute_has_late_and_unreached_milestone' search='_search_has_late_and_unreached_milestone'
  • milestone_id Many2one → project.milestone
    compute='_compute_milestone_id' domain="[('project_id', '=', project_id)]" help='Deliver your services automatically when a milestone is reached by linking it to a sales order item.' index='btree_not_null' readonly=False store=True tracking=True args: 'project.milestone', 'Milestone'
  • name Char
    index='trigram' required=True string='Title' tracking=True
  • parent_id Many2one → project.task
    domain="['!', ('id', 'child_of', id), ('project_id', '!=', False)]" index=True string='Parent Task' tracking=True args: 'project.task'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' domain="['|', ('company_id', '=?', company_id), ('company_id', '=', False)]" readonly=False recursive=True store=True string='Customer' tracking=True args: 'res.partner'
  • personal_stage_id Many2one → project.task.stage.personal
    compute='_compute_personal_stage_id' compute_sudo=False help="The current user's personal stage." string='Personal Stage State' args: 'project.task.stage.personal'
  • personal_stage_type_id Many2one → project.task.type
    compute='_compute_personal_stage_type_id' default=_default_personal_stage_type_id domain="[('user_id', '=', uid)]" help="The current user's personal task stage." inverse='_inverse_personal_stage_type_id' search='_search_personal_stage_type_id' store=False string='Personal Stage' args: 'project.task.type'
  • personal_stage_type_ids Many2many → project.task.type
    column1='task_id' column2='stage_id' copy=False depends=['user_ids'] domain="[('user_id', '=', user.id)]" group_expand='_read_group_personal_stage_type_ids' ondelete='restrict' string='Personal Stages' args: 'project.task.type', 'project_task_user_rel'
  • portal_user_names Char
    compute='_compute_portal_user_names' compute_sudo=True search='_search_portal_user_names'
  • priority Selection
    default='0' index=True string='Priority' tracking=True args: [('0', 'Low'), ('1', 'High')]
  • project_id Many2one → project.project
    change_default=True domain="['|', ('company_id', '=', False), ('company_id', '=?', company_id)]" index=True string='Project' tracking=True args: 'project.project'
  • project_privacy_visibility Selection
    related='project_id.privacy_visibility' string='Project Visibility'
  • rating_active Boolean
    related='project_id.rating_active' string='Project Rating Status'
  • recurrence_id Many2one → project.task.recurrence
    copy=False args: 'project.task.recurrence'
  • recurring_count Integer
    compute='_compute_recurring_count' string='Tasks in Recurrence'
  • recurring_task Boolean
    string='Recurrent'
  • repeat_interval Integer
    compute='_compute_repeat' default=1 groups='project.group_project_user' readonly=False string='Repeat Every'
  • repeat_type Selection
    compute='_compute_repeat' default='forever' groups='project.group_project_user' readonly=False string='Until' args: [('forever', 'Forever'), ('until', 'Until')]
  • repeat_unit Selection
    compute='_compute_repeat' default='week' groups='project.group_project_user' readonly=False args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='End Date'
  • sequence Integer
    default=10 string='Sequence'
  • stage_id Many2one → project.task.type
    compute='_compute_stage_id' default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'project.task.type'
  • state Selection
    compute='_compute_state' copy=False default='01_in_progress' index=True inverse='_inverse_state' readonly=False recursive=True required=True store=True string='State' tracking=True args: [('01_in_progress', 'In Progress'), ('02_changes_requested', 'Changes Requested'), ('03_approved', 'Approved'), *CLOSED_STATES.items(), ('04_waiting_normal', 'Waiting')]
  • subtask_allocated_hours Float
    compute='_compute_subtask_allocated_hours' help='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.' args: 'Sub-tasks Allocated Time'
  • subtask_count Integer
    compute='_compute_subtask_count' args: 'Sub-task Count'
  • tag_ids Many2many → project.tags
    string='Tags' args: 'project.tags'
  • task_properties Properties
    copy=True definition='project_id.task_properties_definition' args: 'Properties'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' context={'active_test': False} default=_default_user_ids domain="[('share', '=', False), ('active', '=', True)]" relation='project_task_user_rel' string='Assignees' tracking=True args: 'res.users'
  • website_message_ids One2many
    domain=<expr>
  • working_days_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working Days to Close'
  • working_days_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working Days to Assign'
  • working_hours_close Float
    compute='_compute_elapsed' digits=(16, 2) group_operator='avg' store=True string='Working Hours to Close'
  • working_hours_open Float
    compute='_compute_elapsed' digits=(16, 2) group_operator='avg' store=True string='Working Hours to Assign'
  • write_date Datetime
    readonly=True args: 'Last Updated On'
Public methods (35)
  • OPEN_STATES(self)
    @property
    Return a list of the technical names complementing the CLOSED_STATES, a.k.a the open states
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITABLE_FIELDS(self)
    @property
  • action_convert_to_subtask(self)
  • action_dependent_tasks(self)
  • action_open_parent_task(self)
  • action_open_ratings(self)
  • action_open_task(self)
  • action_project_sharing_open_subtasks(self)
  • action_project_sharing_open_task(self)
  • action_project_sharing_view_parent_task(self)
  • action_recurring_tasks(self)
  • action_redirect_to_project_task_form(self)
  • action_unlink_recurrence(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, default_fields)
    @api.model
  • email_split(self, msg)
  • fields_get(self, allfields=None, attributes=None)
    @api.model
  • filtered_domain(self, domain)
  • get_empty_list_help(self, help)
    @api.model
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • is_blocked_by_dependences(self)
  • mapped(self, func)
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
    Set task notification based on project notification preference if user follow the project
  • message_update(self, msg, update_vals=None)
    Override to update the task according to the email.
  • rating_apply(self, rate, token=None, rating=None, feedback=None, subtype_xmlid=None, notify_delay_send=False)
  • read(self, fields=None, load='_classic_read')
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • stage_find(self, section_id, domain=[], order='sequence, id')
    Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • unlink(self)
  • update_date_end(self, stage_id)
  • write(self, vals)

New fields (12)
  • allocated_hours Float
    readonly=True string='Allocated Time'
  • date Datetime
    readonly=True args: 'Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_last_stage_update Date
    readonly=True string='Last Stage Update'
  • milestone_id Many2one → project.milestone
    readonly=True args: 'project.milestone'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • project_id Many2one → project.project
    readonly=True args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True args: 'project.task.type'
  • state Selection
    readonly=True string='State' args: [('01_in_progress', 'In Progress'), ('1_done', 'Done'), ('04_waiting_normal', 'Waiting'), ('03_approved', 'Approved'), ('1_canceled', 'Canceled'), ('02_changes_requested', 'Changes Requested')]
  • tag_ids Many2many → project.tags
    column1='project_task_id' column2='project_tags_id' readonly=True relation='project_tags_project_task_rel' string='Tags' args: 'project.tags'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
Public methods (1)
  • task_specific_fields(self)
    @property

New fields (5)
  • repeat_interval Integer
    default=1 string='Repeat Every'
  • repeat_type Selection
    default='forever' string='Until' args: [('forever', 'Forever'), ('until', 'Until')]
  • repeat_unit Selection
    default='week' args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    string='End Date'
  • task_ids One2many → project.task
    copy=False args: 'project.task', 'recurrence_id'
Public methods (0)

No public methods.

New fields (3)
  • stage_id Many2one → project.task.type
    domain="[('user_id', '=', user_id)]" ondelete='set null' args: 'project.task.type'
  • task_id Many2one → project.task
    index=True ondelete='cascade' required=True args: 'project.task'
  • user_id Many2one → res.users
    index=True ondelete='cascade' required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (11)
  • active Boolean
    default=True args: 'Active'
  • auto_validation_state Boolean
    default=False help="Automatically modify the state when the customer replies to the feedback for this stage.\n * Good feedback from the customer will update the state to 'Approved' (green bullet).\n * Neutral or bad feedback will set the kanban state to 'Changes Requested' (orange bullet).\n" args: 'Automatic Kanban Status'
  • description Text
    translate=True
  • disabled_rating_warning Text
    compute='_compute_disabled_rating_warning'
  • fold Boolean
    string='Folded in Kanban'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set, an email will be automatically sent to the customer when the task reaches this stage.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Name' translate=True
  • project_ids Many2many → project.project
    default=<expr> help='Projects in which this stage is present. If you follow a similar workflow in several projects, you can share this stage among them and get consolidated information this way.' string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • rating_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help="If set, a rating request will automatically be sent by email to the customer when the task reaches this stage. \nAlternatively, it will be sent at a regular interval as long as the task remains in this stage, depending on the configuration of your project. \nTo use this feature make sure that the 'Customer Ratings' option is enabled on your project." string='Rating Email Template' args: 'mail.template'
  • sequence Integer
    default=1
  • user_id Many2one → res.users
    compute='_compute_user_id' default=_default_user_id index=True store=True args: 'res.users', 'Stage Owner'
Public methods (4)
  • copy(self, default=None)
  • toggle_active(self)
  • unlink_wizard(self, stage_view=False)
  • write(self, vals)

New fields (4)
  • project_ids Many2many → project.project
    domain="['|', ('active', '=', False), ('active', '=', True)]" ondelete='cascade' string='Projects' args: 'project.project'
  • stage_ids Many2many → project.task.type
    ondelete='cascade' string='Stages To Delete' args: 'project.task.type'
  • stages_active Boolean
    compute='_compute_stages_active'
  • tasks_count Integer
    compute='_compute_tasks_count' args: 'Number of Tasks'
Public methods (4)
  • action_archive(self)
  • action_confirm(self)
  • action_unarchive_task(self)
  • action_unlink(self)

New fields (13)
  • closed_task_count Integer
    readonly=True args: 'Closed Task Count'
  • closed_task_percentage Integer
    compute='_compute_closed_task_percentage' args: 'Closed Task Percentage'
  • color Integer
    compute='_compute_color'
  • date Date
    default=fields.Date.context_today tracking=True
  • description Html
  • name Char
    required=True tracking=True args: 'Title'
  • name_cropped Char
    compute='_compute_name_cropped'
  • progress Integer
    tracking=True
  • progress_percentage Float
    compute='_compute_progress_percentage'
  • project_id Many2one → project.project
    required=True args: 'project.project'
  • status Selection
    required=True selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold'), ('done', 'Done')] tracking=True
  • task_count Integer
    readonly=True args: 'Task Count'
  • user_id Many2one → res.users
    default=<expr> required=True string='Author' args: 'res.users'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
  • unlink(self)

New fields (30)
  • active Boolean
    readonly=True
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • create_date Datetime
    readonly=True args: 'Create Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Datetime
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • delay_endings_days Float
    digits=(16, 2) group_operator='avg' readonly=True string='Days to Deadline'
  • dependent_ids Many2many → project.task
    column1='depends_on_id' column2='task_id' domain="[('allow_task_dependencies', '=', True), ('id', '!=', id)]" readonly=True relation='task_dependencies_rel' string='Block' args: 'project.task'
  • description Text
    readonly=True
  • message_is_follower Boolean
    related='task_id.message_is_follower'
  • milestone_id Many2one → project.milestone
    readonly=True args: 'project.milestone'
  • name Char
    readonly=True string='Task'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • parent_id Many2one → project.task
    readonly=True string='Parent Task' args: 'project.task'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • personal_stage_type_ids Many2many → project.task.type
    column1='task_id' column2='stage_id' readonly=True relation='project_task_user_rel' string='Personal Stage' args: 'project.task.type'
  • priority Selection
    readonly=True string='Priority' args: [('0', 'Low'), ('1', 'High')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • rating_avg Float
    group_operator='avg' groups='project.group_project_rating' readonly=True args: 'Average Rating'
  • rating_last_value Float
    group_operator='avg' groups='project.group_project_rating' readonly=True args: 'Rating (/5)'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='State' args: [('01_in_progress', 'In Progress'), ('1_done', 'Done'), ('04_waiting_normal', 'Waiting'), ('03_approved', 'Approved'), ('1_canceled', 'Canceled'), ('02_changes_requested', 'Changes Requested')]
  • tag_ids Many2many → project.tags
    column1='project_task_id' column2='project_tags_id' readonly=True relation='project_tags_project_task_rel' string='Tags' args: 'project.tags'
  • task_id Many2one → project.task
    readonly=True string='Tasks' args: 'project.task'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
  • working_days_close Float
    digits=(16, 2) group_operator='avg' readonly=True string='Working Days to Close'
  • working_days_open Float
    digits=(16, 2) group_operator='avg' readonly=True string='Working Days to Assign'
  • working_hours_close Float
    digits=(16, 2) group_operator='avg' readonly=True string='Working Hours to Close'
  • working_hours_open Float
    digits=(16, 2) group_operator='avg' readonly=True string='Working Hours to Assign'
Public methods (1)
  • init(self)

New fields (7)
  • analytic_plan_id Many2one → account.analytic.plan
    comodel_name='account.analytic.plan' config_parameter='analytic.analytic_plan_projects' string='Analytic Plan'
  • group_project_milestone Boolean
    group='base.group_portal,base.group_user' implied_group='project.group_project_milestone' args: 'Milestones'
  • group_project_rating Boolean
    implied_group='project.group_project_rating' args: 'Customer Ratings'
  • group_project_recurring_tasks Boolean
    implied_group='project.group_project_recurring_tasks' args: 'Recurring Tasks'
  • group_project_stages Boolean
    implied_group='project.group_project_stages' args: 'Project Stages'
  • group_project_task_dependencies Boolean
    implied_group='project.group_project_task_dependencies' args: 'Task Dependencies'
  • module_hr_timesheet Boolean
    string='Task Logs'
Public methods (1)
  • set_values(self)

New fields (3)
  • project_ids One2many → project.project
    string='Projects' args: 'project.project', 'partner_id'
  • task_count Integer
    compute='_compute_task_count' string='# Tasks'
  • task_ids One2many → project.task
    string='Tasks' args: 'project.task', 'partner_id'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/project
VERSION
VERSION 1.3
CATEGORY
CATEGORYServices/Project
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Xavier ALT, Christophe Simonis, Xavier Morel, Goffin Simon, Thibault Francois, Géry Debongnie, Aaron Bohy, Pedro M. Baeza, Jeremy Kersten, GitHub, Damien Bouvy, Barad Mahendra, Yannick Tivisse, Jorge Pinna Puissant, Jairo Llopis, Alexandre Kühn, Toufik Ben Jaa, Julien Castiaux, Rémi Rahir, Aurélien Warnon, Xavier-Do, Romeo Fragomeli, Victor Feyens, Sébastien Theys, alt-odoo, Julien Mougenot, Samuel Degueldre, Alvaro Fuentes, std-odoo, Achraf (abz), Ivan Yelizariev, Nasreddin Boulif (bon), Prakash Prajapati, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, abd-msyukyu-odoo, William Braeckman, root, Xavier BOL (xbo), Benoit Socias, Hubert Van de Walle (huvw), Mitali Patel, Florian Damhaut, MerlinGuillaume, Krzysztof Magusiak, Audric Onockx (auon), william, Antoine Guenet, Florian Charlier, Abdelouahab (abla), Nicolas Bayet, Thibault Libioulle, Jinjiu Liu, Laurent Stukkens (LTU), Hubert Van De Walle, luvi, Vincent Larcin, Ipsita Borisagar, niyasraphy, damr, Francois (fge), Thomas Lefebvre (thle), Louis Wicket (wil), tsm-odoo, Gurupreet Singh, Victor Piryns (pivi), Yash Vaishnav, Hamza (hisl), maximilien(malb), Pierre-Yves Dufays, hieu, Maruan Aguerdouh (magm), Sébastien Geelen (sge), Bruno Boi, ノウラ, Kamlesh Pathekar, Pratik Awasthi, Michael (mcm), Cedric Prieels (cpr), Chong Wang (cwg), Raouf, Kartik Chavda, Hugo Carlier (Huca), Xavier Bol (xbo), Renilkumar Kajavadra, David Vidal, Nguyễn Đại Dương, Mahdi Cheikh Rouhou (macr), Nidhi Patel, stefanorigano (SRI), ravb-odoo, Youssef Bashandy, Ethan Vincent, lase@odoo.com, bary, Eteil Djoumatchoua (etdj), Maxime de Neuville, Abderraouf Ghrissi (abgh), det, Julien Carion (juca), kcv-odoo, mega, Tanguy Quéguineur, Martin Trigaux (mat), Ritika Rathore, Julien Segers (juse), dise, aath-odoo, Adesh Jolhe (adjo), Rohitkumar (roku), kais-odoo, abderraouf, Manisha Tulsiyani, Manushi Shah (mash), Antoine (anso), luve-odoo, Dardenne Florent (dafl), Dhrumil Shah, AnhBT, ska-ibees, Raja Prasad, hiroh-odoo, Panagiotis Kyriakou, yame-odoo, Bastien (bvdn)
WEBSITE
WEBSITEhttps://www.odoo.com/app/project
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:52
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - analytic
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - rating
    - resource
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (88)
XML IDNameModelTypeStatus
account_analytic_account_view_form_inherit account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
digest_digest_view_form digest.digest.view.form.inherit.project.task digest.digest xpath Inherits digest.digest_digest_view_form
edit_project project.project.form project.project form New
personal_task_type_edit project.task.type.form project.task.type form New
portal_layout Portal layout: project menu entry ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home Show Projects / Tasks ir.ui.view qweb Inherits portal.portal_my_home
portal_my_project My Project ir.ui.view qweb New
portal_my_projects My Projects ir.ui.view qweb New
portal_my_task My Task ir.ui.view qweb Inherits portal.portal_sidebar
portal_my_task_planned_hours_template portal_my_task_planned_hours_template ir.ui.view qweb New
portal_my_tasks My Tasks ir.ui.view qweb New
portal_my_tasks_priority_widget_template Priority Widget Template ir.ui.view qweb New
portal_my_tasks_state_widget_template Status Widget Template ir.ui.view qweb New
portal_tasks_list Tasks List ir.ui.view qweb New
project.milestone_deadline project.milestone_deadline ir.ui.view qweb New
project_collaborator_view_search project.collaborator.view.search project.collaborator search New
project_message_user_assigned project_message_user_assigned ir.ui.view qweb New
project_milestone_view_form project.milestone.view.form project.milestone form New
project_milestone_view_tree project.milestone.view.tree project.milestone tree New
project_project_stage_view_form project.project.stage.view.form project.project.stage form New
project_project_stage_view_form_quick_create project.project.stage.view.form.quick.create project.project.stage form New
project_project_stage_view_kanban project.project.stage.view.kanban project.project.stage kanban New
project_project_stage_view_search project.project.stage.view.search project.project.stage search New
project_project_stage_view_tree project.project.stage.view.tree project.project.stage tree New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_project_view_form_simplified_footer project.project.view.form.simplified project.project xpath Inherits project.project_project_view_form_simplified
project_share_wizard_view_form project.share.wizard.view.form project.share.wizard form New
project_sharing Project Sharing View ir.ui.view qweb New
project_sharing_access_view_tree project.collaborator.view.tree project.collaborator tree New
project_sharing_embed Project Sharing View Embed ir.ui.view qweb New
project_sharing_portal Project Sharing View in Portal ir.ui.view qweb New
project_sharing_project_task_view_form project.sharing.project.task.view.form project.task form New
project_sharing_project_task_view_kanban project.sharing.project.task.view.kanban project.task kanban New
project_sharing_project_task_view_search project.task.search.form project.task search New
project_sharing_project_task_view_tree project.sharing.project.task.tree project.task tree New
project_sharing_quick_create_task_form project.task.form.quick_create project.task form New
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
project_tags_tree_view Tags project.tags tree New
project_task_burndown_chart_report_view_graph project.task.burndown.chart.report.view.graph project.task.burndown.chart.report graph New
project_task_burndown_chart_report_view_search project.task.burndown.chart.report.view.search project.task.burndown.chart.report search New
project_task_view_activity project.task.activity project.task activity New
project_task_view_tree_activity project.task.tree.activity project.task tree New
project_update_default_description Project Update Description ir.ui.view qweb New
project_update_view_form project.update.view.form project.update form New
project_update_view_kanban project.update.view.kanban project.update kanban New
project_update_view_search project.update.view.search project.update search New
project_update_view_tree project.update.view.tree project.update tree New
project_view_kanban project.project.kanban project.project kanban New
project_view_kanban_inherit_project project.kanban.inherit.project project.project xpath Inherits project.view_project_kanban
quick_create_task_form project.task.form.quick_create project.task form New
rating_rating_project_view_kanban rating.rating.kanban.project rating.rating xpath Inherits rating.rating_rating_view_kanban
rating_rating_view_form_project rating.rating.form.project rating.rating xpath Inherits rating.rating_rating_view_form_text
rating_rating_view_graph rating.rating.view.graph.project rating.rating xpath Inherits rating.rating_rating_view_graph
rating_rating_view_pivot rating.rating.view.pivot.project rating.rating xpath Inherits rating.rating_rating_view_pivot
rating_rating_view_search_project rating.rating.search.project rating.rating xpath Inherits rating.rating_rating_view_search
rating_rating_view_tree_project rating.rating.tree.project rating.rating field Inherits rating.rating_rating_view_tree
report_project_task_user_view_tree report.project.task.user.view.tree report.project.task.user tree New
res_config_settings_view_form res.config.settings.view.form.inherit.project res.config.settings xpath Inherits base.res_config_settings_view_form
task_track_depending_tasks task_track_depending_tasks ir.ui.view qweb New
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
task_type_tree_inherited project.task.type.tree.inherited project.task.type xpath Inherits task_type_tree
view_project project.project.tree project.project tree New
view_project_calendar project.project.calendar project.project calendar New
view_project_config_kanban project.kanban.inherit.config.project project.project xpath Inherits view_project_kanban
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_task_graph project.task.graph project.task graph New
view_project_task_pivot project.task.pivot project.task pivot New
view_project_task_pivot_inherit project.task.pivot.inherit project.task xpath Inherits project.view_project_task_pivot
view_project_task_type_delete_confirmation_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_delete_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_kanban project.task.type.kanban project.task.type kanban New
view_project_task_type_unarchive_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_task_all_calendar project.task.all.calendar project.task xpath Inherits view_task_calendar
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_kanban project.task.kanban project.task kanban New
view_task_kanban_inherit_my_task project.task.kanban.inherit.my.task project.task xpath Inherits view_task_kanban
view_task_partner_info_form res.partner.task.buttons res.partner div Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_search_form project.task.search.form project.task search New
view_task_search_form_extended project.task.search.form.extended project.task xpath Inherits view_task_search_form
view_task_tree2 project.task.tree project.task tree New
Models touched (24)

New fields (2)
  • project_count Integer
    compute='_compute_project_count' args: 'Project Count'
  • project_ids One2many → project.project
    string='Projects' args: 'project.project', 'analytic_account_id'
Public methods (1)
  • action_view_projects(self)

New fields (2)
  • kpi_project_task_opened Boolean
    args: 'Open Tasks'
  • kpi_project_task_opened_value Integer
    compute='_compute_project_task_opened_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • init(self)

New fields (3)
  • partner_email Char
    related='partner_id.email'
  • partner_id Many2one → res.partner
    readonly=True required=True args: 'res.partner', 'Collaborator'
  • project_id Many2one → project.project
    domain=[('privacy_visibility', '=', 'portal')] readonly=True required=True args: 'project.project', 'Project Shared'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • name_get(self)
  • unlink(self)

New fields (10)
  • can_be_marked_as_done Boolean
    compute='_compute_can_be_marked_as_done' groups='project.group_project_milestone'
  • deadline Date
    copy=False tracking=True
  • is_deadline_exceeded Boolean
    compute='_compute_is_deadline_exceeded'
  • is_deadline_future Boolean
    compute='_compute_is_deadline_future'
  • is_reached Boolean
    copy=False default=False string='Reached'
  • name Char
    required=True
  • project_id Many2one → project.project
    default=_get_default_project_id ondelete='cascade' required=True args: 'project.project'
  • reached_date Date
    compute='_compute_reached_date' store=True
  • task_count Integer
    compute='_compute_task_count' groups='project.group_project_milestone' args: '# of Tasks'
  • task_ids One2many → project.task
    args: 'project.task', 'milestone_id', 'Tasks'
Public methods (3)
  • action_view_tasks(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • toggle_is_reached(self, is_reached)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (54)
  • access_instruction_message Char
    compute='_compute_access_instruction_message' args: 'Access Instruction Message'
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the project without removing it.'
  • alias_enabled Boolean
    compute='_compute_alias_enabled' readonly=False string='Use Email Alias'
  • alias_id Many2one → mail.alias
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • alias_value Char
    compute='_compute_alias_value' string='Alias email'
  • allow_milestones Boolean
    default=<expr> args: 'Milestones'
  • allow_rating Boolean
    compute='_compute_allow_rating' default=<expr> args: 'Allow Customer Ratings'
  • allow_recurring_tasks Boolean
    default=<expr> args: 'Recurring Tasks'
  • allow_subtasks Boolean
    default=<expr> args: 'Sub-tasks'
  • allow_task_dependencies Boolean
    default=<expr> args: 'Task Dependencies'
  • analytic_account_balance Monetary
    related='analytic_account_id.balance'
  • analytic_account_id Many2one → account.analytic.account
    check_company=True copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Analytic account to which this project, its tasks and its timesheets are linked. \nTrack the costs and revenues of your project by setting this analytic account on your related documents (e.g. sales orders, invoices, purchase orders, vendor bills, expenses etc.).\nThis analytic account can be changed on each task individually if necessary.\nAn analytic account is required in order to use timesheets.' ondelete='set null' string='Analytic Account' args: 'account.analytic.account'
  • collaborator_count Integer
    compute='_compute_collaborator_count' compute_sudo=True args: '# Collaborators'
  • collaborator_ids One2many → project.collaborator
    copy=False string='Collaborators' args: 'project.collaborator', 'project_id'
  • color Integer
    string='Color Index'
  • commercial_partner_id Many2one
    related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' string='Currency' args: 'res.currency'
  • date Date
    help='Date on which this project ends. The timeframe defined on the project is taken into account when viewing its planning.' index=True string='Expiration Date' tracking=True
  • date_start Date
    string='Start Date'
  • description Html
    help='Description to provide more information and context about this project'
  • doc_count Integer
    compute='_compute_attached_docs_count' string='Number of documents attached'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' compute_sudo=True inverse='_inverse_is_favorite' string='Show Project on Dashboard'
  • is_milestone_exceeded Boolean
    compute='_compute_is_milestone_exceeded' search='_search_is_milestone_exceeded'
  • label_tasks Char
    default=<expr> help='Name used to refer to the tasks of your project e.g. tasks, tickets, sprints, etc...' string='Use Tasks as' translate=True
  • last_update_color Integer
    compute='_compute_last_update_color'
  • last_update_id Many2one → project.update
    copy=False string='Last Update' args: 'project.update'
  • last_update_status Selection
    compute='_compute_last_update_status' default='to_define' readonly=False required=True selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold'), ('to_define', 'Set Status')] store=True
  • milestone_count Integer
    compute='_compute_milestone_count' groups='project.group_project_milestone'
  • milestone_count_reached Integer
    compute='_compute_milestone_reached_count' groups='project.group_project_milestone'
  • milestone_ids One2many → project.milestone
    args: 'project.milestone', 'project_id'
  • name Char
    default_export_compatible=True help='Name of your project. It can be anything you want e.g. the name of a customer or a service.' index='trigram' required=True tracking=True translate=True args: 'Name'
  • partner_email Char
    compute='_compute_partner_email' copy=False inverse='_inverse_partner_email' readonly=False store=True string='Email'
  • partner_id Many2one → res.partner
    auto_join=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Customer' tracking=True args: 'res.partner'
  • partner_phone Char
    compute='_compute_partner_phone' copy=False inverse='_inverse_partner_phone' readonly=False store=True string='Phone'
  • privacy_visibility Selection
    default='portal' help='People to whom this project and its tasks will be visible.\n\n- Invited internal users: when following a project, internal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n A user with the project > administrator access right level can still access this project and its tasks, even if they are not explicitly part of the followers.\n\n- All internal users: all internal users can access the project and all of its tasks without distinction.\n\n- Invited portal users and all internal users: all internal users can access the project and all of its tasks without distinction.\nWhen following a project, portal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n\nWhen a project is shared in read-only, the portal user is redirected to their portal. They can view the tasks, but not edit them.\nWhen a project is shared in edit, the portal user is redirected to the kanban and list views of the tasks. They can modify a selected number of fields on the tasks.\n\nIn any case, an internal user with no project access rights can still access a task, provided that they are given the corresponding URL (and that they are part of the followers if the project is private).' required=True string='Visibility' args: [('followers', 'Invited internal users'), ('employees', 'All internal users'), ('portal', 'Invited portal users and all internal users')]
  • privacy_visibility_warning Char
    compute='_compute_privacy_visibility_warning' args: 'Privacy Visibility Warning'
  • rating_active Boolean
    default=<expr> args: 'Customer Ratings'
  • rating_request_deadline Datetime
    compute='_compute_rating_request_deadline' store=True
  • rating_status Selection
    default='stage' help='Collect feedback from your customers by sending them a rating request when a task enters a certain stage. To do so, define a rating email template on the corresponding stages.\nRating when changing stage: an email will be automatically sent when the task reaches the stage on which the rating email template is set.\nPeriodic rating: an email will be automatically sent at regular intervals as long as the task remains in the stage in which the rating email template is set.' required=True args: [('stage', 'Rating when changing stage'), ('periodic', 'Periodic rating')], 'Customer Ratings Status'
  • rating_status_period Selection
    default='monthly' required=True args: [('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a Month'), ('monthly', 'Once a Month'), ('quarterly', 'Quarterly'), ('yearly', 'Yearly')], 'Rating Frequency'
  • resource_calendar_id Many2one → resource.calendar
    related='company_id.resource_calendar_id' string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10
  • stage_id Many2one → project.project.stage
    copy=False default=_default_stage_id group_expand='_read_group_stage_ids' groups='project.group_project_stages' index=True ondelete='restrict' string='Stage' tracking=True args: 'project.project.stage'
  • tag_ids Many2many → project.tags
    relation='project_project_project_tags_rel' string='Tags' args: 'project.tags'
  • task_count Integer
    compute='_compute_task_count' string='Task Count'
  • task_count_with_subtasks Integer
    compute='_compute_task_count'
  • task_ids One2many → project.task
    domain=[('is_closed', '=', False)] string='Tasks' args: 'project.task', 'project_id'
  • task_properties_definition PropertiesDefinition
    args: 'Task Properties'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • update_ids One2many → project.update
    args: 'project.update', 'project_id'
  • user_id Many2one → res.users
    default=<expr> string='Project Manager' tracking=True args: 'res.users'
Public methods (19)
  • action_get_list_view(self)
  • action_profitability_items(self, section_name, domain=None, res_id=False)
  • action_project_task_burndown_chart_report(self)
  • action_project_timesheets(self)
  • action_view_all_rating(self)
    return the action to see all the rating of the project and activate default filters
  • action_view_tasks(self)
  • action_view_tasks_analysis(self)
    return the action to see the tasks analysis report of the project
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals_list)
    @api.model_create_multi
  • get_last_update_or_default(self)
  • get_milestones(self)
  • get_panel_data(self)
  • map_tasks(self, new_project_id)
    copy and map tasks from old to new project
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
    Subscribe to newly created task but not all existing active task when subscribing to a project. User update notification preference of project its propagated to all the tasks that the user is currently following.
  • name_create(self, name)
    @api.model
  • project_update_all_action(self)
  • toggle_favorite(self)
  • unlink(self)
  • write(self, vals)

New fields (5)
  • active Boolean
    default=True
  • fold Boolean
    help='If enabled, this stage will be displayed as folded in the Kanban view of your projects. Projects in a folded stage are considered as closed.' args: 'Folded in Kanban'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.project')] help='If set, an email will be automatically sent to the customer when the project reaches this stage.' string='Email Template' args: 'mail.template'
  • name Char
    required=True translate=True
  • sequence Integer
    default=50
Public methods (0)

No public methods.

New fields (2)
  • access_mode Selection
    args: [('read', 'Readonly'), ('edit', 'Edit')]
  • display_access_mode Boolean
Public methods (2)
  • action_send_mail(self)
  • default_get(self, fields)
    @api.model

New fields (4)
  • color Integer
    default=_get_default_color help='Transparent tags are not visible in the kanban view of your projects and tasks.' string='Color'
  • name Char
    required=True translate=True args: 'Name'
  • project_ids Many2many → project.project
    string='Projects' args: 'project.project', 'project_project_project_tags_rel'
  • task_ids Many2many → project.task
    string='Tasks' args: 'project.task'
Public methods (3)
  • arrange_tag_list_by_id(self, tag_list, id_order)
    @api.model
    arrange_tag_list_by_id re-order a list of record values (dict) following a given id sequence complexity: O(n) param: - tag_list: ordered (by id) list of record values, each record being a dict containing at least an 'id' key - id_order: list of value (int) corresponding to the id of the records to re-arrange result: - Sorted list of record values (dict)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • search_read(self, domain=None, fields=None, offset=0, limit=None, order=None)
    @api.model

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (97)
  • active Boolean
    default=True
  • allow_milestones Boolean
    related='project_id.allow_milestones'
  • allow_recurring_tasks Boolean
    related='project_id.allow_recurring_tasks'
  • allow_subtasks Boolean
    readonly=True related='project_id.allow_subtasks' string='Allow Sub-tasks'
  • allow_task_dependencies Boolean
    related='project_id.allow_task_dependencies'
  • analytic_account_id Many2one → account.analytic.account
    check_company=True compute='_compute_analytic_account_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Analytic account to which this task and its timesheets are linked.\nTrack the costs and revenues of your task by setting its analytic account on your related documents (e.g. sales orders, invoices, purchase orders, vendor bills, expenses etc.).\nBy default, the analytic account of the project is set. However, it can be changed on each task individually if necessary.' ondelete='set null' readonly=False store=True args: 'account.analytic.account'
  • ancestor_id Many2one → project.task
    compute='_compute_ancestor_id' index='btree_not_null' recursive=True store=True string='Ancestor Task' args: 'project.task'
  • attachment_ids One2many → ir.attachment
    compute='_compute_attachment_ids' help="Attachments that don't come from a message." string='Main Attachments' args: 'ir.attachment'
  • child_ids One2many → project.task
    string='Sub-tasks' args: 'project.task', 'parent_id'
  • child_text Char
    compute='_compute_child_text'
  • color Integer
    string='Color Index'
  • commercial_partner_id Many2one
    related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    compute='_compute_company_id' copy=True default=_default_company_id readonly=False required=True store=True string='Company' args: 'res.company'
  • create_date Datetime
    readonly=True args: 'Created On'
  • date_assign Datetime
    copy=False help='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.' readonly=True string='Assigning Date'
  • date_deadline Date
    copy=False index=True string='Deadline' task_dependency_tracking=True tracking=True
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False help='Date on which the stage of your task has last been modified.\nBased 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 to another.' index=True readonly=True string='Last Stage Update'
  • depend_on_ids Many2many → project.task
    column1='task_id' column2='depends_on_id' copy=False domain="[('project_id', '!=', False), ('id', '!=', id)]" relation='task_dependencies_rel' string='Blocked By' tracking=True args: 'project.task'
  • dependent_ids Many2many → project.task
    column1='depends_on_id' column2='task_id' copy=False domain="[('project_id', '!=', False), ('id', '!=', id)]" relation='task_dependencies_rel' string='Block' args: 'project.task'
  • dependent_tasks_count Integer
    compute='_compute_dependent_tasks_count' string='Dependent Tasks'
  • description Html
    sanitize_attributes=False string='Description'
  • display_parent_task_button Boolean
    compute='_compute_display_parent_task_button' compute_sudo=True
  • display_project_id Many2one → project.project
    index=True args: 'project.project'
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Cover Image' args: 'ir.attachment'
  • email_cc Char
    help='Email addresses that were in the CC of the incoming emails from this task and that are not currently linked to an existing customer.'
  • email_from Char
    compute='_compute_email_from' copy=False help='These people will receive email.' index='trigram' readonly=False recursive=True store=True string='Email From'
  • fri Boolean
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='Fri'
  • has_late_and_unreached_milestone Boolean
    compute='_compute_has_late_and_unreached_milestone' search='_search_has_late_and_unreached_milestone'
  • is_analytic_account_id_changed Boolean
    compute='_compute_is_analytic_account_id_changed' store=True args: 'Is Analytic Account Manually Changed'
  • is_blocked Boolean
    compute='_compute_is_blocked' recursive=True store=True
  • is_closed Boolean
    help='Folded in Kanban stages are closing stages.' index=True related='stage_id.fold' store=True string='Closing Stage'
  • is_private Boolean
    compute='_compute_is_private' search='_search_is_private'
  • kanban_state Selection
    compute='_compute_kanban_state' copy=False default='normal' readonly=False required=True store=True string='Status' args: [('normal', 'In Progress'), ('done', 'Ready'), ('blocked', 'Blocked')]
  • kanban_state_label Char
    compute='_compute_kanban_state_label' string='Kanban State Label' task_dependency_tracking=True tracking=True
  • legend_blocked Char
    readonly=True related='stage_id.legend_blocked' string='Kanban Blocked Explanation'
  • legend_done Char
    readonly=True related='stage_id.legend_done' string='Kanban Valid Explanation'
  • legend_normal Char
    readonly=True related='stage_id.legend_normal' string='Kanban Ongoing Explanation'
  • manager_id Many2one → res.users
    readonly=True related='project_id.user_id' string='Project Manager' args: 'res.users'
  • milestone_id Many2one → project.milestone
    compute='_compute_milestone_id' domain="[('project_id', '=', project_id)]" help='Deliver your services automatically when a milestone is reached by linking it to a sales order item.' index='btree_not_null' readonly=False store=True tracking=True args: 'project.milestone', 'Milestone'
  • mon Boolean
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='Mon'
  • name Char
    index='trigram' required=True string='Title' tracking=True
  • parent_id Many2one → project.task
    index=True string='Parent Task' args: 'project.task'
  • partner_city Char
    readonly=False related='partner_id.city'
  • partner_email Char
    compute='_compute_partner_email' copy=False inverse='_inverse_partner_email' readonly=False store=True string='Email'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False recursive=True store=True string='Customer' tracking=True args: 'res.partner'
  • partner_is_company Boolean
    readonly=True related='partner_id.is_company'
  • partner_phone Char
    compute='_compute_partner_phone' copy=False inverse='_inverse_partner_phone' readonly=False store=True string='Phone'
  • personal_stage_id Many2one → project.task.stage.personal
    compute='_compute_personal_stage_id' compute_sudo=False help="The current user's personal stage." string='Personal Stage State' args: 'project.task.stage.personal'
  • personal_stage_type_id Many2one → project.task.type
    compute='_compute_personal_stage_type_id' default=_default_personal_stage_type_id help="The current user's personal task stage." inverse='_inverse_personal_stage_type_id' search='_search_personal_stage_type_id' store=False string='Personal User Stage' args: 'project.task.type'
  • personal_stage_type_ids Many2many → project.task.type
    column1='task_id' column2='stage_id' copy=False depends=['user_ids'] domain="[('user_id', '=', user.id)]" group_expand='_read_group_personal_stage_type_ids' ondelete='restrict' string='Personal Stage' args: 'project.task.type', 'project_task_user_rel'
  • planned_hours Float
    tracking=True args: 'Initially Planned Hours'
  • portal_user_names Char
    compute='_compute_portal_user_names' compute_sudo=True search='_search_portal_user_names'
  • priority Selection
    default='0' index=True string='Priority' tracking=True args: [('0', 'Low'), ('1', 'High')]
  • project_analytic_account_id Many2one → account.analytic.account
    related='project_id.analytic_account_id' string='Project Analytic Account' args: 'account.analytic.account'
  • project_color Integer
    related='project_id.color' string='Project Color'
  • project_id Many2one → project.project
    change_default=True check_company=True compute='_compute_project_id' index=True precompute=True readonly=False recursive=True store=True string='Project' tracking=True args: 'project.project'
  • project_privacy_visibility Selection
    related='project_id.privacy_visibility' string='Project Visibility'
  • rating_active Boolean
    related='project_id.rating_active' string='Project Rating Status'
  • recurrence_id Many2one → project.task.recurrence
    copy=False args: 'project.task.recurrence'
  • recurrence_message Char
    compute='_compute_recurrence_message' groups='project.group_project_user' string='Next Recurrencies'
  • recurrence_update Selection
    default='this' store=False args: [('this', 'This task'), ('subsequent', 'This and following tasks'), ('all', 'All tasks')]
  • recurring_count Integer
    compute='_compute_recurring_count' string='Tasks in Recurrence'
  • recurring_task Boolean
    string='Recurrent'
  • repeat_day Selection
    compute='_compute_repeat' groups='project.group_project_user' readonly=False args: <expr>
  • repeat_interval Integer
    compute='_compute_repeat' default=1 groups='project.group_project_user' readonly=False string='Repeat Every'
  • repeat_month Selection
    compute='_compute_repeat' groups='project.group_project_user' readonly=False args: [('january', 'January'), ('february', 'February'), ('march', 'March'), ('april', 'April'), ('may', 'May'), ('june', 'June'), ('july', 'July'), ('august', 'August'), ('september', 'September'), ('october', 'October'), ('november', 'November'), ('december', 'December')]
  • repeat_number Integer
    compute='_compute_repeat' default=1 groups='project.group_project_user' readonly=False string='Repetitions'
  • repeat_on_month Selection
    compute='_compute_repeat' default='date' groups='project.group_project_user' readonly=False args: [('date', 'Date of the Month'), ('day', 'Day of the Month')]
  • repeat_on_year Selection
    compute='_compute_repeat' default='date' groups='project.group_project_user' readonly=False args: [('date', 'Date of the Year'), ('day', 'Day of the Year')]
  • repeat_show_day Boolean
    compute='_compute_repeat_visibility' groups='project.group_project_user'
  • repeat_show_dow Boolean
    compute='_compute_repeat_visibility' groups='project.group_project_user'
  • repeat_show_month Boolean
    compute='_compute_repeat_visibility' groups='project.group_project_user'
  • repeat_show_week Boolean
    compute='_compute_repeat_visibility' groups='project.group_project_user'
  • repeat_type Selection
    compute='_compute_repeat' default='forever' groups='project.group_project_user' readonly=False string='Until' args: [('forever', 'Forever'), ('until', 'End Date'), ('after', 'Number of Repetitions')]
  • repeat_unit Selection
    compute='_compute_repeat' default='week' groups='project.group_project_user' readonly=False args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='End Date'
  • repeat_week Selection
    compute='_compute_repeat' default='first' groups='project.group_project_user' readonly=False args: [('first', 'First'), ('second', 'Second'), ('third', 'Third'), ('last', 'Last')]
  • repeat_weekday Selection
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='Day Of The Week' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • sat Boolean
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='Sat'
  • sequence Integer
    default=10 string='Sequence'
  • stage_id Many2one → project.task.type
    compute='_compute_stage_id' copy=False default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' task_dependency_tracking=True tracking=True args: 'project.task.type'
  • subtask_count Integer
    compute='_compute_subtask_count' args: 'Sub-task Count'
  • subtask_planned_hours Float
    compute='_compute_subtask_planned_hours' help='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.' args: 'Sub-tasks Planned Hours'
  • sun Boolean
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='Sun'
  • tag_ids Many2many → project.tags
    help="You can only see tags that are already present in your project. If you try creating a tag that is already existing in other projects, it won't generate any duplicates." string='Tags' args: 'project.tags'
  • task_properties Properties
    copy=True definition='project_id.task_properties_definition' args: 'Properties'
  • thu Boolean
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='Thu'
  • tue Boolean
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='Tue'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' context={'active_test': False} relation='project_task_user_rel' string='Assignees' tracking=True args: 'res.users'
  • website_message_ids One2many
    domain=<expr>
  • wed Boolean
    compute='_compute_repeat' groups='project.group_project_user' readonly=False string='Wed'
  • working_days_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working Days to Close'
  • working_days_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working Days to Assign'
  • working_hours_close Float
    compute='_compute_elapsed' digits=(16, 2) group_operator='avg' store=True string='Working Hours to Close'
  • working_hours_open Float
    compute='_compute_elapsed' digits=(16, 2) group_operator='avg' store=True string='Working Hours to Assign'
  • write_date Datetime
    readonly=True args: 'Last Updated On'
Public methods (33)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITABLE_FIELDS(self)
    @property
  • action_assign_to_me(self)
  • action_continue_recurrence(self)
  • action_dependent_tasks(self)
  • action_open_parent_task(self)
  • action_open_ratings(self)
  • action_open_task(self)
  • action_project_sharing_open_subtasks(self)
  • action_project_sharing_open_task(self)
  • action_project_sharing_view_parent_task(self)
  • action_recurring_tasks(self)
  • action_stop_recurrence(self)
  • action_unassign_me(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, default_fields)
    @api.model
  • email_split(self, msg)
  • fields_get(self, allfields=None, attributes=None)
    @api.model
  • filtered_domain(self, domain)
  • get_empty_list_help(self, help)
    @api.model
  • get_unusual_days(self, date_from, date_to=None)
    @api.model
  • mapped(self, func)
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
    Set task notification based on project notification preference if user follow the project
  • message_update(self, msg, update_vals=None)
    Override to update the task according to the email.
  • rating_apply(self, rate, token=None, rating=None, feedback=None, subtype_xmlid=None, notify_delay_send=False)
  • read(self, fields=None, load='_classic_read')
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • stage_find(self, section_id, domain=[], order='sequence, id')
    Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • update_date_end(self, stage_id)
  • write(self, vals)

New fields (12)
  • date Datetime
    readonly=True args: 'Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Date
    readonly=True string='Deadline'
  • display_project_id Many2one → project.project
    readonly=True args: 'project.project'
  • has_late_and_unreached_milestone Boolean
    readonly=True
  • is_closed Boolean
    readonly=True args: 'Closing Stage'
  • milestone_id Many2one → project.milestone
    readonly=True args: 'project.milestone'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • planned_hours Float
    readonly=True string='Allocated Hours'
  • project_id Many2one → project.project
    readonly=True args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True args: 'project.task.type'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
Public methods (0)

No public methods.

New fields (21)
  • fri Boolean
    string='Fri'
  • mon Boolean
    string='Mon'
  • next_recurrence_date Date
  • recurrence_left Integer
    copy=False string='Number of Tasks Left to Create'
  • repeat_day Selection
    args: <expr>
  • repeat_interval Integer
    default=1 string='Repeat Every'
  • repeat_month Selection
    args: [('january', 'January'), ('february', 'February'), ('march', 'March'), ('april', 'April'), ('may', 'May'), ('june', 'June'), ('july', 'July'), ('august', 'August'), ('september', 'September'), ('october', 'October'), ('november', 'November'), ('december', 'December')]
  • repeat_number Integer
    string='Repetitions'
  • repeat_on_month Selection
    args: [('date', 'Date of the Month'), ('day', 'Day of the Month')]
  • repeat_on_year Selection
    args: [('date', 'Date of the Year'), ('day', 'Day of the Year')]
  • repeat_type Selection
    default='forever' string='Until' args: [('forever', 'Forever'), ('until', 'End Date'), ('after', 'Number of Repetitions')]
  • repeat_unit Selection
    default='week' args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    string='End Date'
  • repeat_week Selection
    args: [('first', 'First'), ('second', 'Second'), ('third', 'Third'), ('last', 'Last')]
  • repeat_weekday Selection
    readonly=False string='Day Of The Week' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • sat Boolean
    string='Sat'
  • sun Boolean
    string='Sun'
  • task_ids One2many → project.task
    copy=False args: 'project.task', 'recurrence_id'
  • thu Boolean
    string='Thu'
  • tue Boolean
    string='Tue'
  • wed Boolean
    string='Wed'
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, vals)

New fields (3)
  • stage_id Many2one → project.task.type
    domain="[('user_id', '=', user_id)]" ondelete='restrict' args: 'project.task.type'
  • task_id Many2one → project.task
    index=True ondelete='cascade' required=True args: 'project.task'
  • user_id Many2one → res.users
    index=True ondelete='cascade' required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (14)
  • active Boolean
    default=True args: 'Active'
  • auto_validation_kanban_state Boolean
    default=False help="Automatically modify the kanban state when the customer replies to the feedback for this stage.\n * Good feedback from the customer will update the kanban state to 'ready for the new stage' (green bullet).\n * Neutral or bad feedback will set the kanban state to 'blocked' (red bullet).\n" args: 'Automatic Kanban Status'
  • description Text
    translate=True
  • disabled_rating_warning Text
    compute='_compute_disabled_rating_warning'
  • fold Boolean
    help='If enabled, this stage will be displayed as folded in the Kanban view of your tasks. Tasks in a folded stage are considered as closed (not applicable to personal stages).' string='Folded in Kanban'
  • legend_blocked Char
    default=<expr> required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> required=True translate=True args: 'Grey Kanban Label'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set, an email will be automatically sent to the customer when the task reaches this stage.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Name' translate=True
  • project_ids Many2many → project.project
    default=<expr> help='Projects in which this stage is present. If you follow a similar workflow in several projects, you can share this stage among them and get consolidated information this way.' string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • rating_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help="If set, a rating request will automatically be sent by email to the customer when the task reaches this stage. \nAlternatively, it will be sent at a regular interval as long as the task remains in this stage, depending on the configuration of your project. \nTo use this feature make sure that the 'Customer Ratings' option is enabled on your project." string='Rating Email Template' args: 'mail.template'
  • sequence Integer
    default=1
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Stage Owner'
Public methods (4)
  • remove_personal_stage(self)
    Remove a personal stage, tasks using that stage will move to the first stage with a lower priority if it exists higher if not. This method will not allow to delete the last personal stage. Having no personal_stage_type_id makes the task not appear when grouping by personal stage.
  • toggle_active(self)
  • unlink_wizard(self, stage_view=False)
  • write(self, vals)

New fields (4)
  • project_ids Many2many → project.project
    domain="['|', ('active', '=', False), ('active', '=', True)]" ondelete='cascade' string='Projects' args: 'project.project'
  • stage_ids Many2many → project.task.type
    ondelete='cascade' string='Stages To Delete' args: 'project.task.type'
  • stages_active Boolean
    compute='_compute_stages_active'
  • tasks_count Integer
    compute='_compute_tasks_count' args: 'Number of Tasks'
Public methods (4)
  • action_archive(self)
  • action_confirm(self)
  • action_unarchive_task(self)
  • action_unlink(self)

New fields (10)
  • color Integer
    compute='_compute_color'
  • date Date
    default=fields.Date.context_today tracking=True
  • description Html
  • name Char
    required=True tracking=True args: 'Title'
  • name_cropped Char
    compute='_compute_name_cropped'
  • progress Integer
    tracking=True
  • progress_percentage Float
    compute='_compute_progress_percentage'
  • project_id Many2one → project.project
    required=True args: 'project.project'
  • status Selection
    required=True selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold')] tracking=True
  • user_id Many2one → res.users
    default=<expr> required=True string='Author' args: 'res.users'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, fields)
  • unlink(self)

New fields (32)
  • active Boolean
    readonly=True
  • ancestor_id Many2one → project.task
    readonly=True string='Ancestor Task' args: 'project.task'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • create_date Datetime
    readonly=True args: 'Create Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • delay_endings_days Float
    digits=(16, 2) group_operator='avg' readonly=True string='Days to Deadline'
  • is_closed Boolean
    help='Folded in Kanban stages are closing stages.' readonly=True args: 'Closing Stage'
  • milestone_deadline Date
    readonly=True args: 'Milestone Deadline'
  • milestone_id Many2one → project.milestone
    readonly=True args: 'project.milestone'
  • milestone_reached Boolean
    readonly=True args: 'Is Milestone Reached'
  • name Char
    readonly=True string='Task'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • parent_id Many2one → project.task
    readonly=True string='Parent Task' args: 'project.task'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • personal_stage_type_ids Many2many → project.task.type
    column1='task_id' column2='stage_id' readonly=True relation='project_task_user_rel' string='Personal Stage' args: 'project.task.type'
  • priority Selection
    readonly=True string='Priority' args: [('0', 'Low'), ('1', 'High')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • rating_avg Float
    group_operator='avg' groups='project.group_project_rating' readonly=True args: 'Average Rating'
  • rating_last_text Selection
    compute='_compute_rating_last_text' search='_search_rating_last_text' string='Rating Last Text' args: RATING_TEXT
  • rating_last_value Float
    group_operator='avg' groups='project.group_project_rating' readonly=True args: 'Rating Value (/5)'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='Kanban State' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for Next Stage')]
  • tag_ids Many2many → project.tags
    column1='project_task_id' column2='project_tags_id' readonly=True relation='project_tags_project_task_rel' string='Tags' args: 'project.tags'
  • task_id Many2one → project.task
    readonly=True string='Tasks' args: 'project.task'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
  • working_days_close Float
    digits=(16, 2) group_operator='avg' readonly=True string='Working Days to Close'
  • working_days_open Float
    digits=(16, 2) group_operator='avg' readonly=True string='Working Days to Assign'
  • working_hours_close Float
    digits=(16, 2) group_operator='avg' readonly=True string='Working Hours to Close'
  • working_hours_open Float
    digits=(16, 2) group_operator='avg' readonly=True string='Working Hours to Assign'
Public methods (1)
  • init(self)

New fields (1)
  • analytic_plan_id Many2one → account.analytic.plan
    check_company=True compute='_compute_analytic_plan_id' help='Default Plan for a new analytic account for projects' readonly=False string='Default Plan' args: 'account.analytic.plan'
Public methods (1)
  • write(self, values)

New fields (9)
  • analytic_plan_id Many2one → account.analytic.plan
    comodel_name='account.analytic.plan' readonly=False related='company_id.analytic_plan_id' string='Default Plan'
  • group_project_milestone Boolean
    group='base.group_portal,base.group_user' implied_group='project.group_project_milestone' args: 'Milestones'
  • group_project_rating Boolean
    implied_group='project.group_project_rating' args: 'Customer Ratings'
  • group_project_recurring_tasks Boolean
    implied_group='project.group_project_recurring_tasks' args: 'Recurring Tasks'
  • group_project_stages Boolean
    implied_group='project.group_project_stages' args: 'Project Stages'
  • group_project_task_dependencies Boolean
    implied_group='project.group_project_task_dependencies' args: 'Task Dependencies'
  • group_subtask_project Boolean
    implied_group='project.group_subtask_project' args: 'Sub-tasks'
  • module_hr_timesheet Boolean
    string='Task Logs'
  • module_project_forecast Boolean
    string='Planning'
Public methods (1)
  • set_values(self)

New fields (2)
  • task_count Integer
    compute='_compute_task_count' string='# Tasks'
  • task_ids One2many → project.task
    string='Tasks' args: 'project.task', 'partner_id'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/project
VERSION
VERSION 1.2
CATEGORY
CATEGORYServices/Project
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Aaron Bohy, Jeremy Kersten, GitHub, Barad Mahendra, Yannick Tivisse, Jorge Pinna Puissant, Alexandre Kühn, Adrian Torres, Rémi Rahir, Xavier-Do, Victor Feyens, Andrea Grazioso (agr-odoo), Paul Morelle, Nasreddin (bon), alt-odoo, Julien Mougenot, Alvaro Fuentes, Achraf (abz), Ivan Yelizariev, Nasreddin Boulif (bon), Prakash Prajapati, Swapnesh Shah, Tiffany Chang (tic), IEL, Mathieu Duckerts-Antoine, jbm-odoo, Arnaud Joset, William Braeckman, bit-odoo, Kevin Baptiste, odoo, Xavier BOL (xbo), Benoit Socias, Hubert Van de Walle (huvw), Miquel Raïch, jdoutreloux, Mitali Patel, Florian Damhaut, MerlinGuillaume, yhu-odoo, Csaba Tóth, Audric Onockx (auon), Antoine Guenet, Yolann Sabaux, Abdelouahab (abla), Adrien Minet, Nicolas Bayet, Thibault Libioulle, Laurent Stukkens (LTU), dht-odoo, Vincent Larcin, Ipsita Borisagar, damr, Francois (fge), Thomas Lefebvre (thle), Louis Wicket (wil), Urvi Soni, Victor Piryns (pivi), Simon Genin (ges), hieu, Maruan Aguerdouh (magm), Sébastien Geelen (sge), Krina Oza, ノウラ, Kamlesh Pathekar, Pratik Awasthi, Cedric Prieels (cpr), Carlos Valverde, Kartik Chavda, Hugo Carlier (Huca), Xavier Bol (xbo), jlzhou, Nguyễn Đại Dương, Leonardo Pavan Rocha, Nidhi Patel, MAHAMADASIF ANSARI, ravb-odoo, Abderraouf Ghrissi (abgh), Karan Bosamia, mega, duongnguyen-viindoo, Ritika Rathore
WEBSITE
WEBSITEhttps://www.odoo.com/app/project
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:29
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - analytic
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - rating
    - resource
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (83)
XML IDNameModelTypeStatus
account_analytic_account_view_form_inherit account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
digest_digest_view_form digest.digest.view.form.inherit.project.task digest.digest xpath Inherits digest.digest_digest_view_form
edit_project project.project.form project.project form New
personal_task_type_edit project.task.type.form project.task.type form New
portal_layout Portal layout: project menu entry ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home Show Projects / Tasks ir.ui.view qweb Inherits portal.portal_my_home
portal_my_project My Project ir.ui.view qweb New
portal_my_projects My Projects ir.ui.view qweb New
portal_my_task My Task ir.ui.view qweb New
portal_my_task_planned_hours_template portal_my_task_planned_hours_template ir.ui.view qweb New
portal_my_tasks My Tasks ir.ui.view qweb New
portal_my_tasks_priority_widget_template Priority Widget Template ir.ui.view qweb New
portal_my_tasks_state_widget_template Status Widget Template ir.ui.view qweb New
portal_tasks_list Tasks List ir.ui.view qweb New
project.milestone_deadline project.milestone_deadline ir.ui.view qweb New
project_collaborator_view_form project.collaborator.view.form project.collaborator form New
project_collaborator_view_search project.collaborator.view.search project.collaborator search New
project_delete_wizard_form Delete Project project.delete.wizard form New
project_message_user_assigned project_message_user_assigned ir.ui.view qweb New
project_milestone_view_form project.milestone.view.form project.milestone form New
project_milestone_view_tree project.milestone.view.tree project.milestone tree New
project_project_stage_view_form project.project.stage.view.form project.project.stage form New
project_project_stage_view_form_quick_create project.project.stage.view.form.quick.create project.project.stage form New
project_project_stage_view_kanban project.project.stage.view.kanban project.project.stage kanban New
project_project_stage_view_search project.project.stage.view.search project.project.stage search New
project_project_stage_view_tree project.project.stage.view.tree project.project.stage tree New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_project_view_form_simplified_footer project.project.view.form.simplified project.project xpath Inherits project.project_project_view_form_simplified
project_share_wizard_view_form project.share.wizard.view.form project.share.wizard form New
project_sharing Project Sharing View ir.ui.view qweb New
project_sharing_access_view_tree project.collaborator.view.tree project.collaborator tree New
project_sharing_embed Project Sharing View Embed ir.ui.view qweb New
project_sharing_portal Project Sharing View in Portal ir.ui.view qweb New
project_sharing_project_task_view_form project.sharing.project.task.view.form project.task form New
project_sharing_project_task_view_kanban project.sharing.project.task.view.kanban project.task kanban New
project_sharing_project_task_view_search project.task.search.form project.task search New
project_sharing_project_task_view_tree project.sharing.project.task.tree project.task tree New
project_sharing_quick_create_task_form project.task.form.quick_create project.task form New
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
project_tags_tree_view Tags project.tags tree New
project_task_burndown_chart_report_view_graph project.task.burndown.chart.report.view.graph project.task.burndown.chart.report graph New
project_task_burndown_chart_report_view_pivot project.task.burndown.chart.report.view.pivot project.task.burndown.chart.report pivot New
project_task_burndown_chart_report_view_search project.task.burndown.chart.report.view.search project.task.burndown.chart.report search New
project_task_view_activity project.task.activity project.task activity New
project_task_view_tree_activity project.task.tree.activity project.task tree New
project_update_default_description Project Update Description ir.ui.view qweb New
project_update_view_form project.update.view.form project.update form New
project_update_view_kanban project.update.view.kanban project.update kanban New
project_update_view_search project.update.view.search project.update search New
project_update_view_tree project.update.view.tree project.update tree New
project_view_kanban project.project.kanban project.project kanban New
project_view_kanban_inherit_project project.kanban.inherit.project project.project xpath Inherits project.view_project_kanban
quick_create_task_form project.task.form.quick_create project.task form New
rating_rating_view_form_project rating.rating.form.project rating.rating field Inherits rating.rating_rating_view_form
rating_rating_view_graph rating.rating.view.graph.project rating.rating xpath Inherits rating.rating_rating_view_graph
rating_rating_view_pivot rating.rating.view.pivot.project rating.rating xpath Inherits rating.rating_rating_view_pivot
rating_rating_view_search_project rating.rating.search.project rating.rating xpath Inherits rating.rating_rating_view_search
rating_rating_view_tree_project rating.rating.tree.project rating.rating field Inherits rating.rating_rating_view_tree
report_project_task_user_view_tree report.project.task.user.view.tree report.project.task.user tree New
res_config_settings_view_form res.config.settings.view.form.inherit.project res.config.settings xpath Inherits base.res_config_settings_view_form
task_track_depending_tasks task_track_depending_tasks ir.ui.view qweb New
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_project project.project.tree project.project tree New
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_task_graph project.task.graph project.task graph New
view_project_task_pivot project.task.pivot project.task pivot New
view_project_task_type_delete_confirmation_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_delete_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_kanban project.task.type.kanban project.task.type kanban New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.buttons res.partner div Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_search_form project.task.search.form project.task search New
view_task_search_form_extended project.task.search.form.extended project.task xpath Inherits view_task_search_form
view_task_tree2 project.task.tree project.task tree New
Models touched (24)

New fields (2)
  • project_count Integer
    compute='_compute_project_count' args: 'Project Count'
  • project_ids One2many → project.project
    string='Projects' args: 'project.project', 'analytic_account_id'
Public methods (1)
  • action_view_projects(self)

New fields (1)
  • task_ids Many2many → project.task
    string='Tasks' args: 'project.task'
Public methods (0)

No public methods.

New fields (2)
  • kpi_project_task_opened Boolean
    args: 'Open Tasks'
  • kpi_project_task_opened_value Integer
    compute='_compute_project_task_opened_value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (2)
  • partner_id Many2one → res.partner
    readonly=True required=True args: 'res.partner', 'Collaborator'
  • project_id Many2one → project.project
    domain=[('privacy_visibility', '=', 'portal')] readonly=True required=True args: 'project.project', 'Project Shared'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • name_get(self)
  • unlink(self)

New fields (3)
  • project_ids Many2many → project.project
    string='Projects' args: 'project.project'
  • projects_archived Boolean
    compute='_compute_projects_archived'
  • task_count Integer
    compute='_compute_task_count'
Public methods (2)
  • action_archive(self)
  • confirm_delete(self)

New fields (7)
  • deadline Date
    tracking=True
  • is_deadline_exceeded Boolean
    compute='_compute_is_deadline_exceeded'
  • is_deadline_future Boolean
    compute='_compute_is_deadline_future'
  • is_reached Boolean
    default=False string='Reached'
  • name Char
    required=True
  • project_id Many2one → project.project
    default=_get_default_project_id required=True args: 'project.project'
  • reached_date Date
    compute='_compute_reached_date' store=True
Public methods (1)
  • toggle_is_reached(self, is_reached)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (47)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the project without removing it.'
  • alias_enabled Boolean
    compute='_compute_alias_enabled' readonly=False string='Use Email Alias'
  • alias_id Many2one → mail.alias
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • alias_value Char
    compute='_compute_alias_value' string='Alias email'
  • allow_recurring_tasks Boolean
    default=<expr> args: 'Recurring Tasks'
  • allow_subtasks Boolean
    default=<expr> args: 'Sub-tasks'
  • allow_task_dependencies Boolean
    default=<expr> args: 'Task Dependencies'
  • analytic_account_balance Monetary
    related='analytic_account_id.balance'
  • analytic_account_id Many2one → account.analytic.account
    check_company=True copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Analytic account to which this project is linked for financial management. Use an analytic account to record cost and revenue on your project.' ondelete='set null' string='Analytic Account' args: 'account.analytic.account'
  • collaborator_count Integer
    compute='_compute_collaborator_count' compute_sudo=True args: '# Collaborators'
  • collaborator_ids One2many → project.collaborator
    copy=False string='Collaborators' args: 'project.collaborator', 'project_id'
  • color Integer
    string='Color Index'
  • commercial_partner_id Many2one
    related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' string='Currency' args: 'res.currency'
  • date Date
    index=True string='Expiration Date' tracking=True
  • date_start Date
    string='Start Date'
  • description Html
  • doc_count Integer
    compute='_compute_attached_docs_count' string='Number of documents attached'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' help='Whether this project should be displayed on your dashboard.' inverse='_inverse_is_favorite' string='Show Project on Dashboard'
  • label_tasks Char
    default=<expr> help='Label used for the tasks of the project.' string='Use Tasks as' translate=True
  • last_update_color Integer
    compute='_compute_last_update_color'
  • last_update_id Many2one → project.update
    copy=False string='Last Update' args: 'project.update'
  • last_update_status Selection
    compute='_compute_last_update_status' default='on_track' selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold')] store=True
  • milestone_count Integer
    compute='_compute_milestone_count'
  • milestone_ids One2many → project.milestone
    args: 'project.milestone', 'project_id'
  • name Char
    index=True required=True tracking=True translate=True args: 'Name'
  • partner_email Char
    compute='_compute_partner_email' copy=False inverse='_inverse_partner_email' readonly=False store=True string='Email'
  • partner_id Many2one → res.partner
    auto_join=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Customer' tracking=True args: 'res.partner'
  • partner_phone Char
    compute='_compute_partner_phone' copy=False inverse='_inverse_partner_phone' readonly=False store=True string='Phone'
  • privacy_visibility Selection
    default='portal' help='People to whom this project and its tasks will be visible.\n\n- Invited internal users: when following a project, internal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n A user with the project > administrator access right level can still access this project and its tasks, even if they are not explicitly part of the followers.\n\n- All internal users: all internal users can access the project and all of its tasks without distinction.\n\n- Invited portal users and all internal users: all internal users can access the project and all of its tasks without distinction.\nWhen following a project, portal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n\nWhen a project is shared in read-only, the portal user is redirected to their portal. They can view the tasks, but not edit them.\nWhen a project is shared in edit, the portal user is redirected to the kanban and list views of the tasks. They can modify a selected number of fields on the tasks.\n\nIn any case, an internal user with no project access rights can still access a task, provided that they are given the corresponding URL (and that they are part of the followers if the project is private).' required=True string='Visibility' args: [('followers', 'Invited employees'), ('employees', 'All employees'), ('portal', 'Invited portal users and all employees')]
  • rating_active Boolean
    default=<expr> args: 'Customer Ratings'
  • rating_request_deadline Datetime
    compute='_compute_rating_request_deadline' store=True
  • rating_status Selection
    default='stage' help="How to get customer feedback?\n- Rating when changing stage: an email will be sent when a task is pulled to another stage.\n- Periodic rating: an email will be sent periodically.\n\nDon't forget to set up the email templates on the stages for which you want to get customer feedback." required=True args: [('stage', 'Rating when changing stage'), ('periodic', 'Periodic rating')], 'Customer Ratings Status'
  • rating_status_period Selection
    default='monthly' required=True args: [('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a Month'), ('monthly', 'Once a Month'), ('quarterly', 'Quarterly'), ('yearly', 'Yearly')], 'Rating Frequency'
  • resource_calendar_id Many2one → resource.calendar
    related='company_id.resource_calendar_id' string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of Projects.'
  • stage_id Many2one → project.project.stage
    copy=False default=_default_stage_id group_expand='_read_group_stage_ids' groups='project.group_project_stages' index=True ondelete='restrict' string='Stage' tracking=True args: 'project.project.stage'
  • tag_ids Many2many → project.tags
    relation='project_project_project_tags_rel' string='Tags' args: 'project.tags'
  • task_count Integer
    compute='_compute_task_count' string='Task Count'
  • task_count_with_subtasks Integer
    compute='_compute_task_count'
  • task_ids One2many → project.task
    domain=['|', ('stage_id.fold', '=', False), ('stage_id', '=', False)] string='Tasks' args: 'project.task', 'project_id'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • update_ids One2many → project.update
    args: 'project.update', 'project_id'
  • user_id Many2one → res.users
    default=<expr> string='Project Manager' tracking=True args: 'res.users'
Public methods (17)
  • action_unlink(self)
  • action_view_all_rating(self)
    return the action to see all the rating of the project and activate default filters
  • action_view_analytic_account_entries(self)
  • action_view_kanban_project(self)
  • action_view_tasks(self)
  • action_view_tasks_analysis(self)
    return the action to see the tasks analysis report of the project
  • attachment_tree_view(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals)
    @api.model
  • get_last_update_or_default(self)
  • get_panel_data(self)
  • map_tasks(self, new_project_id)
    copy and map tasks from old to new project
  • message_subscribe(self, partner_ids=None, subtype_ids=None)
    Subscribe to all existing active tasks when subscribing to a project
  • message_unsubscribe(self, partner_ids=None)
    Unsubscribe from all tasks when unsubscribing from a project
  • toggle_favorite(self)
  • unlink(self)
  • write(self, vals)

New fields (5)
  • active Boolean
    default=True
  • fold Boolean
    help='This stage is folded in the kanban view.' args: 'Folded in Kanban'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.project')] help='If set, an email will be sent to the customer when the project reaches this step.' string='Email Template' args: 'mail.template'
  • name Char
    required=True translate=True
  • sequence Integer
    default=50
Public methods (0)

No public methods.

New fields (2)
  • access_mode Selection
    args: [('read', 'Readonly'), ('edit', 'Edit')]
  • display_access_mode Boolean
Public methods (2)
  • action_send_mail(self)
  • default_get(self, fields)
    @api.model

New fields (2)
  • color Integer
    default=_get_default_color string='Color'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (87)
  • active Boolean
    default=True
  • allow_recurring_tasks Boolean
    related='project_id.allow_recurring_tasks'
  • allow_subtasks Boolean
    readonly=True related='project_id.allow_subtasks' string='Allow Sub-tasks'
  • allow_task_dependencies Boolean
    related='project_id.allow_task_dependencies'
  • analytic_account_id Many2one → account.analytic.account
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Analytic account to which this task is linked for financial management. Use an analytic account to record cost and revenue on your task. If empty, the analytic account of the project will be used.' ondelete='set null' args: 'account.analytic.account'
  • analytic_tag_ids Many2many → account.analytic.tag
    check_company=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" args: 'account.analytic.tag'
  • attachment_ids One2many → ir.attachment
    compute='_compute_attachment_ids' help="Attachments that don't come from a message." string='Main Attachments' args: 'ir.attachment'
  • child_ids One2many → project.task
    string='Sub-tasks' args: 'project.task', 'parent_id'
  • child_text Char
    compute='_compute_child_text'
  • color Integer
    string='Color Index'
  • commercial_partner_id Many2one
    related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    compute='_compute_company_id' copy=True default=_default_company_id readonly=False required=True store=True string='Company' args: 'res.company'
  • create_date Datetime
    index=True readonly=True args: 'Created On'
  • date_assign Datetime
    copy=False index=True readonly=True string='Assigning Date'
  • date_deadline Date
    copy=False index=True string='Deadline' task_dependency_tracking=True tracking=True
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False index=True readonly=True string='Last Stage Update'
  • depend_on_ids Many2many → project.task
    column1='task_id' column2='depends_on_id' copy=False domain="[('allow_task_dependencies', '=', True), ('id', '!=', id)]" relation='task_dependencies_rel' string='Blocked By' tracking=True args: 'project.task'
  • dependent_ids Many2many → project.task
    column1='depends_on_id' column2='task_id' copy=False domain="[('allow_task_dependencies', '=', True), ('id', '!=', id)]" relation='task_dependencies_rel' string='Block' args: 'project.task'
  • dependent_tasks_count Integer
    compute='_compute_dependent_tasks_count' string='Dependent Tasks'
  • description Html
    sanitize_attributes=False string='Description'
  • display_project_id Many2one → project.project
    index=True args: 'project.project'
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Cover Image' args: 'ir.attachment'
  • email_from Char
    compute='_compute_email_from' copy=False help='These people will receive email.' index=True readonly=False recursive=True store=True string='Email From'
  • fri Boolean
    compute='_compute_repeat' readonly=False string='Fri'
  • is_closed Boolean
    readonly=True related='stage_id.is_closed' related_sudo=False string='Closing Stage'
  • is_private Boolean
    compute='_compute_is_private'
  • kanban_state Selection
    copy=False default='normal' required=True string='Status' args: [('normal', 'In Progress'), ('done', 'Ready'), ('blocked', 'Blocked')]
  • kanban_state_label Char
    compute='_compute_kanban_state_label' string='Kanban State Label' task_dependency_tracking=True tracking=True
  • legend_blocked Char
    readonly=True related='stage_id.legend_blocked' related_sudo=False string='Kanban Blocked Explanation'
  • legend_done Char
    readonly=True related='stage_id.legend_done' related_sudo=False string='Kanban Valid Explanation'
  • legend_normal Char
    readonly=True related='stage_id.legend_normal' related_sudo=False string='Kanban Ongoing Explanation'
  • manager_id Many2one → res.users
    readonly=True related='project_id.user_id' string='Project Manager' args: 'res.users'
  • mon Boolean
    compute='_compute_repeat' readonly=False string='Mon'
  • name Char
    index=True required=True string='Title' tracking=True
  • parent_id Many2one → project.task
    index=True string='Parent Task' args: 'project.task'
  • partner_city Char
    readonly=False related='partner_id.city'
  • partner_email Char
    compute='_compute_partner_email' copy=False inverse='_inverse_partner_email' readonly=False store=True string='Email'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False recursive=True store=True string='Customer' tracking=True args: 'res.partner'
  • partner_is_company Boolean
    readonly=True related='partner_id.is_company'
  • partner_phone Char
    compute='_compute_partner_phone' copy=False inverse='_inverse_partner_phone' readonly=False store=True string='Phone'
  • personal_stage_id Many2one → project.task.stage.personal
    compute='_compute_personal_stage_id' compute_sudo=False help="The current user's personal stage." string='Personal Stage State' args: 'project.task.stage.personal'
  • personal_stage_type_id Many2one → project.task.type
    compute='_compute_personal_stage_type_id' help="The current user's personal task stage." inverse='_inverse_personal_stage_type_id' search='_search_personal_stage_type_id' store=False string='Personal User Stage' args: 'project.task.type'
  • personal_stage_type_ids Many2many → project.task.type
    column1='task_id' column2='stage_id' copy=False depends=['user_ids'] domain="[('user_id', '=', user.id)]" group_expand='_read_group_personal_stage_type_ids' ondelete='restrict' string='Personal Stage' args: 'project.task.type', 'project_task_user_rel'
  • planned_hours Float
    help='Time planned to achieve this task (including its sub-tasks).' tracking=True args: 'Initially Planned Hours'
  • portal_user_names Char
    compute='_compute_portal_user_names' compute_sudo=True search='_search_portal_user_names'
  • priority Selection
    default='0' index=True string='Starred' tracking=True args: [('0', 'Normal'), ('1', 'Important')]
  • project_analytic_account_id Many2one → account.analytic.account
    related='project_id.analytic_account_id' string='Project Analytic Account' args: 'account.analytic.account'
  • project_id Many2one → project.project
    change_default=True check_company=True compute='_compute_project_id' index=True readonly=False recursive=True store=True string='Project' tracking=True args: 'project.project'
  • project_privacy_visibility Selection
    related='project_id.privacy_visibility' string='Project Visibility'
  • recurrence_id Many2one → project.task.recurrence
    copy=False args: 'project.task.recurrence'
  • recurrence_message Char
    compute='_compute_recurrence_message' string='Next Recurrencies'
  • recurrence_update Selection
    default='this' store=False args: [('this', 'This task'), ('subsequent', 'This and following tasks'), ('all', 'All tasks')]
  • recurring_count Integer
    compute='_compute_recurring_count' string='Tasks in Recurrence'
  • recurring_task Boolean
    string='Recurrent'
  • repeat_day Selection
    compute='_compute_repeat' readonly=False args: <expr>
  • repeat_interval Integer
    compute='_compute_repeat' default=1 readonly=False string='Repeat Every'
  • repeat_month Selection
    compute='_compute_repeat' readonly=False args: [('january', 'January'), ('february', 'February'), ('march', 'March'), ('april', 'April'), ('may', 'May'), ('june', 'June'), ('july', 'July'), ('august', 'August'), ('september', 'September'), ('october', 'October'), ('november', 'November'), ('december', 'December')]
  • repeat_number Integer
    compute='_compute_repeat' default=1 readonly=False string='Repetitions'
  • repeat_on_month Selection
    compute='_compute_repeat' default='date' readonly=False args: [('date', 'Date of the Month'), ('day', 'Day of the Month')]
  • repeat_on_year Selection
    compute='_compute_repeat' default='date' readonly=False args: [('date', 'Date of the Year'), ('day', 'Day of the Year')]
  • repeat_show_day Boolean
    compute='_compute_repeat_visibility'
  • repeat_show_dow Boolean
    compute='_compute_repeat_visibility'
  • repeat_show_month Boolean
    compute='_compute_repeat_visibility'
  • repeat_show_week Boolean
    compute='_compute_repeat_visibility'
  • repeat_type Selection
    compute='_compute_repeat' default='forever' readonly=False string='Until' args: [('forever', 'Forever'), ('until', 'End Date'), ('after', 'Number of Repetitions')]
  • repeat_unit Selection
    compute='_compute_repeat' default='week' readonly=False args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    compute='_compute_repeat' readonly=False string='End Date'
  • repeat_week Selection
    compute='_compute_repeat' default='first' readonly=False args: [('first', 'First'), ('second', 'Second'), ('third', 'Third'), ('last', 'Last')]
  • repeat_weekday Selection
    compute='_compute_repeat' readonly=False string='Day Of The Week' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • sat Boolean
    compute='_compute_repeat' readonly=False string='Sat'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of tasks.' index=True string='Sequence'
  • stage_id Many2one → project.task.type
    compute='_compute_stage_id' copy=False default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' task_dependency_tracking=True tracking=True args: 'project.task.type'
  • subtask_count Integer
    compute='_compute_subtask_count' args: 'Sub-task Count'
  • subtask_planned_hours Float
    compute='_compute_subtask_planned_hours' help='Sum of the time planned of all the sub-tasks linked to this task. Usually less than or equal to the initially planned time of this task.' args: 'Sub-tasks Planned Hours'
  • sun Boolean
    compute='_compute_repeat' readonly=False string='Sun'
  • tag_ids Many2many → project.tags
    string='Tags' args: 'project.tags'
  • thu Boolean
    compute='_compute_repeat' readonly=False string='Thu'
  • tue Boolean
    compute='_compute_repeat' readonly=False string='Tue'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' context={'active_test': False} default=<expr> relation='project_task_user_rel' string='Assignees' tracking=True args: 'res.users'
  • website_message_ids One2many
    domain=<expr>
  • wed Boolean
    compute='_compute_repeat' readonly=False string='Wed'
  • working_days_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working Days to Close'
  • working_days_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working Days to Assign'
  • working_hours_close Float
    compute='_compute_elapsed' digits=(16, 2) group_operator='avg' store=True string='Working Hours to Close'
  • working_hours_open Float
    compute='_compute_elapsed' digits=(16, 2) group_operator='avg' store=True string='Working Hours to Assign'
  • write_date Datetime
    index=True readonly=True args: 'Last Updated On'
Public methods (29)
  • SELF_READABLE_FIELDS(self)
    @property
  • SELF_WRITABLE_FIELDS(self)
    @property
  • action_assign_to_me(self)
  • action_continue_recurrence(self)
  • action_dependent_tasks(self)
  • action_open_parent_task(self)
  • action_open_task(self)
  • action_recurring_tasks(self)
  • action_stop_recurrence(self)
  • action_unassign_me(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • copy_data(self, default=None)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, default_fields)
    @api.model
  • email_split(self, msg)
  • fields_get(self, allfields=None, attributes=None)
    @api.model
  • filtered_domain(self, domain)
  • get_empty_list_help(self, help)
    @api.model
  • mapped(self, func)
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_update(self, msg, update_vals=None)
    Override to update the task according to the email.
  • rating_apply(self, rate, token=None, feedback=None, subtype_xmlid=None)
  • rating_get_partner_id(self)
  • rating_get_rated_partner_id(self)
    Overwrite since we have user_ids and not user_id
  • read(self, fields=None, load='_classic_read')
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model
  • stage_find(self, section_id, domain=[], order='sequence, id')
    Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • update_date_end(self, stage_id)
  • write(self, vals)

New fields (10)
  • date Datetime
    readonly=True args: 'Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_group_by Selection
    readonly=True string='Date Group By' args: [('day', 'By Day'), ('month', 'By Month'), ('quarter', 'By quarter'), ('year', 'By Year')]
  • display_project_id Many2one → project.project
    readonly=True args: 'project.project'
  • nb_tasks Integer
    group_operator='sum' readonly=True args: '# of Tasks'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • project_id Many2one → project.project
    readonly=True args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True args: 'project.task.type'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
Public methods (2)
  • init(self)
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    @api.model

New fields (21)
  • fri Boolean
    string='Fri'
  • mon Boolean
    string='Mon'
  • next_recurrence_date Date
  • recurrence_left Integer
    copy=False string='Number of Tasks Left to Create'
  • repeat_day Selection
    args: <expr>
  • repeat_interval Integer
    default=1 string='Repeat Every'
  • repeat_month Selection
    args: [('january', 'January'), ('february', 'February'), ('march', 'March'), ('april', 'April'), ('may', 'May'), ('june', 'June'), ('july', 'July'), ('august', 'August'), ('september', 'September'), ('october', 'October'), ('november', 'November'), ('december', 'December')]
  • repeat_number Integer
    string='Repetitions'
  • repeat_on_month Selection
    args: [('date', 'Date of the Month'), ('day', 'Day of the Month')]
  • repeat_on_year Selection
    args: [('date', 'Date of the Year'), ('day', 'Day of the Year')]
  • repeat_type Selection
    default='forever' string='Until' args: [('forever', 'Forever'), ('until', 'End Date'), ('after', 'Number of Repetitions')]
  • repeat_unit Selection
    default='week' args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    string='End Date'
  • repeat_week Selection
    args: [('first', 'First'), ('second', 'Second'), ('third', 'Third'), ('last', 'Last')]
  • repeat_weekday Selection
    readonly=False string='Day Of The Week' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • sat Boolean
    string='Sat'
  • sun Boolean
    string='Sun'
  • task_ids One2many → project.task
    copy=False args: 'project.task', 'recurrence_id'
  • thu Boolean
    string='Thu'
  • tue Boolean
    string='Tue'
  • wed Boolean
    string='Wed'
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, vals)

New fields (3)
  • stage_id Many2one → project.task.type
    domain="[('user_id', '=', user_id)]" ondelete='restrict' args: 'project.task.type'
  • task_id Many2one → project.task
    index=True ondelete='cascade' required=True args: 'project.task'
  • user_id Many2one → res.users
    index=True ondelete='cascade' required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (15)
  • active Boolean
    default=True args: 'Active'
  • auto_validation_kanban_state Boolean
    default=False help="Automatically modify the kanban state when the customer replies to the feedback for this stage.\n * Good feedback from the customer will update the kanban state to 'ready for the new stage' (green bullet).\n * Neutral or bad feedback will set the kanban state to 'blocked' (red bullet).\n" args: 'Automatic kanban status'
  • description Text
    translate=True
  • disabled_rating_warning Text
    compute='_compute_disabled_rating_warning'
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' string='Folded in Kanban'
  • is_closed Boolean
    help='Tasks in this stage are considered as closed.' args: 'Closing Stage'
  • legend_blocked Char
    default=<expr> help='Override the default value displayed for the blocked state for kanban selection when the task or issue is in that stage.' required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> help='Override the default value displayed for the done state for kanban selection when the task or issue is in that stage.' required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> help='Override the default value displayed for the normal state for kanban selection when the task or issue is in that stage.' required=True translate=True args: 'Grey Kanban Label'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set, an email will be sent to the customer when the task or issue reaches this step.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Name' translate=True
  • project_ids Many2many → project.project
    default=<expr> string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • rating_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help="If set and if the project's rating configuration is 'Rating when changing stage', then an email will be sent to the customer when the task reaches this step." string='Rating Email Template' args: 'mail.template'
  • sequence Integer
    default=1
  • user_id Many2one → res.users
    index=True args: 'res.users', 'Stage Owner'
Public methods (3)
  • remove_personal_stage(self)
    Remove a personal stage, tasks using that stage will move to the first stage with a lower priority if it exists higher if not. This method will not allow to delete the last personal stage. Having no personal_stage_type_id makes the task not appear when grouping by personal stage.
  • unlink_wizard(self, stage_view=False)
  • write(self, vals)

New fields (4)
  • project_ids Many2many → project.project
    domain="['|', ('active', '=', False), ('active', '=', True)]" ondelete='cascade' string='Projects' args: 'project.project'
  • stage_ids Many2many → project.task.type
    ondelete='cascade' string='Stages To Delete' args: 'project.task.type'
  • stages_active Boolean
    compute='_compute_stages_active'
  • tasks_count Integer
    compute='_compute_tasks_count' args: 'Number of Tasks'
Public methods (3)
  • action_archive(self)
  • action_confirm(self)
  • action_unlink(self)

New fields (10)
  • color Integer
    compute='_compute_color'
  • date Date
    default=fields.Date.context_today tracking=True
  • description Html
  • name Char
    required=True tracking=True args: 'Title'
  • name_cropped Char
    compute='_compute_name_cropped'
  • progress Integer
    tracking=True
  • progress_percentage Float
    compute='_compute_progress_percentage'
  • project_id Many2one → project.project
    required=True args: 'project.project'
  • status Selection
    required=True selection=[('on_track', 'On Track'), ('at_risk', 'At Risk'), ('off_track', 'Off Track'), ('on_hold', 'On Hold')] tracking=True
  • user_id Many2one → res.users
    default=<expr> required=True string='Author' args: 'res.users'
Public methods (3)
  • create(self, vals)
    @api.model
  • default_get(self, fields)
  • unlink(self)

New fields (21)
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • create_date Datetime
    readonly=True args: 'Create Date'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • delay_endings_days Float
    digits=(16, 2) group_operator='avg' readonly=True string='Days to Deadline'
  • name Char
    readonly=True string='Task'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • priority Selection
    readonly=True string='Priority' args: [('0', 'Low'), ('1', 'Normal'), ('2', 'High')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • rating_last_value Float
    group_operator='avg' groups='project.group_project_rating' readonly=True args: 'Rating Value (/5)'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='Kanban State' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for Next Stage')]
  • task_id Many2one → project.task
    readonly=True string='Tasks' args: 'project.task'
  • user_ids Many2many → res.users
    column1='task_id' column2='user_id' readonly=True relation='project_task_user_rel' string='Assignees' args: 'res.users'
  • working_days_close Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to close the task' readonly=True string='Working Days to Close'
  • working_days_open Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to open the task' readonly=True string='Working Days to Assign'
  • working_hours_close Float
    digits=(16, 2) group_operator='avg' help='Number of Working Hours to close the task' readonly=True string='Working Hours to Close'
  • working_hours_open Float
    digits=(16, 2) group_operator='avg' help='Number of Working Hours to open the task' readonly=True string='Working Hours to Assign'
Public methods (1)
  • init(self)

New fields (7)
  • group_project_rating Boolean
    implied_group='project.group_project_rating' args: 'Customer Ratings'
  • group_project_recurring_tasks Boolean
    implied_group='project.group_project_recurring_tasks' args: 'Recurring Tasks'
  • group_project_stages Boolean
    implied_group='project.group_project_stages' args: 'Project Stages'
  • group_project_task_dependencies Boolean
    implied_group='project.group_project_task_dependencies' args: 'Task Dependencies'
  • group_subtask_project Boolean
    implied_group='project.group_subtask_project' args: 'Sub-tasks'
  • module_hr_timesheet Boolean
    string='Task Logs'
  • module_project_forecast Boolean
    string='Planning'
Public methods (1)
  • set_values(self)

New fields (2)
  • task_count Integer
    compute='_compute_task_count' string='# Tasks'
  • task_ids One2many → project.task
    string='Tasks' args: 'project.task', 'partner_id'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/project
VERSION
VERSION 1.1
CATEGORY
CATEGORYServices/Project
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, Aaron Bohy, Jeremy Kersten, GitHub, Barad Mahendra, Yannick Tivisse, Adrien Dieudonne, Christophe Monniez, Jorge Pinna Puissant, Alexandre Kühn, Toufik Ben Jaa, Xavier-Do, David Tran, jvm-odoo, Victor Feyens, Andrea Grazioso (agr-odoo), Paul Morelle, Sébastien Theys, Nasreddin (bon), alt-odoo, Julien Mougenot, Jason Van Malder, fw-bot, Lois Rilo, Rémy Baranx (bar), Lucas Lefèvre, Nasreddin Boulif (bon), Swapnesh Shah, IEL, Mathieu Duckerts-Antoine, snd, jbm-odoo, Arnaud Joset, William Braeckman, bit-odoo, Kevin Baptiste, Xavier BOL (xbo), roen-odoo, jdoutreloux, laa, Florian Damhaut, Kaushalya Mandaliya, MerlinGuillaume, nouraellm, Audric Onockx (auon), Yolann Sabaux, Laurent Stukkens (LTU), Vincent Larcin, Ipsita Borisagar, Vishnu Thuletiya, Pierrot (prro), Francois (fge), Thomas Lefebvre (thle), Louis Wicket (wil), Victor Piryns (pivi), Simon Genin (ges), dmonzonis, Pierre Collinet (pic), Nisha patel, Ravi Singh, Krina Oza, Kamlesh Pathekar, Raouf, Kartik Chavda, Hugo Carlier (Huca)
WEBSITE
WEBSITEhttps://www.odoo.com/page/project-management
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - analytic
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - rating
    - resource
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (46)
XML IDNameModelTypeStatus
account_analytic_account_view_form_inherit account.analytic.account.form.inherit account.analytic.account div Inherits analytic.view_account_analytic_account_form
assets_backend project assets ir.ui.view qweb Inherits web.assets_backend
assets_frontend Rating Project Assets ir.ui.view qweb Inherits web.assets_frontend
digest_digest_view_form digest.digest.view.form.inherit.project.task digest.digest xpath Inherits digest.digest_digest_view_form
edit_project project.project.form project.project form New
portal_layout Portal layout: project menu entry ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home Show Projects / Tasks ir.ui.view qweb Inherits portal.portal_my_home
portal_my_project My Project ir.ui.view qweb New
portal_my_projects My Projects ir.ui.view qweb New
portal_my_task My Task ir.ui.view qweb New
portal_my_tasks My Tasks ir.ui.view qweb New
project_delete_wizard_form Delete Project project.delete.wizard form New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_project_view_form_simplified_footer project.project.view.form.simplified project.project xpath Inherits project.project_project_view_form_simplified
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
project_tags_tree_view Tags project.tags tree New
project_task_view_activity project.task.activity project.task activity New
project_task_view_tree_activity project.task.tree.activity project.task tree New
quick_create_task_form project.task.form.quick_create project.task form New
rating_rating_view_form_project rating.rating.form.project rating.rating field Inherits rating.rating_rating_view_form
rating_rating_view_graph rating.rating.view.graph.project rating.rating xpath Inherits rating.rating_rating_view_graph
rating_rating_view_pivot rating.rating.view.pivot.project rating.rating xpath Inherits rating.rating_rating_view_pivot
rating_rating_view_search_project rating.rating.search.project rating.rating xpath Inherits rating.rating_rating_view_search
rating_rating_view_tree_project rating.rating.tree.project rating.rating field Inherits rating.rating_rating_view_tree
res_config_settings_view_form res.config.settings.view.form.inherit.project res.config.settings xpath Inherits base.res_config_settings_view_form
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_project project.project.tree project.project tree New
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_task_graph project.task.graph project.task graph New
view_project_task_pivot project.task.pivot project.task pivot New
view_project_task_type_delete_confirmation_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_delete_wizard project.task.type.delete.wizard.form project.task.type.delete.wizard form New
view_project_task_type_kanban project.task.type.kanban project.task.type kanban New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.buttons res.partner div Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_search_form project.task.search.form project.task search New
view_task_tree2 project.task.tree project.task tree New
Models touched (15)

New fields (2)
  • project_count Integer
    compute='_compute_project_count' args: 'Project Count'
  • project_ids One2many → project.project
    string='Projects' args: 'project.project', 'analytic_account_id'
Public methods (2)
  • action_view_projects(self)
  • unlink(self)

New fields (2)
  • kpi_project_task_opened Boolean
    args: 'Open Tasks'
  • kpi_project_task_opened_value Integer
    compute='_compute_project_task_opened_value'
Public methods (0)

No public methods.

New fields (3)
  • project_ids Many2many → project.project
    string='Projects' args: 'project.project'
  • projects_archived Boolean
    compute='_compute_projects_archived'
  • task_count Integer
    compute='_compute_task_count'
Public methods (2)
  • action_archive(self)
  • confirm_delete(self)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (36)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the project without removing it.'
  • alias_enabled Boolean
    compute='_compute_alias_enabled' readonly=False string='Use email alias'
  • alias_id Many2one → mail.alias
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • allow_recurring_tasks Boolean
    default=<expr> args: 'Recurring Tasks'
  • allow_subtasks Boolean
    default=<expr> args: 'Sub-tasks'
  • allowed_internal_user_ids Many2many → res.users
    default=<expr> domain=[('share', '=', False)] string='Allowed Internal Users' args: 'res.users', 'project_allowed_internal_users_rel'
  • allowed_portal_user_ids Many2many → res.users
    domain=[('share', '=', True)] string='Allowed Portal Users' args: 'res.users', 'project_allowed_portal_users_rel'
  • allowed_user_ids Many2many → res.users
    compute='_compute_allowed_users' inverse='_inverse_allowed_user' args: 'res.users'
  • analytic_account_id Many2one → account.analytic.account
    check_company=True copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Analytic account to which this project is linked for financial management. Use an analytic account to record cost and revenue on your project.' ondelete='set null' string='Analytic Account' args: 'account.analytic.account'
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' string='Currency' args: 'res.currency'
  • date Date
    index=True string='Expiration Date' tracking=True
  • date_start Date
    string='Start Date'
  • description Html
  • doc_count Integer
    compute='_compute_attached_docs_count' string='Number of documents attached'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' help='Whether this project should be displayed on your dashboard.' inverse='_inverse_is_favorite' string='Show Project on dashboard'
  • label_tasks Char
    default='Tasks' help='Label used for the tasks of the project.' string='Use Tasks as' translate=True
  • name Char
    index=True required=True tracking=True args: 'Name'
  • partner_email Char
    compute='_compute_partner_email' copy=False inverse='_inverse_partner_email' readonly=False store=True string='Email'
  • partner_id Many2one → res.partner
    auto_join=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Customer' tracking=True args: 'res.partner'
  • partner_phone Char
    compute='_compute_partner_phone' copy=False inverse='_inverse_partner_phone' readonly=False store=True string='Phone'
  • privacy_visibility Selection
    default='portal' help='People to whom this project and its tasks will be visible.\n\n- Invited internal users: when following a project, internal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n A user with the project > administrator access right level can still access this project and its tasks, even if they are not explicitly part of the followers.\n\n- All internal users: all internal users can access the project and all of its tasks without distinction.\n\n- Invited portal users and all internal users: all internal users can access the project and all of its tasks without distinction.\nWhen following a project, portal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.' required=True string='Visibility' args: [('followers', 'Invited internal users'), ('employees', 'All internal users'), ('portal', 'Invited portal users and all internal users')]
  • rating_active Boolean
    default=<expr> args: 'Customer Ratings'
  • rating_request_deadline Datetime
    compute='_compute_rating_request_deadline' store=True
  • rating_status Selection
    default='stage' help="How to get customer feedback?\n- Rating when changing stage: an email will be sent when a task is pulled in another stage.\n- Periodical Rating: email will be sent periodically.\n\nDon't forget to set up the mail templates on the stages for which you want to get the customer's feedbacks." required=True args: [('stage', 'Rating when changing stage'), ('periodic', 'Periodical Rating')], 'Customer Ratings Status'
  • rating_status_period Selection
    default='monthly' required=True args: [('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a Month'), ('monthly', 'Once a Month'), ('quarterly', 'Quarterly'), ('yearly', 'Yearly')], 'Rating Frequency'
  • resource_calendar_id Many2one → resource.calendar
    related='company_id.resource_calendar_id' string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of Projects.'
  • subtask_project_id Many2one → project.project
    help='Project in which sub-tasks of the current project will be created. It can be the current project itself.' ondelete='restrict' string='Sub-task Project' args: 'project.project'
  • task_count Integer
    compute='_compute_task_count' string='Task Count'
  • task_ids One2many → project.task
    domain=['|', ('stage_id.fold', '=', False), ('stage_id', '=', False)] string='Tasks' args: 'project.task', 'project_id'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • user_id Many2one → res.users
    default=<expr> string='Project Manager' tracking=True args: 'res.users'
Public methods (13)
  • action_unlink(self)
  • action_view_account_analytic_line(self)
    return the action to see all the analytic lines of the project's analytic account
  • action_view_all_rating(self)
    return the action to see all the rating of the project and activate default filters
  • action_view_tasks(self)
  • attachment_tree_view(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals)
    @api.model
  • map_tasks(self, new_project_id)
    copy and map tasks from old to new project
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
    Subscribe to all existing active tasks when subscribing to a project And add the portal user subscribed to allowed portal users
  • message_unsubscribe(self, partner_ids=None, channel_ids=None)
    Unsubscribe from all tasks when unsubscribing from a project
  • toggle_favorite(self)
  • unlink(self)
  • write(self, vals)

New fields (2)
  • color Integer
    default=_get_default_color string='Color'
  • name Char
    required=True args: 'Name'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (77)
  • active Boolean
    default=True
  • allow_recurring_tasks Boolean
    related='project_id.allow_recurring_tasks'
  • allow_subtasks Boolean
    readonly=True related='project_id.allow_subtasks' string='Allow Sub-tasks'
  • allowed_user_ids Many2many → res.users
    compute='_compute_allowed_user_ids' copy=False groups='project.group_project_manager' readonly=False store=True string='Visible to' args: 'res.users'
  • attachment_ids One2many → ir.attachment
    compute='_compute_attachment_ids' help="Attachment that don't come from message." string='Main Attachments' args: 'ir.attachment'
  • child_ids One2many → project.task
    context={'active_test': False} string='Sub-tasks' args: 'project.task', 'parent_id'
  • color Integer
    string='Color Index'
  • commercial_partner_id Many2one
    related='partner_id.commercial_partner_id'
  • company_id Many2one → res.company
    compute='_compute_company_id' copy=True default=_default_company_id readonly=False required=True store=True string='Company' args: 'res.company'
  • create_date Datetime
    index=True readonly=True args: 'Created On'
  • date_assign Datetime
    copy=False index=True readonly=True string='Assigning Date'
  • date_deadline Date
    copy=False index=True string='Deadline' tracking=True
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False index=True readonly=True string='Last Stage Update'
  • description Html
    string='Description'
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Cover Image' args: 'ir.attachment'
  • email_from Char
    compute='_compute_email_from' copy=False help='These people will receive email.' index=True readonly=False store='True' string='Email From'
  • fri Boolean
    compute='_compute_repeat' readonly=False string='Fri'
  • is_closed Boolean
    readonly=True related='stage_id.is_closed' related_sudo=False string='Closing Stage'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'In Progress'), ('done', 'Ready'), ('blocked', 'Blocked')]
  • kanban_state_label Char
    compute='_compute_kanban_state_label' string='Kanban State Label' tracking=True
  • legend_blocked Char
    readonly=True related='stage_id.legend_blocked' related_sudo=False string='Kanban Blocked Explanation'
  • legend_done Char
    readonly=True related='stage_id.legend_done' related_sudo=False string='Kanban Valid Explanation'
  • legend_normal Char
    readonly=True related='stage_id.legend_normal' related_sudo=False string='Kanban Ongoing Explanation'
  • manager_id Many2one → res.users
    readonly=True related='project_id.user_id' string='Project Manager' args: 'res.users'
  • mon Boolean
    compute='_compute_repeat' readonly=False string='Mon'
  • name Char
    index=True required=True string='Title' tracking=True
  • parent_id Many2one → project.task
    index=True string='Parent Task' args: 'project.task'
  • partner_city Char
    readonly=False related='partner_id.city'
  • partner_email Char
    compute='_compute_partner_email' copy=False inverse='_inverse_partner_email' readonly=False store=True string='Email'
  • partner_id Many2one → res.partner
    compute='_compute_partner_id' domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" readonly=False store=True string='Customer' args: 'res.partner'
  • partner_is_company Boolean
    readonly=True related='partner_id.is_company'
  • partner_phone Char
    compute='_compute_partner_phone' copy=False inverse='_inverse_partner_phone' readonly=False store=True string='Phone'
  • planned_hours Float
    help='Time planned to achieve this task (including its sub-tasks).' tracking=True args: 'Initially Planned Hours'
  • priority Selection
    default='0' index=True string='Priority' args: [('0', 'Normal'), ('1', 'Important')]
  • project_id Many2one → project.project
    change_default=True check_company=True compute='_compute_project_id' index=True readonly=False store=True string='Project' tracking=True args: 'project.project'
  • project_privacy_visibility Selection
    related='project_id.privacy_visibility' string='Project Visibility'
  • recurrence_id Many2one → project.task.recurrence
    copy=False args: 'project.task.recurrence'
  • recurrence_message Char
    compute='_compute_recurrence_message' string='Next Recurrencies'
  • recurrence_update Selection
    default='this' store=False args: [('this', 'This task'), ('subsequent', 'This and following tasks'), ('all', 'All tasks')]
  • recurring_count Integer
    compute='_compute_recurring_count' string='Tasks in Recurrence'
  • recurring_task Boolean
    string='Recurrent'
  • repeat_day Selection
    compute='_compute_repeat' readonly=False args: <expr>
  • repeat_interval Integer
    compute='_compute_repeat' default=1 readonly=False string='Repeat Every'
  • repeat_month Selection
    compute='_compute_repeat' readonly=False args: [('january', 'January'), ('february', 'February'), ('march', 'March'), ('april', 'April'), ('may', 'May'), ('june', 'June'), ('july', 'July'), ('august', 'August'), ('september', 'September'), ('october', 'October'), ('november', 'November'), ('december', 'December')]
  • repeat_number Integer
    compute='_compute_repeat' default=1 readonly=False string='Repetitions'
  • repeat_on_month Selection
    compute='_compute_repeat' default='date' readonly=False args: [('date', 'Date of the Month'), ('day', 'Day of the Month')]
  • repeat_on_year Selection
    compute='_compute_repeat' default='date' readonly=False args: [('date', 'Date of the Year'), ('day', 'Day of the Year')]
  • repeat_show_day Boolean
    compute='_compute_repeat_visibility'
  • repeat_show_dow Boolean
    compute='_compute_repeat_visibility'
  • repeat_show_month Boolean
    compute='_compute_repeat_visibility'
  • repeat_show_week Boolean
    compute='_compute_repeat_visibility'
  • repeat_type Selection
    compute='_compute_repeat' default='forever' readonly=False string='Until' args: [('forever', 'Forever'), ('until', 'End Date'), ('after', 'Number of Repetitions')]
  • repeat_unit Selection
    compute='_compute_repeat' default='week' readonly=False args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    compute='_compute_repeat' readonly=False string='End Date'
  • repeat_week Selection
    compute='_compute_repeat' default='first' readonly=False args: [('first', 'First'), ('second', 'Second'), ('third', 'Third'), ('last', 'Last')]
  • repeat_weekday Selection
    compute='_compute_repeat' readonly=False string='Day Of The Week' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • ribbon_message Char
    compute='_compute_ribbon_message' args: 'Ribbon message'
  • sat Boolean
    compute='_compute_repeat' readonly=False string='Sat'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of tasks.' index=True string='Sequence'
  • stage_id Many2one → project.task.type
    compute='_compute_stage_id' copy=False default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' readonly=False store=True string='Stage' tracking=True args: 'project.task.type'
  • subtask_count Integer
    compute='_compute_subtask_count' args: 'Sub-task count'
  • subtask_planned_hours Float
    compute='_compute_subtask_planned_hours' help='Sum of the time planned of all the sub-tasks linked to this task. Usually less or equal to the initially time planned of this task.' args: 'Sub-tasks Planned Hours'
  • subtask_project_id Many2one → project.project
    readonly=True related='project_id.subtask_project_id' string='Sub-task Project' args: 'project.project'
  • sun Boolean
    compute='_compute_repeat' readonly=False string='Sun'
  • tag_ids Many2many → project.tags
    string='Tags' args: 'project.tags'
  • thu Boolean
    compute='_compute_repeat' readonly=False string='Thu'
  • tue Boolean
    compute='_compute_repeat' readonly=False string='Tue'
  • user_email Char
    readonly=True related='user_id.email' related_sudo=False string='User Email'
  • user_id Many2one → res.users
    default=<expr> index=True string='Assigned to' tracking=True args: 'res.users'
  • website_message_ids One2many
    domain=<expr>
  • wed Boolean
    compute='_compute_repeat' readonly=False string='Wed'
  • working_days_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working days to close'
  • working_days_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working days to assign'
  • working_hours_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working hours to close'
  • working_hours_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working hours to assign'
  • write_date Datetime
    index=True readonly=True args: 'Last Updated On'
Public methods (18)
  • action_assign_to_me(self)
  • action_open_parent_task(self)
  • action_recurring_tasks(self)
  • action_subtask(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals_list)
    @api.model_create_multi
  • default_get(self, default_fields)
    @api.model
  • email_split(self, msg)
  • get_empty_list_help(self, help)
    @api.model
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
    Add the users subscribed to allowed portal users
  • message_update(self, msg, update_vals=None)
    Override to update the task according to the email.
  • rating_apply(self, rate, token=None, feedback=None, subtype_xmlid=None)
  • rating_get_partner_id(self)
  • stage_find(self, section_id, domain=[], order='sequence')
    Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • unlink(self)
  • update_date_end(self, stage_id)
  • write(self, vals)

New fields (21)
  • fri Boolean
    string='Fri'
  • mon Boolean
    string='Mon'
  • next_recurrence_date Date
  • recurrence_left Integer
    string='Number of tasks left to create'
  • repeat_day Selection
    args: <expr>
  • repeat_interval Integer
    default=1 string='Repeat Every'
  • repeat_month Selection
    args: [('january', 'January'), ('february', 'February'), ('march', 'March'), ('april', 'April'), ('may', 'May'), ('june', 'June'), ('july', 'July'), ('august', 'August'), ('september', 'September'), ('october', 'October'), ('november', 'November'), ('december', 'December')]
  • repeat_number Integer
    string='Repetitions'
  • repeat_on_month Selection
    args: [('date', 'Date of the Month'), ('day', 'Day of the Month')]
  • repeat_on_year Selection
    args: [('date', 'Date of the Year'), ('day', 'Day of the Year')]
  • repeat_type Selection
    default='forever' string='Until' args: [('forever', 'Forever'), ('until', 'End Date'), ('after', 'Number of Repetitions')]
  • repeat_unit Selection
    default='week' args: [('day', 'Days'), ('week', 'Weeks'), ('month', 'Months'), ('year', 'Years')]
  • repeat_until Date
    string='End Date'
  • repeat_week Selection
    args: [('first', 'First'), ('second', 'Second'), ('third', 'Third'), ('last', 'Last')]
  • repeat_weekday Selection
    readonly=False string='Day Of The Week' args: [('mon', 'Monday'), ('tue', 'Tuesday'), ('wed', 'Wednesday'), ('thu', 'Thursday'), ('fri', 'Friday'), ('sat', 'Saturday'), ('sun', 'Sunday')]
  • sat Boolean
    string='Sat'
  • sun Boolean
    string='Sun'
  • task_ids One2many → project.task
    args: 'project.task', 'recurrence_id'
  • thu Boolean
    string='Thu'
  • tue Boolean
    string='Tue'
  • wed Boolean
    string='Wed'
Public methods (2)
  • create(self, vals)
    @api.model
  • write(self, vals)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (14)
  • active Boolean
    default=True args: 'Active'
  • auto_validation_kanban_state Boolean
    default=False help="Automatically modify the kanban state when the customer replies to the feedback for this stage.\n * A good feedback from the customer will update the kanban state to 'ready for the new stage' (green bullet).\n * A medium or a bad feedback will set the kanban state to 'blocked' (red bullet).\n" args: 'Automatic kanban status'
  • description Text
    translate=True
  • disabled_rating_warning Text
    compute='_compute_disabled_rating_warning'
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' string='Folded in Kanban'
  • is_closed Boolean
    help='Tasks in this stage are considered as closed.' args: 'Closing Stage'
  • legend_blocked Char
    default=<expr> help='Override the default value displayed for the blocked state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> help='Override the default value displayed for the done state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> help='Override the default value displayed for the normal state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Grey Kanban Label'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set an email will be sent to the customer when the task or issue reaches this step.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Stage Name' translate=True
  • project_ids Many2many → project.project
    default=_get_default_project_ids string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • rating_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help="If set and if the project's rating configuration is 'Rating when changing stage', then an email will be sent to the customer when the task reaches this step." string='Rating Email Template' args: 'mail.template'
  • sequence Integer
    default=1
Public methods (2)
  • unlink_wizard(self, stage_view=False)
  • write(self, vals)

New fields (4)
  • project_ids Many2many → project.project
    domain="['|', ('active', '=', False), ('active', '=', True)]" ondelete='cascade' string='Projects' args: 'project.project'
  • stage_ids Many2many → project.task.type
    ondelete='cascade' string='Stages To Delete' args: 'project.task.type'
  • stages_active Boolean
    compute='_compute_stages_active'
  • tasks_count Integer
    compute='_compute_tasks_count' args: 'Number of tasks'
Public methods (3)
  • action_archive(self)
  • action_confirm(self)
  • action_unlink(self)

New fields (16)
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_assign Datetime
    readonly=True string='Assignment Date'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • delay_endings_days Float
    digits=(16, 2) readonly=True string='# Days to Deadline'
  • name Char
    readonly=True string='Task Title'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • priority Selection
    readonly=True string='Priority' args: [('0', 'Low'), ('1', 'Normal'), ('2', 'High')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='Kanban State' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • user_id Many2one → res.users
    readonly=True string='Assigned To' args: 'res.users'
  • working_days_close Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to close the task' readonly=True string='# Working Days to Close'
  • working_days_open Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to Open the task' readonly=True string='# Working Days to Assign'
Public methods (1)
  • init(self)

New fields (5)
  • group_project_rating Boolean
    implied_group='project.group_project_rating' args: 'Customer Ratings'
  • group_project_recurring_tasks Boolean
    implied_group='project.group_project_recurring_tasks' args: 'Recurring Tasks'
  • group_subtask_project Boolean
    implied_group='project.group_subtask_project' args: 'Sub-tasks'
  • module_hr_timesheet Boolean
    string='Task Logs'
  • module_project_forecast Boolean
    string='Planning'
Public methods (1)
  • set_values(self)

New fields (2)
  • task_count Integer
    compute='_compute_task_count' string='# Tasks'
  • task_ids One2many → project.task
    string='Tasks' args: 'project.task', 'partner_id'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/project
VERSION
VERSION 1.1
CATEGORY
CATEGORYOperations/Project
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Mohammed Shekha, Nicolas Martinelli, Nicolas Lempereur, qdp-odoo, Aaron Bohy, Jeremy Kersten, Barad Mahendra, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Romain Derie, Jigar Patel, jem-odoo, Adrien Dieudonne, Jorge Pinna Puissant, Nans Lefebvre, Alexandre Kühn, Adrian Torres, Xavier-Do, jvm-odoo, Victor Feyens, Andrea Grazioso (agr-odoo), Sébastien Theys, Nasreddin (bon), Jason Van Malder, fw-bot, Lois Rilo, Naglis Jonaitis, Prakash Prajapati, Swapnesh Shah, IEL, Mathieu Duckerts-Antoine, Pierre Paridans, snd, Kevin Baptiste, Jordi Ballester, qmo-odoo, Geoffroy Larue, Florian Damhaut, Hetal Dhanak, Audric Onockx (auon), Vincent Larcin, Ipsita Borisagar, Vishnu Thuletiya
WEBSITE
WEBSITEhttps://www.odoo.com/page/project-management
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - analytic
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - rating
    - resource
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (45)
XML IDNameModelTypeStatus
account_analytic_account_view_form_inherit account.analytic.account.form.inherit account.analytic.account div Inherits analytic.view_account_analytic_account_form
assets_backend project assets ir.ui.view qweb Inherits web.assets_backend
assets_frontend Rating Project Assets ir.ui.view qweb Inherits web.assets_frontend
digest_digest_view_form digest.digest.view.form.inherit.project.task digest.digest xpath Inherits digest.digest_digest_view_form
edit_project project.project.form project.project form New
portal_layout Portal layout: project menu entry ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home Portal My Home: project entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_project My Project ir.ui.view qweb New
portal_my_projects My Projects ir.ui.view qweb New
portal_my_task My Task ir.ui.view qweb New
portal_my_tasks My Tasks ir.ui.view qweb New
portal_project_rating_partner_stat portal_project_rating_partner_stat ir.ui.view qweb New
portal_project_rating_popover portal_project_rating_popover ir.ui.view qweb New
portal_project_rating_progressbar portal_project_rating_progressbar ir.ui.view qweb New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_project_view_form_simplified_footer project.project.view.form.simplified project.project xpath Inherits project.project_project_view_form_simplified
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
project_tags_tree_view Tags project.tags tree New
project_task_view_activity project.task.activity project.task activity New
project_task_view_tree_activity project.task.tree.activity project.task tree New
project_view_kanban project.project.kanban project.project kanban New
quick_create_task_form project.task.form.quick_create project.task form New
rating_index Project Rating List ir.ui.view qweb New
rating_project_rating_page Project Rating Page ir.ui.view qweb New
rating_rating_view_search_project rating.rating.search.project rating.rating xpath Inherits rating.rating_rating_view_search
res_config_settings_view_form res.config.settings.view.form.inherit.project res.config.settings xpath Inherits base.res_config_settings_view_form
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_project project.project.tree project.project tree New
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_task_graph project.task.graph project.task graph New
view_project_task_pivot project.task.pivot project.task pivot New
view_project_task_type_kanban project.task.type.kanban project.task.type kanban New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.buttons res.partner div Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_search_form project.task.search.form project.task search New
view_task_tree2 project.task.tree project.task tree New
Models touched (9)

New fields (2)
  • project_count Integer
    compute='_compute_project_count' args: 'Project Count'
  • project_ids One2many → project.project
    string='Projects' args: 'project.project', 'analytic_account_id'
Public methods (2)
  • action_view_projects(self)
  • unlink(self)

New fields (2)
  • kpi_project_task_opened Boolean
    args: 'Open Tasks'
  • kpi_project_task_opened_value Integer
    compute='_compute_project_task_opened_value'
Public methods (1)
  • compute_kpis_actions(self, company, user)

New fields (27)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the project without removing it.'
  • alias_id Many2one → mail.alias
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • analytic_account_id Many2one → account.analytic.account
    check_company=True copy=False domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Analytic account to which this project is linked for financial management. Use an analytic account to record cost and revenue on your project.' ondelete='set null' string='Analytic Account' args: 'account.analytic.account'
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' string='Currency' args: 'res.currency'
  • date Date
    index=True string='Expiration Date' tracking=True
  • date_start Date
    string='Start Date'
  • doc_count Integer
    compute='_compute_attached_docs_count' string='Number of documents attached'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' help='Whether this project should be displayed on your dashboard.' inverse='_inverse_is_favorite' string='Show Project on dashboard'
  • label_tasks Char
    default='Tasks' help='Label used for the tasks of the project.' string='Use Tasks as' translate=True
  • name Char
    index=True required=True tracking=True args: 'Name'
  • partner_id Many2one → res.partner
    auto_join=True domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Customer' tracking=True args: 'res.partner'
  • portal_show_rating Boolean
    copy=False args: 'Rating visible publicly'
  • privacy_visibility Selection
    default='portal' help='People to whom this project and its tasks will be visible.\n\n- Invited internal users: when following a project, internal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n A user with the project > administrator access right level can still access this project and its tasks, even if they are not explicitly part of the followers.\n\n- All internal users: all internal users can access the project and all of its tasks without distinction.\n\n- Invited portal users and all internal users: all internal users can access the project and all of its tasks without distinction.\nWhen following a project, portal users will get access to all of its tasks without distinction. Otherwise, they will only get access to the specific tasks they are following.\n\nIn any case, an internal user with no project access rights can still access a task, provided that they are given the corresponding URL (and that they are part of the followers if the project is private).' required=True string='Visibility' args: [('followers', 'Invited internal users'), ('employees', 'All internal users'), ('portal', 'Invited portal users and all internal users')]
  • rating_request_deadline Datetime
    compute='_compute_rating_request_deadline' store=True
  • rating_status Selection
    default='no' help="How to get customer feedback?\n- Rating when changing stage: an email will be sent when a task is pulled in another stage.\n- Periodical Rating: email will be sent periodically.\n\nDon't forget to set up the mail templates on the stages for which you want to get the customer's feedbacks." required=True args: [('stage', 'Rating when changing stage'), ('periodic', 'Periodical Rating'), ('no', 'No rating')], 'Customer(s) Ratings'
  • rating_status_period Selection
    args: [('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a Month'), ('monthly', 'Once a Month'), ('quarterly', 'Quarterly'), ('yearly', 'Yearly')], 'Rating Frequency'
  • resource_calendar_id Many2one → resource.calendar
    default=<expr> domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" help='Timetable working hours to adjust the gantt diagram report' string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of Projects.'
  • subtask_project_id Many2one → project.project
    help='Project in which sub-tasks of the current project will be created. It can be the current project itself.' ondelete='restrict' string='Sub-task Project' args: 'project.project'
  • task_count Integer
    compute='_compute_task_count' string='Task Count'
  • task_ids One2many → project.task
    domain=['|', ('stage_id.fold', '=', False), ('stage_id', '=', False)] string='Tasks' args: 'project.task', 'project_id'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • user_id Many2one → res.users
    default=<expr> string='Project Manager' tracking=True args: 'res.users'
Public methods (15)
  • action_view_account_analytic_line(self)
    return the action to see all the analytic lines of the project's analytic account
  • action_view_all_rating(self)
    return the action to see all the rating of the project, and activate default filters
  • activate_sample_project(self)
    @api.model
    Unarchives the sample project 'project.project_project_data' and reloads the project dashboard
  • attachment_tree_view(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • map_tasks(self, new_project_id)
    copy and map tasks from old to new project
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
    Subscribe to all existing active tasks when subscribing to a project
  • message_unsubscribe(self, partner_ids=None, channel_ids=None)
    Unsubscribe from all tasks when unsubscribing from a project
  • open_tasks(self)
  • toggle_favorite(self)
  • unlink(self)
  • write(self, vals)

New fields (2)
  • color Integer
    string='Color Index'
  • name Char
    required=True args: 'Tag Name'
Public methods (0)

No public methods.

New fields (41)
  • active Boolean
    default=True
  • attachment_ids One2many → ir.attachment
    compute='_compute_attachment_ids' help="Attachment that don't come from message." string='Main Attachments' args: 'ir.attachment'
  • child_ids One2many → project.task
    context={'active_test': False} string='Sub-tasks' args: 'project.task', 'parent_id'
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    default=_default_company_id required=True string='Company' args: 'res.company'
  • create_date Datetime
    index=True readonly=True args: 'Created On'
  • date_assign Datetime
    copy=False index=True readonly=True string='Assigning Date'
  • date_deadline Date
    copy=False index=True string='Deadline' tracking=True
  • date_deadline_formatted Char
    compute='_compute_date_deadline_formatted'
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False index=True readonly=True string='Last Stage Update'
  • description Html
    string='Description'
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Cover Image' args: 'ir.attachment'
  • email_from Char
    help='These people will receive email.' index=True string='Email'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • kanban_state_label Char
    compute='_compute_kanban_state_label' string='Kanban State Label' tracking=True
  • legend_blocked Char
    readonly=True related='stage_id.legend_blocked' related_sudo=False string='Kanban Blocked Explanation'
  • legend_done Char
    readonly=True related='stage_id.legend_done' related_sudo=False string='Kanban Valid Explanation'
  • legend_normal Char
    readonly=True related='stage_id.legend_normal' related_sudo=False string='Kanban Ongoing Explanation'
  • manager_id Many2one → res.users
    readonly=True related='project_id.user_id' related_sudo=False string='Project Manager' args: 'res.users'
  • name Char
    index=True required=True string='Title' tracking=True
  • parent_id Many2one → project.task
    index=True string='Parent Task' args: 'project.task'
  • partner_city Char
    readonly=False related='partner_id.city'
  • partner_id Many2one → res.partner
    default=<expr> domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]" string='Customer' args: 'res.partner'
  • planned_hours Float
    help='It is the time planned to achieve the task. If this document has sub-tasks, it means the time needed to achieve this tasks and its childs.' tracking=True args: 'Planned Hours'
  • priority Selection
    default='0' index=True string='Priority' args: [('0', 'Normal'), ('1', 'Important')]
  • project_id Many2one → project.project
    change_default=True check_company=True default=<expr> index=True string='Project' tracking=True args: 'project.project'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of tasks.' index=True string='Sequence'
  • stage_id Many2one → project.task.type
    copy=False default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' string='Stage' tracking=True args: 'project.task.type'
  • subtask_count Integer
    compute='_compute_subtask_count' args: 'Sub-task count'
  • subtask_planned_hours Float
    compute='_compute_subtask_planned_hours' help='Computed using sum of hours planned of all subtasks created from main task. Usually these hours are less or equal to the Planned Hours (of main task).' args: 'Subtasks'
  • subtask_project_id Many2one → project.project
    readonly=True related='project_id.subtask_project_id' string='Sub-task Project' args: 'project.project'
  • tag_ids Many2many → project.tags
    string='Tags' args: 'project.tags'
  • user_email Char
    readonly=True related='user_id.email' related_sudo=False string='User Email'
  • user_id Many2one → res.users
    default=<expr> index=True string='Assigned to' tracking=True args: 'res.users'
  • website_message_ids One2many
    domain=<expr>
  • working_days_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working days to close'
  • working_days_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working days to assign'
  • working_hours_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working hours to close'
  • working_hours_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working hours to assign'
  • write_date Datetime
    index=True readonly=True args: 'Last Updated On'
Public methods (15)
  • action_assign_to_me(self)
  • action_open_parent_task(self)
  • action_subtask(self)
  • copy(self, default=None)
    @api.returns('self', <expr>)
  • create(self, vals)
    @api.model
  • default_get(self, fields_list)
    @api.model
  • email_split(self, msg)
  • get_empty_list_help(self, help)
    @api.model
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_update(self, msg, update_vals=None)
    Override to update the task according to the email.
  • rating_apply(self, rate, token=None, feedback=None, subtype=None)
  • rating_get_partner_id(self)
  • stage_find(self, section_id, domain=[], order='sequence')
    Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • update_date_end(self, stage_id)
  • write(self, vals)

New fields (11)
  • auto_validation_kanban_state Boolean
    default=False help="Automatically modify the kanban state when the customer replies to the feedback for this stage.\n * A good feedback from the customer will update the kanban state to 'ready for the new stage' (green bullet).\n * A medium or a bad feedback will set the kanban state to 'blocked' (red bullet).\n" args: 'Automatic kanban status'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' string='Folded in Kanban'
  • legend_blocked Char
    default=<expr> help='Override the default value displayed for the blocked state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> help='Override the default value displayed for the done state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> help='Override the default value displayed for the normal state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Grey Kanban Label'
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set an email will be sent to the customer when the task or issue reaches this step.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Stage Name' translate=True
  • project_ids Many2many → project.project
    default=_get_default_project_ids string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • rating_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help="If set and if the project's rating configuration is 'Rating when changing stage', then an email will be sent to the customer when the task reaches this step." string='Rating Email Template' args: 'mail.template'
  • sequence Integer
    default=1
Public methods (1)
  • unlink(self)

New fields (16)
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_assign Datetime
    readonly=True string='Assignation Date'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • delay_endings_days Float
    digits=(16, 2) readonly=True string='# Days to Deadline'
  • name Char
    readonly=True string='Task Title'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • priority Selection
    readonly=True string='Priority' args: [('0', 'Low'), ('1', 'Normal'), ('2', 'High')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='Kanban State' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • user_id Many2one → res.users
    readonly=True string='Assigned To' args: 'res.users'
  • working_days_close Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to close the task' readonly=True string='# Working Days to Close'
  • working_days_open Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to Open the task' readonly=True string='# Working Days to Assign'
Public methods (1)
  • init(self)

New fields (4)
  • group_project_rating Boolean
    implied_group='project.group_project_rating' args: 'Use Rating on Project'
  • group_subtask_project Boolean
    implied_group='project.group_subtask_project' args: 'Sub-tasks'
  • module_hr_timesheet Boolean
    string='Task Logs'
  • module_project_forecast Boolean
    string='Forecasts'
Public methods (0)

No public methods.

New fields (2)
  • task_count Integer
    compute='_compute_task_count' string='# Tasks'
  • task_ids One2many → project.task
    string='Tasks' args: 'project.task', 'partner_id'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/project
VERSION
VERSION 1.1
CATEGORY
CATEGORYProject
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, GitHub, Yannick Tivisse, Alexandre Kühn, qsm-odoo, Martin Geubelle, Nicolas Seinlet, Romain Derie, Toufik Benjaa, jem-odoo, Adrien Dieudonne, RomainLibert, Christophe Monniez, len-odoo, Julien (juc) Castiaux, Nans Lefebvre, Alexandre Kühn, Toufik Ben Jaa, fda-odoo, XavierDo, Julien Castiaux, Priyanka Kakadiya, Xavier-Do, jvm-odoo, Andrea Grazioso (agr-odoo), Sébastien Theys, Nasreddin (bon), Jason Van Malder, Kinjal Mehta, Quentin Smetz (qsm), David Beguin, Adrien Widart, LofbergValentin, Swapnesh Shah, Pierre Paridans, Kevin Baptiste
WEBSITE
WEBSITEhttps://www.odoo.com/page/project-management
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - mail
    - bus
    - web_tour
    - portal
    - http_routing
    - rating
    - resource
    - digest
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (42)
XML IDNameModelTypeStatus
assets_backend project assets ir.ui.view qweb Inherits web.assets_backend
assets_frontend Rating Project Assets ir.ui.view qweb Inherits web.assets_frontend
digest_digest_view_form digest.digest.view.form.inherit.project.task digest.digest xpath Inherits digest.digest_digest_view_form
edit_project project.project.form project.project form New
portal_layout Portal layout: project menu entry ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_my_home Portal My Home: project entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_project My Project ir.ui.view qweb New
portal_my_projects My Projects ir.ui.view qweb New
portal_my_task My Task ir.ui.view qweb New
portal_my_tasks My Tasks ir.ui.view qweb New
portal_project_rating_partner_stat portal_project_rating_partner_stat ir.ui.view qweb New
portal_project_rating_popover portal_project_rating_popover ir.ui.view qweb New
portal_project_rating_progressbar portal_project_rating_progressbar ir.ui.view qweb New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
project_task_view_tree_activity project.task.tree.activity project.task tree New
project_view_kanban project.project.kanban project.project kanban New
quick_create_task_form project.task.form.quick_create project.task form New
qunit_suite project_test ir.ui.view qweb Inherits web.qunit_suite
rating_index Project Rating List ir.ui.view qweb New
rating_project_rating_page Project Rating Page ir.ui.view qweb New
rating_rating_view_search_project rating.rating.search.project rating.rating xpath Inherits rating.rating_rating_view_search
res_config_settings_view_form res.config.settings.view.form.inherit.project res.config.settings xpath Inherits base.res_config_settings_view_form
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_project project.project.tree project.project tree New
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_task_graph project.task.graph project.task graph New
view_project_task_pivot project.task.pivot project.task pivot New
view_project_task_type_kanban project.task.type.kanban project.task.type kanban New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.buttons res.partner button Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_search_form project.task.search.form project.task search New
view_task_tree2 project.task.tree project.task tree New
Models touched (8)

New fields (2)
  • kpi_project_task_opened Boolean
    args: 'Open Tasks'
  • kpi_project_task_opened_value Integer
    compute='_compute_project_task_opened_value'
Public methods (1)
  • compute_kpis_actions(self, company, user)

New fields (28)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the project without removing it.'
  • alias_id Many2one → mail.alias
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • currency_id Many2one → res.currency
    readonly=True related='company_id.currency_id' string='Currency' args: 'res.currency'
  • date Date
    index=True string='Expiration Date' track_visibility='onchange'
  • date_start Date
    string='Start Date'
  • doc_count Integer
    compute='_compute_attached_docs_count' string='Number of documents attached'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' help='Whether this project should be displayed on the dashboard or not' inverse='_inverse_is_favorite' string='Show Project on dashboard'
  • label_tasks Char
    default=<expr> help="Gives label to tasks on project's kanban view." string='Use Tasks as' translate=True
  • name Char
    index=True required=True track_visibility='onchange' args: 'Name'
  • partner_id Many2one → res.partner
    auto_join=True string='Customer' track_visibility='onchange' args: 'res.partner'
  • percentage_satisfaction_project Integer
    compute='_compute_percentage_satisfaction_project' default=-1 store=True string='Happy % on Project'
  • percentage_satisfaction_task Integer
    compute='_compute_percentage_satisfaction_task' default=-1 store=True string='Happy % on Task'
  • portal_show_rating Boolean
    copy=False oldname='website_published' args: 'Rating visible publicly'
  • privacy_visibility Selection
    default='portal' help='Holds visibility of the tasks or issues that belong to the current project:\n- On invitation only: Employees may only see the followed project, tasks or issues\n- Visible by all employees: Employees may see all project, tasks or issues\n- Visible by following customers: employees see everything;\n if website is activated, portal users may see project, tasks or issues followed by\n them or by someone of their company\n' required=True string='Privacy' args: [('followers', 'On invitation only'), ('employees', 'Visible by all employees'), ('portal', 'Visible by following customers')]
  • rating_request_deadline Datetime
    compute='_compute_rating_request_deadline' store=True
  • rating_status Selection
    default='no' help="How to get the customer's feedbacks?\n- Rating when changing stage: Email will be sent when a task/issue is pulled in another stage\n- Periodical Rating: Email will be sent periodically\n\nDon't forget to set up the mail templates on the stages for which you want to get the customer's feedbacks." required=True args: [('stage', 'Rating when changing stage'), ('periodic', 'Periodical Rating'), ('no', 'No rating')], 'Customer(s) Ratings'
  • rating_status_period Selection
    args: [('daily', 'Daily'), ('weekly', 'Weekly'), ('bimonthly', 'Twice a Month'), ('monthly', 'Once a Month'), ('quarterly', 'Quarterly'), ('yearly', 'Yearly')], 'Rating Frequency'
  • resource_calendar_id Many2one → resource.calendar
    default=<expr> help='Timetable working hours to adjust the gantt diagram report' string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of Projects.'
  • subtask_project_id Many2one → project.project
    help='Choosing a sub-tasks project will both enable sub-tasks and set their default project (possibly the project itself)' ondelete='restrict' string='Sub-task Project' args: 'project.project'
  • task_count Integer
    compute='_compute_task_count' string='Task Count'
  • task_ids One2many → project.task
    domain=['|', ('stage_id.fold', '=', False), ('stage_id', '=', False)] string='Tasks' args: 'project.task', 'project_id'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • user_id Many2one → res.users
    default=<expr> string='Project Manager' track_visibility='onchange' args: 'res.users'
Public methods (14)
  • action_view_all_rating(self)
    @api.multi
    return the action to see all the rating of the project, and activate default filters
  • activate_sample_project(self)
    @api.model
    Unarchives the sample project 'project.project_project_data' and reloads the project dashboard
  • attachment_tree_view(self)
    @api.multi
  • copy(self, default=None)
    @api.multi@api.returns('self', <expr>)
  • create(self, vals)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • map_tasks(self, new_project_id)
    @api.multi
    copy and map tasks from old to new project
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None)
    @api.multi
    Subscribe to all existing active tasks when subscribing to a project
  • message_unsubscribe(self, partner_ids=None, channel_ids=None)
    @api.multi
    Unsubscribe from all tasks when unsubscribing from a project
  • open_tasks(self)
    @api.multi
  • toggle_favorite(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (2)
  • color Integer
    string='Color Index'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (42)
  • active Boolean
    default=True
  • attachment_ids One2many → ir.attachment
    compute='_compute_attachment_ids' help="Attachment that don't come from message." string='Main Attachments' args: 'ir.attachment'
  • child_ids One2many → project.task
    context={'active_test': False} string='Sub-tasks' args: 'project.task', 'parent_id'
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    default=_default_company_id required=True string='Company' args: 'res.company'
  • create_date Datetime
    index=True readonly=True args: 'Created On'
  • date_assign Datetime
    copy=False index=True readonly=True string='Assigning Date'
  • date_deadline Date
    copy=False index=True string='Deadline' track_visibility='onchange'
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False index=True readonly=True string='Last Stage Update'
  • date_start Datetime
    copy=False default=fields.Datetime.now index=True string='Starting Date'
  • description Html
    string='Description'
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Cover Image' args: 'ir.attachment'
  • email_cc Char
    help='These email addresses will be added to the CC field of all inbound\n and outbound emails for this record before being sent. Separate multiple email addresses with a comma' string='Watchers Emails'
  • email_from Char
    help='These people will receive email.' index=True string='Email'
  • kanban_state Selection
    copy=False default='normal' required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • kanban_state_label Char
    compute='_compute_kanban_state_label' string='Kanban State Label' track_visibility='onchange'
  • legend_blocked Char
    readonly=True related='stage_id.legend_blocked' related_sudo=False string='Kanban Blocked Explanation'
  • legend_done Char
    readonly=True related='stage_id.legend_done' related_sudo=False string='Kanban Valid Explanation'
  • legend_normal Char
    readonly=True related='stage_id.legend_normal' related_sudo=False string='Kanban Ongoing Explanation'
  • manager_id Many2one → res.users
    readonly=True related='project_id.user_id' related_sudo=False string='Project Manager' args: 'res.users'
  • name Char
    index=True required=True string='Title' track_visibility='always'
  • notes Text
    string='Notes'
  • parent_id Many2one → project.task
    index=True string='Parent Task' args: 'project.task'
  • partner_id Many2one → res.partner
    default=<expr> string='Customer' args: 'res.partner'
  • planned_hours Float
    help='It is the time planned to achieve the task. If this document has sub-tasks, it means the time needed to achieve this tasks and its childs.' track_visibility='onchange' args: 'Planned Hours'
  • priority Selection
    default='0' index=True string='Priority' args: [('0', 'Low'), ('1', 'Normal')]
  • project_id Many2one → project.project
    change_default=True default=<expr> index=True string='Project' track_visibility='onchange' args: 'project.project'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of tasks.' index=True string='Sequence'
  • stage_id Many2one → project.task.type
    copy=False default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True ondelete='restrict' string='Stage' track_visibility='onchange' args: 'project.task.type'
  • subtask_count Integer
    compute='_compute_subtask_count' args: 'Sub-task count'
  • subtask_planned_hours Float
    compute='_compute_subtask_planned_hours' help='Computed using sum of hours planned of all subtasks created from main task. Usually these hours are less or equal to the Planned Hours (of main task).' args: 'Subtasks'
  • subtask_project_id Many2one → project.project
    readonly=True related='project_id.subtask_project_id' string='Sub-task Project' args: 'project.project'
  • tag_ids Many2many → project.tags
    oldname='categ_ids' string='Tags' args: 'project.tags'
  • user_email Char
    readonly=True related='user_id.email' related_sudo=False string='User Email'
  • user_id Many2one → res.users
    default=<expr> index=True string='Assigned to' track_visibility='always' args: 'res.users'
  • website_message_ids One2many
    domain=<expr>
  • working_days_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working days to close'
  • working_days_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working days to assign'
  • working_hours_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working hours to close'
  • working_hours_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working hours to assign'
  • write_date Datetime
    index=True readonly=True args: 'Last Updated On'
Public methods (17)
  • action_assign_to_me(self)
  • action_open_parent_task(self)
  • action_subtask(self)
  • copy(self, default=None)
    @api.multi@api.returns('self', <expr>)
  • create(self, vals)
    @api.model
  • default_get(self, fields_list)
    @api.model
  • email_split(self, msg)
    @api.multi
  • get_empty_list_help(self, help)
    @api.model
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_update(self, msg, update_vals=None)
    @api.multi
    Override to update the task according to the email.
  • rating_apply(self, rate, token=None, feedback=None, subtype=None)
    @api.multi
  • rating_get_parent(self)
  • rating_get_partner_id(self)
  • stage_find(self, section_id, domain=[], order='sequence')
    Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • update_date_end(self, stage_id)
  • write(self, vals)
    @api.multi

New fields (12)
  • auto_validation_kanban_state Boolean
    default=False help="Automatically modify the kanban state when the customer replies to the feedback for this stage.\n * A good feedback from the customer will update the kanban state to 'ready for the new stage' (green bullet).\n * A medium or a bad feedback will set the kanban state to 'blocked' (red bullet).\n" args: 'Automatic kanban status'
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' string='Folded in Kanban'
  • legend_blocked Char
    default=<expr> help='Override the default value displayed for the blocked state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> help='Override the default value displayed for the done state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> help='Override the default value displayed for the normal state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Grey Kanban Label'
  • legend_priority Char
    help='Explanation text to help users using the star on tasks or issues in this stage.' string='Starred Explanation' translate=True
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set an email will be sent to the customer when the task or issue reaches this step.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Stage Name' translate=True
  • project_ids Many2many → project.project
    default=_get_default_project_ids string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • rating_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help="If set and if the project's rating configuration is 'Rating when changing stage', then an email will be sent to the customer when the task reaches this step." string='Rating Email Template' args: 'mail.template'
  • sequence Integer
    default=1
Public methods (1)
  • unlink(self)
    @api.multi

New fields (16)
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • date_start Datetime
    readonly=True string='Assignation Date'
  • delay_endings_days Float
    digits=(16, 2) readonly=True string='# Days to Deadline'
  • name Char
    readonly=True string='Task Title'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • partner_id Many2one → res.partner
    readonly=True string='Customer' args: 'res.partner'
  • priority Selection
    readonly=True size=1 string='Priority' args: [('0', 'Low'), ('1', 'Normal'), ('2', 'High')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='Kanban State' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • user_id Many2one → res.users
    readonly=True string='Assigned To' args: 'res.users'
  • working_days_close Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to close the task' readonly=True string='# Working Days to Close'
  • working_days_open Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to Open the task' readonly=True string='# Working Days to Assign'
Public methods (1)
  • init(self)

New fields (4)
  • group_project_rating Boolean
    implied_group='project.group_project_rating' args: 'Use Rating on Project'
  • group_subtask_project Boolean
    implied_group='project.group_subtask_project' args: 'Sub-tasks'
  • module_hr_timesheet Boolean
    string='Task Logs'
  • module_project_forecast Boolean
    string='Forecasts'
Public methods (0)

No public methods.

New fields (2)
  • task_count Integer
    compute='_compute_task_count' string='# Tasks'
  • task_ids One2many → project.task
    string='Tasks' args: 'project.task', 'partner_id'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/11.0/project
VERSION
VERSION 1.1
CATEGORY
CATEGORYProject
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Xavier Morel, Goffin Simon, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Julien Legros, Richard Mathot, Aaron Bohy, ged-odoo, GitHub, Lucas Perais (lpe), Olivier Colson, Yannick Tivisse, qsm-odoo, Martin Geubelle, Odoo Online, Toufik Benjaa, jem-odoo, Adrien Dieudonne, Nans Lefebvre, Denis Vermylen, XavierDo, Julien Castiaux
WEBSITE
WEBSITEhttps://www.odoo.com/page/project-management
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:53:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - analytic
    - portal
    - http_routing
    - resource
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (37)
XML IDNameModelTypeStatus
analytic_account_inherited_form account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
assets_backend project assets ir.ui.view qweb Inherits web.assets_backend
edit_project project.project.form project.project form New
mail_template_task_merge mail_template_task_merge ir.ui.view qweb New
portal_layout Portal layout: project menu entry ir.ui.view qweb Inherits portal.portal_layout
portal_my_home Portal My Home: project entries ir.ui.view qweb Inherits portal.portal_my_home
portal_my_project My Project ir.ui.view qweb New
portal_my_projects My Projects ir.ui.view qweb New
portal_my_task My Task ir.ui.view qweb New
portal_my_tasks My Tasks ir.ui.view qweb New
project_planner project_planner ir.ui.view qweb New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
project_task_merge_wizard_form project.task.merge.wizard.form project.task.merge.wizard form New
project_task_view_tree_activity project.task.tree.activity project.task tree New
project_view_kanban project.project.kanban project.project kanban New
qunit_suite project_test ir.ui.view qweb Inherits web.qunit_suite
res_config_settings_view_form res.config.settings.view.form.inherit.project res.config.settings xpath Inherits base.res_config_settings_view_form
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_project project.project.tree project.project tree New
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_task_graph project.task.graph project.task graph New
view_project_task_pivot project.task.pivot project.task pivot New
view_project_task_type_kanban project.task.type.kanban project.task.type kanban New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.buttons res.partner button Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_search_form project.task.search.form project.task search New
view_task_tree2 project.task.tree project.task tree New
Models touched (11)

New fields (3)
  • company_uom_id Many2one → product.uom
    related='company_id.project_time_mode_id' string='Company UOM' args: 'product.uom'
  • project_count Integer
    compute='_compute_project_count' string='Project Count'
  • project_ids One2many → project.project
    string='Projects' args: 'project.project', 'analytic_account_id'
Public methods (3)
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
  • projects_action(self)
    @api.multi
  • unlink(self)
    @api.multi

New fields (20)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the project without removing it.'
  • alias_id Many2one → mail.alias
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • analytic_account_id Many2one → account.analytic.account
    auto_join=True help='Link this project to an analytic account if you need financial management on projects. It enables you to connect projects with budgets, planning, cost and revenue analysis, timesheets on projects, etc.' ondelete='cascade' required=True string='Contract/Analytic' args: 'account.analytic.account'
  • color Integer
    string='Color Index'
  • date Date
    index=True string='Expiration Date' track_visibility='onchange'
  • date_start Date
    string='Start Date'
  • doc_count Integer
    compute='_compute_attached_docs_count' string='Number of documents attached'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' help='Whether this project should be displayed on the dashboard or not' inverse='_inverse_is_favorite' string='Show Project on dashboard'
  • label_tasks Char
    default='Tasks' help="Gives label to tasks on project's kanban view." string='Use Tasks as'
  • privacy_visibility Selection
    default='employees' help='Holds visibility of the tasks or issues that belong to the current project:\n- On invitation only: Employees may only see the followed project, tasks or issues\n- Visible by all employees: Employees may see all project, tasks or issues\n- Visible by following customers: employees see everything;\n if website is activated, portal users may see project, tasks or issues followed by\n them or by someone of their company\n' required=True string='Privacy' args: [('followers', 'On invitation only'), ('employees', 'Visible by all employees'), ('portal', 'Visible by following customers')]
  • resource_calendar_id Many2one → resource.calendar
    default=<expr> help='Timetable working hours to adjust the gantt diagram report' string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of Projects.'
  • subtask_project_id Many2one → project.project
    help='Choosing a sub-tasks project will both enable sub-tasks and set their default project (possibly the project itself)' ondelete='restrict' string='Sub-task Project' args: 'project.project'
  • task_count Integer
    compute='_compute_task_count' string='Tasks'
  • task_ids One2many → project.task
    domain=['|', ('stage_id.fold', '=', False), ('stage_id', '=', False)] string='Tasks' args: 'project.task', 'project_id'
  • task_needaction_count Integer
    compute='_compute_task_needaction_count' string='Tasks'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • user_id Many2one → res.users
    default=<expr> string='Project Manager' track_visibility='onchange' args: 'res.users'
Public methods (15)
  • activate_sample_project(self)
    @api.model
    Unarchives the sample project 'project.project_project_data' and reloads the project dashboard
  • attachment_tree_view(self)
    @api.multi
  • close_dialog(self)
    @api.multi
  • copy(self, default=None)
    @api.multi
  • create(self, vals)
    @api.model
  • edit_dialog(self)
    @api.multi
  • get_access_action(self, access_uid=None)
    @api.multi
    Instead of the classic form view, redirect to website for portal users that can read the project.
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • map_tasks(self, new_project_id)
    @api.multi
    copy and map tasks from old to new project
  • message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None, force=True)
    @api.multi
    Subscribe to all existing active tasks when subscribing to a project
  • message_unsubscribe(self, partner_ids=None, channel_ids=None)
    @api.multi
    Unsubscribe from all tasks when unsubscribing from a project
  • toggle_favorite(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (2)
  • color Integer
    default=10 string='Color Index'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (42)
  • active Boolean
    default=True
  • attachment_ids One2many → ir.attachment
    compute='_compute_attachment_ids' help="Attachment that don't come from message." string='Main Attachments' args: 'ir.attachment'
  • child_ids One2many → project.task
    context={'active_test': False} string='Sub-tasks' args: 'project.task', 'parent_id'
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • create_date Datetime
    index=True
  • date_assign Datetime
    copy=False index=True readonly=True string='Assigning Date'
  • date_deadline Date
    copy=False index=True string='Deadline'
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False default=fields.Datetime.now index=True readonly=True string='Last Stage Update'
  • date_start Datetime
    copy=False default=fields.Datetime.now index=True string='Starting Date'
  • description Html
    string='Description'
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Cover Image' args: 'ir.attachment'
  • email_cc Char
    help='These email addresses will be added to the CC field of all inbound\n and outbound emails for this record before being sent. Separate multiple email addresses with a comma' string='Watchers Emails'
  • email_from Char
    help='These people will receive email.' index=True string='Email'
  • kanban_state Selection
    copy=False default='normal' help="A task's kanban state indicates special situations affecting it:\n * Grey is the default situation\n * Red indicates something is preventing the progress of this task\n * Green indicates the task is ready to be pulled to the next stage" required=True string='Kanban State' args: [('normal', 'Grey'), ('done', 'Green'), ('blocked', 'Red')]
  • kanban_state_label Char
    compute='_compute_kanban_state_label' string='Kanban State' track_visibility='onchange'
  • legend_blocked Char
    readonly=True related='stage_id.legend_blocked' related_sudo=False string='Kanban Blocked Explanation'
  • legend_done Char
    readonly=True related='stage_id.legend_done' related_sudo=False string='Kanban Valid Explanation'
  • legend_normal Char
    readonly=True related='stage_id.legend_normal' related_sudo=False string='Kanban Ongoing Explanation'
  • manager_id Many2one → res.users
    readonly=True related='project_id.user_id' related_sudo=False string='Project Manager' args: 'res.users'
  • name Char
    index=True required=True string='Task Title' track_visibility='always'
  • notes Text
    string='Notes'
  • parent_id Many2one → project.task
    index=True string='Parent Task' args: 'project.task'
  • partner_id Many2one → res.partner
    default=_get_default_partner string='Customer' args: 'res.partner'
  • planned_hours Float
    help='Estimated time to do the task, usually set by the project manager when the task is in draft state.' string='Initially Planned Hours'
  • priority Selection
    default='0' index=True string='Priority' args: [('0', 'Low'), ('1', 'Normal')]
  • project_id Many2one → project.project
    change_default=True default=<expr> index=True string='Project' track_visibility='onchange' args: 'project.project'
  • remaining_hours Float
    digits=(16, 2) help='Total remaining time, can be re-estimated periodically by the assignee of the task.' string='Remaining Hours'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of tasks.' index=True string='Sequence'
  • stage_id Many2one → project.task.type
    copy=False default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'project.task.type'
  • subtask_count Integer
    compute='_compute_subtask_count' string='Sub-task count' type='integer'
  • subtask_project_id Many2one → project.project
    readonly=True related='project_id.subtask_project_id' string='Sub-task Project' args: 'project.project'
  • tag_ids Many2many → project.tags
    oldname='categ_ids' string='Tags' args: 'project.tags'
  • user_email Char
    readonly=True related='user_id.email' related_sudo=False string='User Email'
  • user_id Many2one → res.users
    default=<expr> index=True string='Assigned to' track_visibility='always' args: 'res.users'
  • website_message_ids One2many
    domain=<expr>
  • working_days_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working days to close'
  • working_days_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working days to assign'
  • working_hours_close Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working hours to close'
  • working_hours_open Float
    compute='_compute_elapsed' group_operator='avg' store=True string='Working hours to assign'
  • write_date Datetime
    index=True
Public methods (17)
  • action_assign_to_me(self)
  • action_open_parent_task(self)
  • action_subtask(self)
  • copy(self, default=None)
    @api.multi
  • create(self, vals)
    @api.model
  • email_split(self, msg)
    @api.multi
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • get_access_action(self, access_uid=None)
    @api.multi
    Instead of the classic form view, redirect to website for portal users that can read the task.
  • get_empty_list_help(self, help)
    @api.model
  • message_get_email_values(self, notif_mail=None)
    @api.multi
  • message_get_reply_to(self, res_ids, default=None)
    @api.model
    Override to get the reply_to of the parent project.
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg, custom_values=None)
    @api.model
    Overrides mail_thread message_new that is called by the mailgateway through message_process. This override updates the document according to the email.
  • message_update(self, msg, update_vals=None)
    @api.multi
    Override to update the task according to the email.
  • stage_find(self, section_id, domain=[], order='sequence')
    Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • update_date_end(self, stage_id)
  • write(self, vals)
    @api.multi

New fields (6)
  • create_new_task Boolean
    args: 'Create a new task'
  • target_project_id Many2one → project.project
    string='Target Project' args: 'project.project'
  • target_task_id Many2one → project.task
    string='Merge into an existing task' args: 'project.task'
  • target_task_name Char
    args: 'New task name'
  • task_ids Many2many → project.task
    required=True string='Tasks to Merge' args: 'project.task'
  • user_id Many2one → res.users
    string='Assigned to' args: 'res.users'
Public methods (4)
  • default_get(self, fields)
    @api.model
  • merge_description(self)
    @api.multi
  • merge_followers(self)
    @api.multi
  • merge_tasks(self)
    @api.multi

New fields (10)
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' string='Folded in Kanban'
  • legend_blocked Char
    default=<expr> help='Override the default value displayed for the blocked state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Red Kanban Label'
  • legend_done Char
    default=<expr> help='Override the default value displayed for the done state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Green Kanban Label'
  • legend_normal Char
    default=<expr> help='Override the default value displayed for the normal state for kanban selection, when the task or issue is in that stage.' required=True translate=True args: 'Grey Kanban Label'
  • legend_priority Char
    help='Explanation text to help users using the star on tasks or issues in this stage.' string='Starred Explanation' translate=True
  • mail_template_id Many2one → mail.template
    domain=[('model', '=', 'project.task')] help='If set an email will be sent to the customer when the task or issue reaches this step.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Stage Name' translate=True
  • project_ids Many2many → project.project
    default=_get_default_project_ids string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • sequence Integer
    default=1
Public methods (0)

No public methods.

New fields (16)
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • date_start Datetime
    readonly=True string='Assignation Date'
  • delay_endings_days Float
    digits=(16, 2) readonly=True string='# Days to Deadline'
  • name Char
    readonly=True string='Task Title'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • priority Selection
    readonly=True size=1 string='Priority' args: [('0', 'Low'), ('1', 'Normal'), ('2', 'High')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='Kanban State' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • user_id Many2one → res.users
    readonly=True string='Assigned To' args: 'res.users'
  • working_days_close Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to close the task' readonly=True string='# Working Days to Close'
  • working_days_open Float
    digits=(16, 2) group_operator='avg' help='Number of Working Days to Open the task' readonly=True string='# Working Days to Assign'
Public methods (1)
  • init(self)

New fields (1)
  • project_time_mode_id Many2one → product.uom
    default=<expr> help="This will set the unit of measure used in projects and tasks.\nIf you use the timesheet linked to projects, don't forget to setup the right unit of measure in your employees." string='Project Time Unit' args: 'product.uom'
Public methods (0)

No public methods.

New fields (5)
  • group_subtask_project Boolean
    implied_group='project.group_subtask_project' args: 'Sub-tasks'
  • module_hr_timesheet Boolean
    args: 'Timesheets'
  • module_project_forecast Boolean
    string='Forecasts'
  • module_rating_project Boolean
    string='Rating on Tasks'
  • project_time_mode_id Many2one → product.uom
    help="This will set the unit of measure used in projects and tasks.\nIf you use the timesheet linked to projects, don't forget to setup the right unit of measure in your employees." related='company_id.project_time_mode_id' string='Project Time Unit' args: 'product.uom'
Public methods (0)

No public methods.

New fields (2)
  • task_count Integer
    compute='_compute_task_count' string='# Tasks'
  • task_ids One2many → project.task
    string='Tasks' args: 'project.task', 'partner_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/10.0/project
VERSION
VERSION 1.1
CATEGORY
CATEGORYProject
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, David Monjoie, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Julien Legros, qdp-odoo, Géry Debongnie, Aaron Bohy, Jeremy Kersten, Damien Bouvy, Yannick Tivisse, qsm-odoo, Martin Geubelle, Pierre Masereel, Denis Vermylen (dve), Tanguy Charlier, Adrien Dieudonne
WEBSITE
WEBSITEhttps://www.odoo.com/page/project-management
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:50:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web_kanban
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - web_tour
    - report
    - analytic
    - resource
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Track multi-level projects, tasks, work done on tasks
=====================================================

This application allows an operational project management system to organize your activities into tasks and plan the work you need to get the tasks completed.

Gantt diagrams will give you a graphical representation of your project plans, as well as resources availability and workload.

Dashboard / Reports for Project Management will include:
--------------------------------------------------------
* My Tasks
* Open Tasks
* Tasks Analysis
* Cumulative Flow
    

Code Analysis

Views touched (25)
XML IDNameModelTypeStatus
analytic_account_inherited_form account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
assets_backend project assets ir.ui.view qweb Inherits web.assets_backend
edit_project project.project.form project.project form New
project_planner project_planner ir.ui.view qweb New
project_project_view_form_simplified project.project.view.form.simplified project.project form New
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_config_settings project settings project.config.settings form New
view_project project.project.tree project.project tree New
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_task_graph project.task.graph project.task graph New
view_project_task_pivot project.task.pivot project.task pivot New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.buttons res.partner div Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_search_form project.task.search.form project.task search New
view_task_tree2 project.task.tree project.task tree New
Models touched (10)

New fields (4)
  • company_uom_id Many2one → product.uom
    related='company_id.project_time_mode_id' string='Company UOM' args: 'product.uom'
  • project_count Integer
    compute='_compute_project_count' string='Project Count'
  • project_ids One2many → project.project
    string='Projects' args: 'project.project', 'analytic_account_id'
  • use_tasks Boolean
    help='Check this box to manage internal activities through this project' string='Use Tasks'
Public methods (6)
  • create(self, vals)
    @api.model
  • name_search(self, name, args=None, operator='ilike', limit=100)
    @api.model
  • project_create(self, vals)
    @api.multi
    This function is called at the time of analytic account creation and is used to create a project automatically linked to it if the conditions are meet.
  • projects_action(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (6)
  • company_id Many2one → res.company
    default=<expr> required=True string='Company' args: 'res.company'
  • generate_project_alias Selection
    help='Odoo will generate an email alias at the project creation from project name.' string='Project Alias' args: [(0, 'Do not create an email alias automatically'), (1, 'Automatically generate an email alias at the project creation')]
  • module_pad Selection
    help='Lets the company customize which Pad installation should be used to link to new pads (for example: http://ietherpad.com/).\n-This installs the module pad.' string='Pads' args: [(0, 'Task description is plain text'), (1, 'Collaborative rich text on task description')]
  • module_project_forecast Boolean
    string='Forecasts, planning and Gantt charts'
  • module_rating_project Selection
    help='This allows customers to give rating on provided services' string='Rating on task' args: [(0, 'No customer rating'), (1, 'Track customer satisfaction on tasks')]
  • project_time_mode_id Many2one
    related='company_id.project_time_mode_id' string='Project Time Unit *'
Public methods (1)
  • set_default_generate_project_alias(self)
    @api.multi

New fields (20)
  • active Boolean
    default=True help='If the active field is set to False, it will allow you to hide the project without removing it.'
  • alias_id Many2one → mail.alias
    help='Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).' ondelete='restrict' required=True string='Alias' args: 'mail.alias'
  • alias_model Selection
    default='project.task' help="The kind of document created when an email is received on this project's email alias" index=True required=True string='Alias Model' args: _alias_models
  • analytic_account_id Many2one → account.analytic.account
    auto_join=True help='Link this project to an analytic account if you need financial management on projects. It enables you to connect projects with budgets, planning, cost and revenue analysis, timesheets on projects, etc.' ondelete='cascade' required=True string='Contract/Analytic' args: 'account.analytic.account'
  • color Integer
    string='Color Index'
  • date Date
    index=True string='Expiration Date' track_visibility='onchange'
  • date_start Date
    string='Start Date'
  • doc_count Integer
    compute='_compute_attached_docs_count' string='Number of documents attached'
  • favorite_user_ids Many2many → res.users
    default=_get_default_favorite_user_ids string='Members' args: 'res.users', 'project_favorite_user_rel', 'project_id', 'user_id'
  • is_favorite Boolean
    compute='_compute_is_favorite' help='Whether this project should be displayed on the dashboard or not' string='Show Project on dashboard'
  • label_tasks Char
    default='Tasks' help="Gives label to tasks on project's kanban view." string='Use Tasks as'
  • privacy_visibility Selection
    default='employees' help='Holds visibility of the tasks or issues that belong to the current project:\n- On invitation only: Employees may only see the followed project, tasks or issues\n- Visible by all employees: Employees may see all project, tasks or issues\n- Visible by following customers: employees see everything;\n if website is activated, portal users may see project, tasks or issues followed by\n them or by someone of their company\n' required=True string='Privacy' args: [('followers', _('On invitation only')), ('employees', _('Visible by all employees')), ('portal', _('Visible by following customers'))]
  • resource_calendar_id Many2one → resource.calendar
    help='Timetable working hours to adjust the gantt diagram report' string='Working Time' args: 'resource.calendar'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of Projects.'
  • task_count Integer
    compute='_compute_task_count' string='Tasks'
  • task_ids One2many → project.task
    domain=['|', ('stage_id.fold', '=', False), ('stage_id', '=', False)] string='Tasks' args: 'project.task', 'project_id'
  • task_needaction_count Integer
    compute='_compute_task_needaction_count' string='Tasks'
  • tasks One2many → project.task
    string='Task Activities' args: 'project.task', 'project_id'
  • type_ids Many2many → project.task.type
    string='Tasks Stages' args: 'project.task.type', 'project_task_type_rel', 'project_id', 'type_id'
  • user_id Many2one → res.users
    default=<expr> string='Project Manager' args: 'res.users'
Public methods (12)
  • activate_sample_project(self)
    @api.model
    Unarchives the sample project 'project.project_project_data' and reloads the project dashboard
  • attachment_tree_view(self)
    @api.multi
  • close_dialog(self)
    @api.multi
  • copy(self, default=None)
    @api.multi
  • create(self, vals)
    @api.model
  • default_get(self, flds)
    @api.model
  • get_alias_model_name(self, vals)
  • get_alias_values(self)
  • map_tasks(self, new_project_id)
    @api.multi
    copy and map tasks from old to new project
  • toggle_favorite(self)
    @api.multi
  • unlink(self)
    @api.multi
  • write(self, vals)
    @api.multi

New fields (2)
  • color Integer
    string='Color Index'
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (30)
  • active Boolean
    default=True
  • attachment_ids One2many → ir.attachment
    auto_join=True domain=<expr> string='Attachments' args: 'ir.attachment', 'res_id'
  • color Integer
    string='Color Index'
  • company_id Many2one → res.company
    default=<expr> string='Company' args: 'res.company'
  • create_date Datetime
    index=True
  • date_assign Datetime
    copy=False index=True readonly=True string='Assigning Date'
  • date_deadline Date
    copy=False index=True string='Deadline'
  • date_end Datetime
    copy=False index=True string='Ending Date'
  • date_last_stage_update Datetime
    copy=False default=fields.Datetime.now index=True readonly=True string='Last Stage Update'
  • date_start Datetime
    copy=False default=fields.Datetime.now index=True string='Starting Date'
  • description Html
    string='Description'
  • displayed_image_id Many2one → ir.attachment
    domain="[('res_model', '=', 'project.task'), ('res_id', '=', id), ('mimetype', 'ilike', 'image')]" string='Displayed Image' args: 'ir.attachment'
  • kanban_state Selection
    copy=False default='normal' help="A task's kanban state indicates special situations affecting it:\n * Normal is the default situation\n * Blocked indicates something is preventing the progress of this task\n * Ready for next stage indicates the task is ready to be pulled to the next stage" required=True string='Kanban State' track_visibility='onchange' args: [('normal', 'In Progress'), ('done', 'Ready for next stage'), ('blocked', 'Blocked')]
  • legend_blocked Char
    readonly=True related='stage_id.legend_blocked' string='Kanban Blocked Explanation'
  • legend_done Char
    readonly=True related='stage_id.legend_done' string='Kanban Valid Explanation'
  • legend_normal Char
    readonly=True related='stage_id.legend_normal' string='Kanban Ongoing Explanation'
  • manager_id Many2one → res.users
    readonly=True related='project_id.user_id' string='Project Manager' args: 'res.users'
  • name Char
    index=True required=True string='Task Title' track_visibility='always'
  • notes Text
    string='Notes'
  • partner_id Many2one → res.partner
    default=_get_default_partner string='Customer' args: 'res.partner'
  • planned_hours Float
    help='Estimated time to do the task, usually set by the project manager when the task is in draft state.' string='Initially Planned Hours'
  • priority Selection
    default='0' index=True args: [('0', 'Normal'), ('1', 'High')]
  • project_id Many2one → project.project
    change_default=True default=<expr> index=True string='Project' track_visibility='onchange' args: 'project.project'
  • remaining_hours Float
    digits=(16, 2) help='Total remaining time, can be re-estimated periodically by the assignee of the task.' string='Remaining Hours'
  • sequence Integer
    default=10 help='Gives the sequence order when displaying a list of tasks.' index=True string='Sequence'
  • stage_id Many2one → project.task.type
    copy=False default=_get_default_stage_id domain="[('project_ids', '=', project_id)]" group_expand='_read_group_stage_ids' index=True string='Stage' track_visibility='onchange' args: 'project.task.type'
  • tag_ids Many2many → project.tags
    oldname='categ_ids' string='Tags' args: 'project.tags'
  • user_email Char
    readonly=True related='user_id.email' string='User Email'
  • user_id Many2one → res.users
    default=<expr> index=True string='Assigned to' track_visibility='always' args: 'res.users'
  • write_date Datetime
    index=True
Public methods (13)
  • copy(self, default=None)
    @api.multi
  • create(self, vals)
    @api.model
  • default_get(self, field_list)
    @api.model
    Set 'date_assign' if user_id is set.
  • email_split(self, msg)
    @api.multi
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • get_empty_list_help(self, help)
    @api.model
  • message_get_email_values(self, notif_mail=None)
    @api.multi
  • message_get_reply_to(self, res_ids, default=None)
    @api.model
    Override to get the reply_to of the parent project.
  • message_get_suggested_recipients(self)
    @api.multi
  • message_new(self, msg, custom_values=None)
    @api.model
    Override to updates the document according to the email.
  • message_update(self, msg, update_vals=None)
    @api.multi
    Override to update the task according to the email.
  • stage_find(self, section_id, domain=[], order='sequence')
    Override of the base.stage method Parameter of the stage search taken from the lead: - section_id: if set, stages must belong to this section or be a default stage; if not set, stages must be default stages
  • write(self, vals)
    @api.multi

New fields (10)
  • description Text
    translate=True
  • fold Boolean
    help='This stage is folded in the kanban view when there are no records in that stage to display.' string='Folded in Kanban'
  • legend_blocked Char
    help='Override the default value displayed for the blocked state for kanban selection, when the task or issue is in that stage.' string='Kanban Blocked Explanation' translate=True
  • legend_done Char
    help='Override the default value displayed for the done state for kanban selection, when the task or issue is in that stage.' string='Kanban Valid Explanation' translate=True
  • legend_normal Char
    help='Override the default value displayed for the normal state for kanban selection, when the task or issue is in that stage.' string='Kanban Ongoing Explanation' translate=True
  • legend_priority Char
    help='Explanation text to help users using the star and priority mechanism on stages or issues that are in this stage.' string='Priority Management Explanation' translate=True
  • mail_template_id Many2one → mail.template
    domain=<expr> help='If set an email will be sent to the customer when the task or issue reaches this step.' string='Email Template' args: 'mail.template'
  • name Char
    required=True string='Stage Name' translate=True
  • project_ids Many2many → project.project
    default=_get_default_project_ids string='Projects' args: 'project.project', 'project_task_type_rel', 'type_id', 'project_id'
  • sequence Integer
    default=1
Public methods (0)

No public methods.

New fields (17)
  • closing_days Float
    digits=(16, 2) group_operator='avg' help='Number of Days to close the task' readonly=True string='# Days to Close'
  • company_id Many2one → res.company
    readonly=True string='Company' args: 'res.company'
  • date_deadline Date
    readonly=True string='Deadline'
  • date_end Datetime
    readonly=True string='Ending Date'
  • date_last_stage_update Datetime
    readonly=True string='Last Stage Update'
  • date_start Datetime
    readonly=True string='Assignation Date'
  • delay_endings_days Float
    digits=(16, 2) readonly=True string='# Days to Deadline'
  • name Char
    readonly=True string='Task Title'
  • nbr Integer
    readonly=True args: '# of Tasks'
  • no_of_days Integer
    readonly=True string='# Working Days'
  • opening_days Float
    digits=(16, 2) group_operator='avg' help='Number of Days to Open the task' readonly=True string='# Days to Assign'
  • partner_id Many2one → res.partner
    readonly=True string='Contact' args: 'res.partner'
  • priority Selection
    readonly=True size=1 args: [('0', 'Low'), ('1', 'Normal'), ('2', 'High')]
  • project_id Many2one → project.project
    readonly=True string='Project' args: 'project.project'
  • stage_id Many2one → project.task.type
    readonly=True string='Stage' args: 'project.task.type'
  • state Selection
    readonly=True string='Kanban State' args: [('normal', 'In Progress'), ('blocked', 'Blocked'), ('done', 'Ready for next stage')]
  • user_id Many2one → res.users
    readonly=True string='Assigned To' args: 'res.users'
Public methods (1)
  • init(self)

New fields (1)
  • project_time_mode_id Many2one → product.uom
    help="This will set the unit of measure used in projects and tasks.\nIf you use the timesheet linked to projects, don't forget to setup the right unit of measure in your employees." string='Project Time Unit' args: 'product.uom'
Public methods (0)

No public methods.

New fields (2)
  • task_count Integer
    compute='_compute_task_count' string='# Tasks'
  • task_ids One2many → project.task
    string='Tasks' args: 'project.task', 'partner_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/9.0/project
VERSION
VERSION 1.1
CATEGORY
CATEGORYProject Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, David Monjoie, Goffin Simon, Simon Lejeune, Nicolas Martinelli, Nicolas Lempereur, Jérome Maes, Richard Mathot, Géry Debongnie, Aaron Bohy, Damien Bouvy, Yannick Tivisse, qsm-odoo, Martin Geubelle, odoo-tac, Jigar Patel
WEBSITE
WEBSITEhttps://www.odoo.com/page/project-management
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:48:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web_kanban
    - web
    - product
    - decimal_precision
    - mail
    - bus
    - report
    - analytic
    - portal
    - auth_signup
    - resource
    - web_tip
    - web_planner
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Track multi-level projects, tasks, work done on tasks
=====================================================

This application allows an operational project management system to organize your activities into tasks and plan the work you need to get the tasks completed.

Gantt diagrams will give you a graphical representation of your project plans, as well as resources availability and workload.

Dashboard / Reports for Project Management will include:
--------------------------------------------------------
* My Tasks
* Open Tasks
* Tasks Analysis
* Cumulative Flow
    

Code Analysis

Views touched (28)
XML IDNameModelTypeStatus
analytic_account_inherited_form account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
assets_backend project assets ir.ui.view qweb Inherits web.assets_backend
edit_project project.project.form project.project form New
project_planner project_planner ir.ui.view qweb New
project_tags_form_view Tags project.tags form New
project_tags_search_view Tags project.tags search New
task_company res.company.task.config res.company xpath Inherits base.view_company_form
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_config_settings project settings project.config.settings form New
view_project project.project.tree project.project tree New
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_task_graph project.task.graph project.task graph New
view_project_task_pivot project.task.pivot project.task pivot New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_history_graph project.task.history.cumulative.graph project.task.history.cumulative graph New
view_task_history_pivot project.task.history.cumulative.pivot project.task.history.cumulative pivot New
view_task_history_search project.task.history.cumulative.search project.task.history.cumulative search New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.buttons res.partner div Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_pivot report.project.task.user.pivot report.project.task.user pivot New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_search_form project.task.search.form project.task search New
view_task_tree2 project.task.tree project.task tree New
Models touched (2)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/8.0/project
VERSION
VERSION 1.1
CATEGORY
CATEGORYProject Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Randhir Mayatra (OpenERP), Odoo Translation Bot, Turkesh Patel (Open ERP), Christophe Matthieu, Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Fabien Pinckaers, Antony Lesuisse, Olivier Dony, Thibault Delavallée, Vo Minh Thu, Josse Colpaert, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Denis Ledoux, Fabien Meghazi, niv-openerp, ggh-openerp, Christophe Simonis, David Monjoie, Xavier Morel, Goffin Simon, Cedric Snauwaert, Simon Lejeune, Vishmita, Kersten Jeremy, Amit Bhavsar (Open ERP), Paramjit Singh Sahota, Anand Patel (OpenERP), Vidhin Mehta, Richard Mathot, Géry Debongnie, Aaron Bohy, Vishmita Jadeja (openerp), Bharat R. Devnani (OpenERP), Richard Mathot (OpenERP), ged-odoo, Mahendra Barad (OpenERP), ima-openerp, Gery Debongnie, Randhir Mayatra rma-openerp, sgo@tinyerp.com, Darshan Kalola (OpenERP), Darshan Kalola, Sunil Sharma (OpenERP), Sanjay Gohel (OpenERP), Jignesh Rathod (OpenERP), Rashmin Lumbhani (OpenERP), Barad Mahendra
WEBSITE
WEBSITEhttps://www.odoo.com/page/project-management
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:45:40
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web_kanban
    - web
    - product
    - decimal_precision
    - mail
    - report
    - analytic
    - board
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Track multi-level projects, tasks, work done on tasks
=====================================================

This application allows an operational project management system to organize your activities into tasks and plan the work you need to get the tasks completed.

Gantt diagrams will give you a graphical representation of your project plans, as well as resources availability and workload.

Dashboard / Reports for Project Management will include:
--------------------------------------------------------
* My Tasks
* Open Tasks
* Tasks Analysis
* Cumulative Flow
    

Code Analysis

Views touched (29)
XML IDNameModelTypeStatus
analytic_account_inherited_form account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
assets_backend project assets ir.ui.view qweb Inherits web.assets_backend
edit_project project.project.form project.project form New
project_category_form_view Tags project.category form New
project_category_search_view Tags project.category search New
task_company res.company.task.config res.company xpath Inherits base.view_company_form
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_config_settings project settings project.config.settings form New
view_project project.project.tree project.project tree New
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_project_gantt project.project.gantt project.project gantt New
view_project_task_delegate Project Task Delegate project.task.delegate form New
view_project_task_graph project.task.graph project.task graph New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_gantt project.task.gantt project.task gantt New
view_task_history_graph project.task.history.cumulative.graph project.task.history.cumulative graph New
view_task_history_search project.task.history.cumulative.search project.task.history.cumulative search New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.buttons res.partner xpath Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_search_form project.task.search.form project.task search New
view_task_tree2 project.task.tree project.task tree New
view_task_work_form project.task.work.form project.task.work form New
view_task_work_tree project.task.work.tree project.task.work tree New
Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/7.0/project
VERSION
VERSION 1.1
CATEGORY
CATEGORYProject Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Twinkle Christian (OpenERP), Cecile Tonglet, Rucha (Open ERP), Atul Patel (OpenERP), Jalpesh Patel (OpenERP), Randhir Mayatra (OpenERP), Stephane Wirtel, Odoo Translation Bot, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, Christophe Matthieu, Pinakin Nayi (OpenERP), DBR (OpenERP), Harry (OpenERP), Antonin Bourguignon, pankita shah (Open ERP), ajay javiya (OpenERP), Martin Trigaux, Ajay Chauhan (OpenERP), Foram Katharotiya (OpenERP), Bhumika (OpenERP), Purnendu Singh (OpenERP), Saurang Suthar (OpenERP), Fabien Pinckaers, Antony Lesuisse, Bharat Devnani (OpenERP), Meera Trambadia (OpenERP), Olivier Dony, Rajesh Prajapati (OpenERP), Twinkle (OpenERP), Divyesh Makwana (Open ERP), Tejas Tank, Thibault Delavallée, Vo Minh Thu, Hardik, Josse Colpaert, Arnaud Pineux, pso (OpenERP), Sbh (Openerp), Amit Patel (OpenERP), Launchpad Translations on behalf of openerp, vta vta@openerp.com, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Nimesh (Open ERP), Denis Ledoux, Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Sanjay Gohel (Open ERP), Alexis de Lattre, Fabien Meghazi, niv-openerp, Xavier ALT, Christophe Simonis, Dharti Ratani (OpenERP), Khushboo Bhatt (Open ERP), Bhumi Thakkar (Open ERP), Roberto López López (OpenERP), Cedric Snauwaert, Amit Patel, Frédéric van der Essen, Gilles Major, Chris Biersbach, Nicolas Martinelli, Yannick Vaucher, Somesh Khare (OpenERP), Minh Tran, RGA(OpenERP), Amit Dodiya, Hiral Patel (OpenERP), Kuldeep, kirti savalia (OpenERP), Richard Mathot, nicolas.bessi@camptocamp.com, Chandni Gandhi (OpenERP), Yanina Aular, apa-tiny (apa@tinyerp.com)
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:43:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web_kanban
    - web
    - base_status
    - product
    - process
    - decimal_precision
    - mail
    - analytic
    - board
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Track multi-level projects, tasks, work done on tasks
=====================================================

This application allows an operational project management system to organize your activities into tasks and plan the work you need to get the tasks completed.

Gantt diagrams will give you a graphical representation of your project plans, as well as resources availability and workload.

Dashboard / Reports for Project Management will include:
--------------------------------------------------------
* My Tasks
* Open Tasks
* Tasks Analysis
* Cumulative Flow
    

Code Analysis

Views touched (33)
XML IDNameModelTypeStatus
analytic_account_inherited_form account.analytic.account.form.inherit account.analytic.account xpath Inherits analytic.view_account_analytic_account_form
board_project_form board.project.form board.board form New
edit_project project.project.form project.project form New
project_category_form_view Tags project.category form New
project_category_search_view Tags project.category search New
task_company res.company.task.config res.company xpath Inherits base.view_company_form
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_config_settings project settings project.config.settings form New
view_project project.project.tree project.project tree New
view_project_kanban project.project.kanban project.project kanban New
view_project_project_filter project.project.select project.project search New
view_project_project_gantt project.project.gantt project.project gantt New
view_project_task_delegate Project Task Delegate project.task.delegate form New
view_project_task_graph project.task.graph project.task graph New
view_project_task_reevaluate Re-evaluate Task project.task.reevaluate form New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_gantt project.task.gantt project.task gantt New
view_task_history_graph project.task.history.cumulative.graph project.task.history.cumulative graph New
view_task_history_search project.task.history.cumulative.search project.task.history.cumulative search New
view_task_history_tree project.task.history.cumulative.tree project.task.history.cumulative tree New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.info.inherit res.partner xpath Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_project_user_tree report.project.task.user.tree report.project.task.user tree New
view_task_search_form project.task.search.form project.task search New
view_task_tree project.task.tree project.task tree New
view_task_tree2 project.task.tree project.task tree New
view_task_work_form project.task.work.form project.task.work form New
view_task_work_tree project.task.work.tree project.task.work tree New
Models touched (0)

No models found for this module.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/6.1/project
VERSION
VERSION 1.1
CATEGORY
CATEGORYProject Management
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOpenERP SA
MAINTAINERS
MAINTAINERSOpenERP SA
COMMITTERS
COMMITTERSRaphael Collet, Jagdish Panchal (Open ERP), Rucha (Open ERP), Atul Patel (OpenERP), Stephane Wirtel, Turkesh Patel (Open ERP), Numerigraphe - Lionel Sausin, DBR (OpenERP), Harry (OpenERP), Stéphane Bidoul, Fabien Pinckaers, Antony Lesuisse, Meera Trambadia (OpenERP), Olivier Dony, Thibault Delavallée, Vo Minh Thu, Launchpad Translations on behalf of openerp, Quentin (OpenERP), Kuldeep Joshi (OpenERP), Nimesh (Open ERP), Mayur Maheshwari (OpenERP), Jigar Amin - OpenERP, Fabien Meghazi, niv-openerp, Xavier ALT, Christophe Simonis, Ujjvala Collins (OpenERP), Xavier Morel, Khushboo Bhatt (Open ERP), Chris Biersbach, Jigar Amin, Serpent Consulting Services, Amit (OpenERP), Minh Tran, Amit Bhavsar (Open ERP), Thibault Francois, Carlos Vásquez, ksa (Open ERP), Els Van Vossel, Israel Fermin Montilla, Rifakat Haradwala (Open ERP), Hardik Ansodariy (OpenERP), ssu, rch-openerp, aag (OpenERP), Yogesh (OpenERP), Sbh (OpenERP), jam-openerp, tfr@openerp.com, ron@tinyerp.com, fp, AMP (OpenERP), Tejas (OpenERP), RME (OpenERP), RavishchanraMurari (Open ERP), Kirti Savalia (OpenERP), YSA (Openerp), Atik Agewan (OpenERP), Ravi Gohil (Open ERP)
WEBSITE
WEBSITEhttp://www.openerp.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:41:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - product
    - process
    - decimal_precision
    - analytic
    - board
    - mail
    - base_tools
    - resource
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Project management module tracks multi-level projects, tasks, work done on tasks, eso.
======================================================================================

It is able to render planning, order tasks, eso.

Dashboard for project members that includes:
--------------------------------------------
    * List of my open tasks
    * List of my delegated tasks
    * Graph of My Projects: Planned vs Total Hours
    * Graph of My Remaining Hours by Project
    

Code Analysis

Views touched (39)
XML IDNameModelTypeStatus
base.view_crm_partner_info_History res.partner.crm.history.inherit1 res.partner xpath Inherits base.view_partner_form
board_project_form board.project.form board.board form New
edit_project project.project.form project.project form New
task_company res.company.task.config res.company page Inherits base.view_company_form
task_type_edit project.task.type.form project.task.type form New
task_type_search project.task.type.search project.task.type search New
task_type_tree project.task.type.tree project.task.type tree New
view_delegated_task_tree project.task.delegated.tree project.task tree New
view_project project.project.tree project.project tree New
view_project_project_filter project.project.select project.project search New
view_project_project_gantt project.project.gantt project.project gantt New
view_project_task_delegate Project Task Delegate project.task.delegate form New
view_project_task_graph project.task.graph project.task graph New
view_project_task_reevaluate Re-evaluate Task project.task.reevaluate form New
view_project_users_form_simple res.users.project.form1 res.users group Inherits base.view_users_form
view_project_vs_planned_total_hours_graph project.vs.planned.total.hour.graph project.vs.hours graph New
view_project_vs_planned_total_hours_tree project.vs.planned.total.hour.tree project.vs.hours tree New
view_project_vs_remaining_hours_graph project.vs.remaining.hour.graph project.vs.hours graph New
view_project_vs_remaining_hours_tree project.vs.remaining.hour.tree project.vs.hours tree New
view_task_by_days_graph task.by.days.graph task.by.days graph New
view_task_by_days_tree task.by.days.tree task.by.days tree New
view_task_calendar project.task.calendar project.task calendar New
view_task_form2 project.task.form project.task form New
view_task_gantt project.task.gantt project.task gantt New
view_task_history_burndown_graph project.task.history.burndown.graph project.task.history.burndown graph New
view_task_history_graph project.task.history.cumulative.graph project.task.history.cumulative graph New
view_task_history_search project.task.history.cumulative.search project.task.history.cumulative search New
view_task_history_tree project.task.history.cumulative.tree project.task.history.cumulative tree New
view_task_kanban project.task.kanban project.task kanban New
view_task_partner_info_form res.partner.task.info.inherit res.partner page Inherits base.view_partner_form
view_task_project_user_graph report.project.task.user.graph report.project.task.user graph New
view_task_project_user_search report.project.task.user.search report.project.task.user search New
view_task_project_user_tree report.project.task.user.tree report.project.task.user tree New
view_task_search_form project.task.search.form project.task search New
view_task_tree project.task.tree project.task tree New
view_task_tree2 project.task.tree project.task tree New
view_task_work_form project.task.work.form project.task.work form New
view_task_work_tree project.task.work.tree project.task.work tree New
view_users_form_project_modif_inherited1 view.users.form.project.modif.inherited1 res.users group Inherits base.view_users_form_simple_modif
Models touched (0)

No models found for this module.