@ -1,6 +1,5 @@ |
|||||
## Module <project_tasks_from_templates> |
## Module <project_tasks_from_templates> |
||||
|
#### 09.01.2024 |
||||
#### 05.06.2022 |
|
||||
#### Version 15.0.1.0.0 |
#### Version 15.0.1.0.0 |
||||
#### ADD |
#### ADD |
||||
Initial Commit for Project Templates |
- Initial Commit for Project Templates |
||||
|
@ -1,82 +0,0 @@ |
|||||
# -*- coding: utf-8 -*- |
|
||||
############################################################################# |
|
||||
# |
|
||||
# Cybrosys Technologies Pvt. Ltd. |
|
||||
# |
|
||||
# Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|
||||
# Author: Cybrosys Technogies @cybrosys(odoo@cybrosys.com) |
|
||||
# |
|
||||
# You can modify it under the terms of the GNU AFFERO |
|
||||
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
|
||||
# |
|
||||
# This program is distributed in the hope that it will be useful, |
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
|
||||
# |
|
||||
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
|
||||
# (AGPL v3) along with this program. |
|
||||
# If not, see <http://www.gnu.org/licenses/>. |
|
||||
# |
|
||||
############################################################################# |
|
||||
|
|
||||
from odoo import models, fields, api, _ |
|
||||
|
|
||||
|
|
||||
class Project(models.Model): |
|
||||
_inherit = 'project.project' |
|
||||
|
|
||||
project_template_id = fields.Many2one('project.task.template') |
|
||||
|
|
||||
def create_task(self, item, parent): |
|
||||
vals = {'project_id': self.id, |
|
||||
'name': item.name, |
|
||||
'parent_id': parent, |
|
||||
'stage_id': self.env['project.task.type'].search([('sequence', '=', 1)], limit=1).id, |
|
||||
'user_ids': item.user_ids, |
|
||||
'description': item.description |
|
||||
} |
|
||||
task_id = self.env['project.task'].create(vals).id |
|
||||
for sub_task in item.child_ids: |
|
||||
self.create_task(sub_task, task_id) |
|
||||
|
|
||||
def action_create_project_from_template(self): |
|
||||
template_id = self.project_template_id |
|
||||
for item in template_id.task_ids: |
|
||||
self.create_task(item, False) |
|
||||
return { |
|
||||
'view_mode': 'form', |
|
||||
'res_model': 'project.project', |
|
||||
'res_id': self.id, |
|
||||
'type': 'ir.actions.act_window', |
|
||||
'context': self._context |
|
||||
} |
|
||||
|
|
||||
|
|
||||
class ProjectTaskCustom(models.Model): |
|
||||
_name = 'project.task.custom' |
|
||||
|
|
||||
name = fields.Char("Name", required=True) |
|
||||
project_template_id = fields.Many2one('project.task.template') |
|
||||
description = fields.Text("Task Description") |
|
||||
user_ids = fields.Many2many('res.users', relation='project_task_custom_user_rel', column1='task_id', |
|
||||
column2='user_id', |
|
||||
string='Assignees', tracking=True) |
|
||||
parent_id = fields.Many2one('project.task.custom', string='Parent Task', index=True) |
|
||||
child_ids = fields.One2many('project.task.custom', 'parent_id', string="Sub-tasks") |
|
||||
|
|
||||
def action_open_task(self): |
|
||||
return { |
|
||||
'view_mode': 'form', |
|
||||
'res_model': 'project.task.custom', |
|
||||
'res_id': self.id, |
|
||||
'type': 'ir.actions.act_window', |
|
||||
'context': self._context |
|
||||
} |
|
||||
|
|
||||
|
|
||||
class ProjectTaskTemplate(models.Model): |
|
||||
_name = 'project.task.template' |
|
||||
|
|
||||
name = fields.Char("Template name", translate=True) |
|
||||
task_ids = fields.One2many('project.task.custom', 'project_template_id', string="Tasks") |
|
@ -0,0 +1,104 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################### |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class ProjectProject(models.Model): |
||||
|
""" This class extends the 'project.project' model to add a many2one |
||||
|
field for selecting project task template. |
||||
|
Methods: |
||||
|
action_create_project_from_template(): |
||||
|
Creates a new project based on the selected project template. |
||||
|
_create_task(item, parent): |
||||
|
Creates a new project task for the given item and attaches |
||||
|
it to the current project. |
||||
|
""" |
||||
|
_inherit = 'project.project' |
||||
|
|
||||
|
project_template_id = fields.Many2one( |
||||
|
'project.task.template', |
||||
|
string='Project Template', |
||||
|
help='Select a project task template to use for this project.') |
||||
|
|
||||
|
def action_create_project_from_template(self): |
||||
|
""" Creates a new project based on the selected project template. |
||||
|
Returns: |
||||
|
dict: Action configuration to open the project form. |
||||
|
""" |
||||
|
if not self.project_template_id.stage_ids: |
||||
|
for item in self.project_template_id.task_ids: |
||||
|
self._create_task(item, False) |
||||
|
return { |
||||
|
'view_mode': 'form', |
||||
|
'res_model': 'project.project', |
||||
|
'res_id': self.id, |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'context': self._context |
||||
|
} |
||||
|
else: |
||||
|
for item in self.project_template_id.stage_ids: |
||||
|
if self.id not in item.project_stage_id.project_ids.ids: |
||||
|
item.project_stage_id.project_ids = [(4, self.id)] |
||||
|
for task in item.task_ids: |
||||
|
self._create_task_with_stage(task, item.project_stage_id, |
||||
|
False) |
||||
|
|
||||
|
def _create_task(self, item, parent): |
||||
|
"""Creates a new project task for the given item and attaches it to |
||||
|
the current project. |
||||
|
Args: |
||||
|
item (models.Model): project task |
||||
|
parent (int): id of parent project task |
||||
|
""" |
||||
|
|
||||
|
task = self.env['project.task'].sudo().create({ |
||||
|
'project_id': self.id, |
||||
|
'name': item.name, |
||||
|
'parent_id': parent, |
||||
|
'stage_id': self.env['project.task.type'].search( |
||||
|
[('sequence', '=', 1)], limit=1).id, |
||||
|
'user_ids': item.user_ids, |
||||
|
'description': item.description, |
||||
|
'kanban_state': item.state or 'normal', |
||||
|
}) |
||||
|
for sub_task in item.child_ids: |
||||
|
self._create_task(sub_task, task.id) |
||||
|
|
||||
|
def _create_task_with_stage(self, item, stage, parent=False): |
||||
|
"""Creates a new project task with stage for the given item and attaches it to |
||||
|
the current project. |
||||
|
Args: |
||||
|
item (models.Model): project task |
||||
|
parent (int): id of parent project task |
||||
|
""" |
||||
|
|
||||
|
task = self.env['project.task'].sudo().create({ |
||||
|
'project_id': self.id, |
||||
|
'name': item.name, |
||||
|
'parent_id': parent, |
||||
|
'stage_id': stage.id, |
||||
|
'user_ids': item.user_ids, |
||||
|
'description': item.description, |
||||
|
'kanban_state': item.state or 'normal', |
||||
|
}) |
||||
|
for sub_task in item.child_ids: |
||||
|
self._create_task_with_stage(sub_task, stage, task.id) |
@ -0,0 +1,85 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################### |
||||
|
from odoo import fields, models |
||||
|
|
||||
|
|
||||
|
class ProjectTaskCustom(models.Model): |
||||
|
"""Customized version of the 'project.task' model to support templates |
||||
|
and sub-tasks |
||||
|
Methods: |
||||
|
action_open_task(): |
||||
|
Returns an action to open the current task in a form view""" |
||||
|
_name = 'project.task.custom' |
||||
|
_description = 'Project Task Custom' |
||||
|
|
||||
|
name = fields.Char(string='Name', required=True, |
||||
|
help='Enter the name of the task') |
||||
|
project_template_id = fields.Many2one( |
||||
|
'project.task.template', string='Project Template', |
||||
|
help='Select a project task template to use for this task.') |
||||
|
description = fields.Html(string='Task Description', |
||||
|
help='Enter a description for the task.') |
||||
|
user_ids = fields.Many2many( |
||||
|
'res.users', relation='project_task_custom_user_rel', column1='task_id', |
||||
|
column2='user_id', string='Assignees', tracking=True, |
||||
|
help='Select the users who are assigned to this task.') |
||||
|
parent_id = fields.Many2one( |
||||
|
'project.task.custom', string='Parent Task', index=True, |
||||
|
help='Select the parent task, if any.') |
||||
|
child_ids = fields.One2many( |
||||
|
'project.task.custom', 'parent_id', string='Sub-Tasks', |
||||
|
help='List of sub-tasks, if any.') |
||||
|
show_tasks_page = fields.Boolean( |
||||
|
compute='_compute_show_tasks_page', |
||||
|
string="Show Tasks Page", |
||||
|
readonly=False) |
||||
|
|
||||
|
state = fields.Selection([ |
||||
|
('normal', 'In Progress'), |
||||
|
('done', 'Ready'), |
||||
|
('blocked', 'Blocked')], string='State', |
||||
|
default='normal', required=True) |
||||
|
|
||||
|
def action_open_task(self): |
||||
|
""" Action method to open the current task in a form view. |
||||
|
Returns: |
||||
|
dict: Action configuration to open the task form. |
||||
|
""" |
||||
|
return { |
||||
|
'view_mode': 'form', |
||||
|
'res_model': 'project.task.custom', |
||||
|
'res_id': self.id, |
||||
|
'type': 'ir.actions.act_window', |
||||
|
'context': self._context |
||||
|
} |
||||
|
|
||||
|
def _compute_show_tasks_page(self): |
||||
|
""" Compute function to determine whether Sub-Tasks are enabled. |
||||
|
This method computes the value of the 'show_tasks_page' field for each |
||||
|
record based on whether Sub-Tasks are enabled or not. If Sub-Tasks |
||||
|
are enabled, 'show_tasks_page' is set to True, allowing the display |
||||
|
of Sub-Tasks. If Sub-Tasks are not enabled, 'show_tasks_page' is set |
||||
|
to False. |
||||
|
""" |
||||
|
for task in self: |
||||
|
task.show_tasks_page = self.env.user.has_group( |
||||
|
'project.group_subtask_project') |
@ -0,0 +1,64 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################### |
||||
|
# |
||||
|
# Cybrosys Technologies Pvt. Ltd. |
||||
|
# |
||||
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) |
||||
|
# Author: Cybrosys Techno Solutions (odoo@cybrosys.com) |
||||
|
# |
||||
|
# You can modify it under the terms of the GNU AFFERO |
||||
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE |
||||
|
# (AGPL v3) along with this program. |
||||
|
# If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################### |
||||
|
from odoo import fields, models , api |
||||
|
|
||||
|
|
||||
|
class ProjectTaskTemplate(models.Model): |
||||
|
"""A model to define task templates for projects.""" |
||||
|
_name = 'project.task.template' |
||||
|
_description = 'Project Task Template' |
||||
|
|
||||
|
name = fields.Char(string='Template Name', translate=True, |
||||
|
help='Name for the task template.') |
||||
|
task_ids = fields.One2many( |
||||
|
'project.task.custom', 'project_template_id', |
||||
|
string='Tasks', |
||||
|
help='List of the tasks associated with this template.') |
||||
|
stage_ids = fields.One2many( |
||||
|
'project.stage', 'project_template_id', |
||||
|
string='Stages', |
||||
|
help='List of the stages associated with this template.') |
||||
|
|
||||
|
|
||||
|
class ProjectStage(models.Model): |
||||
|
"""A model to define task templates for projects.""" |
||||
|
_name = 'project.stage' |
||||
|
_order = "sequence,id" |
||||
|
|
||||
|
project_template_id = fields.Many2one( |
||||
|
'project.task.template', string='Project Template', |
||||
|
help='Select a project task template to use for this task.') |
||||
|
project_stage_id = fields.Many2one( |
||||
|
'project.task.type', string='Project Stage', |
||||
|
help='Select a project stage. ',required=True) |
||||
|
task_ids = fields.Many2many( |
||||
|
'project.task.custom', |
||||
|
help='Choose the tasks corresponding to each stage') |
||||
|
|
||||
|
sequence = fields.Integer(related="project_stage_id.sequence",readonly=False) |
||||
|
|
||||
|
|
||||
|
class ProjectTaskType(models.Model): |
||||
|
_inherit = "project.task.type" |
||||
|
|
||||
|
project_template_id = fields.Many2one( |
||||
|
'project.task.template') |
|
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 565 B |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 78 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 97 KiB |
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 81 KiB |
After Width: | Height: | Size: 102 KiB |
After Width: | Height: | Size: 113 KiB |
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 54 KiB |
@ -0,0 +1,33 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8" ?> |
||||
|
<odoo> |
||||
|
<!-- Inherits simplified project.project form view to add fields --> |
||||
|
<record id="project_project_view_form_simplified" model="ir.ui.view" > |
||||
|
<field name="name">project.project.view.form.inherit.project.tasks.from.templates</field> |
||||
|
<field name="model">project.project</field> |
||||
|
<field name="inherit_id" ref="project.project_project_view_form_simplified"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//field[@name='name']" position="after"> |
||||
|
<field name="project_template_id" string="Template"/> |
||||
|
</xpath> |
||||
|
<xpath expr="//group" position="after"> |
||||
|
<footer> |
||||
|
<button string="Create" name="action_view_tasks" type="object" class="btn-primary o_open_tasks" |
||||
|
data-hotkey="q"/> |
||||
|
<button string="Discard" class="btn-secondary" special="cancel" data-hotkey="z"/> |
||||
|
</footer> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Inherits simplified project.project.footer form view to add buttons --> |
||||
|
<record id="project.project_project_view_form_simplified_footer" model="ir.ui.view" > |
||||
|
<field name="name">project.project.view.form.simplified</field> |
||||
|
<field name="model">project.project</field> |
||||
|
<field name="inherit_id" ref="project.project_project_view_form_simplified"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<xpath expr="//button[hasclass('o_open_tasks')]" position="after"> |
||||
|
<button string="Create Project from Template" name="action_create_project_from_template" |
||||
|
type="object" class="btn-primary o_open_tasks" attrs="{'invisible':[('project_template_id','=',False)]}"/> |
||||
|
</xpath> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -1,97 +0,0 @@ |
|||||
<?xml version="1.0" encoding="utf-8" ?> |
|
||||
<odoo> |
|
||||
|
|
||||
<record id="create_project_templates" model="ir.actions.act_window"> |
|
||||
<field name="name">Project Templates</field> |
|
||||
<field name="res_model">project.task.template</field> |
|
||||
<field name="view_mode">tree,form</field> |
|
||||
</record> |
|
||||
|
|
||||
<menuitem id="project_menu_templates" |
|
||||
action="create_project_templates" |
|
||||
parent="project.menu_project_config"/> |
|
||||
|
|
||||
<record model="ir.ui.view" id="project_tasks_from_templates"> |
|
||||
<field name="name">project.template.tasks.manager</field> |
|
||||
<field name="model">project.task.template</field> |
|
||||
<field name="arch" type="xml"> |
|
||||
<form> |
|
||||
<sheet> |
|
||||
<group> |
|
||||
<field name="name"/> |
|
||||
</group> |
|
||||
<notebook> |
|
||||
<page name="tasks_page" string="Tasks"> |
|
||||
<field name="task_ids"> |
|
||||
<tree editable="bottom"> |
|
||||
<field name="name"/> |
|
||||
<field name="description" widget="html"/> |
|
||||
<field name="user_ids" widget="many2many_avatar_user" optional="show" |
|
||||
domain="[('share', '=', False), ('active', '=', True)]"/> |
|
||||
<button name="action_open_task" type="object" title="View Task" |
|
||||
string="View Task" class="btn btn-link pull-right"/> |
|
||||
</tree> |
|
||||
</field> |
|
||||
</page> |
|
||||
</notebook> |
|
||||
</sheet> |
|
||||
</form> |
|
||||
|
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record model="ir.ui.view" id="project_tasks_custom_form"> |
|
||||
<field name="name">project.custom.tasks.manager</field> |
|
||||
<field name="model">project.task.custom</field> |
|
||||
<field name="arch" type="xml"> |
|
||||
<form> |
|
||||
<sheet> |
|
||||
<group> |
|
||||
<field name="name"/> |
|
||||
<field name="description" widget="html" options="{'collaborative': true}"/> |
|
||||
</group> |
|
||||
<notebook> |
|
||||
<page name="tasks_page" string="Tasks"> |
|
||||
<tree editable="bottom"> |
|
||||
<field name="child_ids"/> |
|
||||
</tree> |
|
||||
</page> |
|
||||
</notebook> |
|
||||
</sheet> |
|
||||
</form> |
|
||||
|
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record id="project.project_project_view_form_simplified_footer" model="ir.ui.view"> |
|
||||
<field name="name">project.project.view.form.simplified</field> |
|
||||
<field name="model">project.project</field> |
|
||||
<field name="inherit_id" ref="project.project_project_view_form_simplified"/> |
|
||||
<field name="mode">primary</field> |
|
||||
<field name="arch" type="xml"> |
|
||||
<xpath expr="//field[@name='name']" position="after"> |
|
||||
<field name="project_template_id" string="Template"/> |
|
||||
</xpath> |
|
||||
<xpath expr="//group" position="after"> |
|
||||
<footer> |
|
||||
<button string="Create Project from Template" name="action_create_project_from_template" |
|
||||
type="object" class="btn-primary o_open_tasks" data-hotkey="l"/> |
|
||||
<button string="Create" name="action_view_tasks" type="object" class="btn-primary o_open_tasks" |
|
||||
data-hotkey="q"/> |
|
||||
<button string="Discard" class="btn-secondary" special="cancel" data-hotkey="z"/> |
|
||||
</footer> |
|
||||
</xpath> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
<record model="ir.ui.view" id="project_tasks_from_templates_tree"> |
|
||||
<field name="name">project.template.tasks.manager.tree</field> |
|
||||
<field name="model">project.task.template</field> |
|
||||
<field name="arch" type="xml"> |
|
||||
<tree> |
|
||||
<field name="name"/> |
|
||||
</tree> |
|
||||
</field> |
|
||||
</record> |
|
||||
|
|
||||
</odoo> |
|
@ -0,0 +1,29 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- Form view for project.task.custom --> |
||||
|
<record id="project_task_custom_view_form" model="ir.ui.view"> |
||||
|
<field name="name">project.task.custom.view.form</field> |
||||
|
<field name="model">project.task.custom</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<field name="name"/> |
||||
|
<field name="description" widget="html"/> |
||||
|
<field name="show_tasks_page" invisible="1"/> |
||||
|
</group> |
||||
|
<notebook> |
||||
|
<page name="tasks_page" string="Tasks" attrs="{'invisible': [('show_tasks_page', '=', False)]}"> |
||||
|
<field name="child_ids"> |
||||
|
<tree editable="bottom"> |
||||
|
<field name="name"/> |
||||
|
<field name="state"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</page> |
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
@ -0,0 +1,62 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
<odoo> |
||||
|
<!-- Tree view for project.task.template --> |
||||
|
<record id="project_task_template_view_tree" model="ir.ui.view"> |
||||
|
<field name="name">project.task.template.view.tree</field> |
||||
|
<field name="model">project.task.template</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree> |
||||
|
<field name="name"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Form view for project.task.template --> |
||||
|
<record id="project_task_template_view_form" model="ir.ui.view"> |
||||
|
<field name="name">project.task.template.view.form</field> |
||||
|
<field name="model">project.task.template</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<field name="name"/> |
||||
|
</group> |
||||
|
<notebook> |
||||
|
<page name="tasks_page" string="Tasks"> |
||||
|
<field name="task_ids"> |
||||
|
<tree editable="bottom"> |
||||
|
<field name="name"/> |
||||
|
<field name="description" type="html"/> |
||||
|
<field name="user_ids" widget="many2many_avatar_user" |
||||
|
optional="show" domain="[('share', '=', False), ('active', '=', True)]"/> |
||||
|
<field name="state"/> |
||||
|
<button name="action_open_task" type="object" title="View Task" |
||||
|
string="View Task" class="btn btn-link pull-right"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</page> |
||||
|
<page name="stages_page" string="Stages"> |
||||
|
<field name="stage_ids"> |
||||
|
<tree editable="bottom" > |
||||
|
<field name='sequence' widget='handle'/> |
||||
|
<field name="project_stage_id" domain="[('project_template_id', '=', project_template_id)]" context="{'default_project_template_id': project_template_id, 'default_sequence': sequence}" options="{'no_create_edit':True}"/> |
||||
|
<field name="project_template_id" invisible="1"/> |
||||
|
<field name="task_ids" domain="[('project_template_id', '=', project_template_id)]" widget="many2many_tags"/> |
||||
|
</tree> |
||||
|
|
||||
|
</field> |
||||
|
</page> |
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
<!-- Action window for project.task.template --> |
||||
|
<record id="project_task_template_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Project Templates</field> |
||||
|
<field name="res_model">project.task.template</field> |
||||
|
<field name="view_mode">tree,form</field> |
||||
|
</record> |
||||
|
<!-- Menu --> |
||||
|
<menuitem id="project_task_template_menu_action" action="project_task_template_action" |
||||
|
parent="project.menu_project_config"/> |
||||
|
</odoo> |