Skip to content

Commit 7a55d7f

Browse files
committed
[IMP] project: add project roles, role-user mapping models, tasks assignation
1 parent 2955476 commit 7a55d7f

File tree

8 files changed

+62
-1
lines changed

8 files changed

+62
-1
lines changed

addons/project/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from . import project_task_stage_personal
1010
from . import project_milestone
1111
from . import project_project
12+
from . import project_role_user_map
13+
from . import project_role
1214
from . import project_task
1315
from . import project_task_type
1416
from . import project_tags

addons/project/models/project_project.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1284,4 +1284,11 @@ def action_create_from_template(self, values=None):
12841284
field: False
12851285
for field in self._get_template_field_blacklist()
12861286
}
1287-
return self.with_context(copy_from_template=True).copy(default=default)
1287+
new_project = self.with_context(copy_from_template=True).copy(default=default)
1288+
# Tasks dispatching with project roles
1289+
for original_task, new_task in zip(self.task_ids, new_project.task_ids):
1290+
for role in original_task.role_ids:
1291+
if users := self.role_user_ids.filtered(lambda m: m.role_id == role).user_ids:
1292+
new_task.user_ids = users
1293+
break
1294+
return new_project

addons/project/models/project_role.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from random import randint
2+
3+
from odoo import fields, models
4+
5+
6+
class ProjectRole(models.Model):
7+
_name = 'project.role'
8+
_description = 'Project Role'
9+
_order = 'sequence'
10+
_rec_name = 'name'
11+
12+
def _get_default_color(self):
13+
return randint(1, 11)
14+
15+
active = fields.Boolean(default=True)
16+
name = fields.Char(required=True, translate=True)
17+
color = fields.Integer(default=_get_default_color)
18+
sequence = fields.Integer(export_string_translation=False)
19+
20+
def copy_data(self, default=None):
21+
vals_list = super().copy_data(default=default)
22+
return [dict(vals, name=self.env._('%s (copy)', role.name)) for role, vals in zip(self, vals_list)]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from odoo import fields, models
2+
3+
4+
class ProjectRoleUserMap(models.Model):
5+
_name = 'project.role.user.map'
6+
_description = 'Project role by users mapping'
7+
8+
project_id = fields.Many2one('project.project', domain=[('is_template', '=', True)], required=True)
9+
task_roles = fields.Many2many('project.role', related='project_id.task_ids.role_ids')
10+
role_id = fields.Many2one('project.role', domain="[('id', 'in', task_roles)]", required=True)
11+
user_ids = fields.Many2many('res.users', string='Assignees', required=True)
12+
13+
_role_uniq = models.Constraint(
14+
'UNIQUE(project_id,role_id)',
15+
'A role cannot be selected more than once in the mapping. Please remove duplicate(s) and try again.',
16+
)

addons/project/models/project_task.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ def _read_group_personal_stage_type_ids(self, stages, domain):
186186
allocated_hours = fields.Float("Allocated Time", tracking=True)
187187
subtask_allocated_hours = fields.Float("Sub-tasks Allocated Time", compute='_compute_subtask_allocated_hours', export_string_translation=False,
188188
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.")
189+
role_ids = fields.Many2many('project.role', string='Roles')
189190
# Tracking of this field is done in the write function
190191
user_ids = fields.Many2many('res.users', relation='project_task_user_rel', column1='task_id', column2='user_id',
191192
string='Assignees', context={'active_test': False}, tracking=True, default=_default_user_ids, domain="[('share', '=', False), ('active', '=', True)]", falsy_value_label=_lt("👤 Unassigned"))

addons/project/security/ir.model.access.csv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,7 @@ access_mail_activity_plan_project_manager,mail.activity.plan.project.manager,mai
4848
access_mail_activity_plan_template_project_manager,mail.activity.plan.template.project.manager,mail.model_mail_activity_plan_template,project.group_project_manager,1,1,1,1
4949
access_project_template_create_wizard_user,project.template.create.wizard.user,project.model_project_template_create_wizard,project.group_project_user,1,1,0,0
5050
access_project_template_create_wizard_manager,project.template.create.wizard.manager,project.model_project_template_create_wizard,project.group_project_manager,1,1,1,1
51+
access_project_role_user,project.role.user,model_project_role,project.group_project_user,1,0,0,0
52+
access_project_role_manager,project.role.manager,model_project_role,project.group_project_manager,1,1,1,1
53+
access_project_role_user_map_user,project.role.user.map.user,model_project_role_user_map,project.group_project_user,1,0,0,0
54+
access_project_role_user_map_manager,project.role.user.map.manager,model_project_role_user_map,project.group_project_manager,1,1,1,1

addons/project/views/project_project_views.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@
157157
</group>
158158
</group>
159159
</page>
160+
<page name="role_user_mapping" string="Roles" invisible="not is_template">
161+
<field name="role_user_ids" mode="list">
162+
<list editable="bottom">
163+
<field name="role_id" options="{'no_create': True}"/>
164+
<field name="user_ids" widget="many2many_avatar_user"/>
165+
</list>
166+
</field>
167+
</page>
160168
</notebook>
161169
</sheet>
162170
<chatter reload_on_follower="True"/>

addons/project/views/project_task_views.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@
416416
class="o_task_user_field"
417417
options="{'no_open': True, 'no_quick_create': True}"
418418
widget="many2many_avatar_user"/>
419+
<field name="role_ids" invisible="not is_template" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}" placeholder="Assign at project creation"/>
419420
<field name="priority" widget="priority_switch"/>
420421
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color', 'no_create_edit': True}" context="{'project_id': project_id}"/>
421422
</group>

0 commit comments

Comments
 (0)