Skip to content

Commit e150620

Browse files
nikul-serpentcshuguesdk
authored andcommitted
project_operating_unit v12
1 parent c71efc3 commit e150620

14 files changed

+235
-0
lines changed

project_operating_unit/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
2+
from . import models
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Copyright (C) 2019 Open Source Integrators
2+
# Copyright (C) 2019 Serpent Consulting Services
3+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4+
{
5+
"name": 'Project with Operating Units',
6+
"summary": """
7+
This module adds operating unit information to projects and tasks.""",
8+
"version": "12.0.1.0.0",
9+
"author": "Open Source Integrators, "
10+
"Serpent Consulting Services Pvt. Ltd.,"
11+
"Odoo Community Association (OCA)",
12+
"website": "https://github.com/OCA/operating-unit",
13+
"category": "Project",
14+
"depends": [
15+
'operating_unit',
16+
'project'
17+
],
18+
"license": "AGPL-3",
19+
"data": [
20+
'security/project_security.xml',
21+
'views/project_project.xml',
22+
'views/project_task.xml',
23+
],
24+
'installable': True,
25+
'development_status': 'Beta',
26+
'maintainers': [
27+
'max3903',
28+
],
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
2+
from . import project_project
3+
from . import project_task
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Copyright (C) 2019 Open Source Integrators
2+
# Copyright (C) 2019 Serpent Consulting Services
3+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4+
from odoo import fields, models
5+
6+
7+
class ProjectProject(models.Model):
8+
_inherit = 'project.project'
9+
10+
operating_unit_id = fields.Many2one(
11+
comodel_name='operating.unit',
12+
string='Operating Unit',
13+
default=lambda self: self.env['res.users'].operating_unit_default_get(
14+
self._uid)
15+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Copyright (C) 2019 Open Source Integrators
2+
# Copyright (C) 2019 Serpent Consulting Services
3+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4+
from odoo import fields, models
5+
6+
7+
class ProjectTask(models.Model):
8+
_inherit = 'project.task'
9+
10+
operating_unit_id = fields.Many2one(
11+
comodel_name='operating.unit',
12+
related="project_id.operating_unit_id",
13+
string='Operating Unit',
14+
default=lambda self: self.env['res.users'].operating_unit_default_get(
15+
self._uid)
16+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
* Nikul Chaudhary <[email protected]>
2+
* Maxime Chambreuil <[email protected]>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
* Open Source Integrators
2+
* Serpent Consulting Services Pvt. Ltd.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This module adds operating unit information to projects and tasks.
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
* Go to Project
2+
* You only see the projects and tasks of your operating units
3+
* Create a new project. It is assigned to your default operating unit.
4+
* Create a task within a project. It inherits the operating unit of the project.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<odoo>
2+
3+
<!-- Copyright (C) 2019 Open Source Integrators
4+
Copyright (C) 2019 Serpent Consulting Services
5+
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
6+
7+
<record id="ir_rule_project_project_operating_unit" model="ir.rule">
8+
<field name="model_id" ref="project.model_project_project"/>
9+
<field name="domain_force">['|', ('operating_unit_id','=',False), ('operating_unit_id','in',user.operating_unit_ids.ids)]
10+
</field>
11+
<field name="name">Project Operating Unit</field>
12+
<field name="global" eval="True"/>
13+
<field eval="0" name="perm_unlink"/>
14+
<field eval="0" name="perm_write"/>
15+
<field eval="1" name="perm_read"/>
16+
<field eval="0" name="perm_create"/>
17+
</record>
18+
19+
<record id="ir_rule_project_task_operating_unit" model="ir.rule">
20+
<field name="model_id" ref="project.model_project_task"/>
21+
<field name="domain_force">['|', ('operating_unit_id','=',False), ('operating_unit_id','in',user.operating_unit_ids.ids)]
22+
</field>
23+
<field name="name">Project Task Operating Unit</field>
24+
<field name="global" eval="True"/>
25+
<field eval="0" name="perm_unlink"/>
26+
<field eval="0" name="perm_write"/>
27+
<field eval="1" name="perm_read"/>
28+
<field eval="0" name="perm_create"/>
29+
</record>
30+
31+
</odoo>
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
2+
from . import test_project_operating_unit
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# Copyright (C) 2019 Open Source Integrators
2+
# Copyright (C) 2019 Serpent Consulting Services
3+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4+
from odoo.tests import common
5+
6+
7+
class TestProject(common.TransactionCase):
8+
9+
def setUp(self):
10+
super(TestProject, self).setUp()
11+
self.project_obj = self.env['project.project']
12+
self.task_obj = self.env['project.task']
13+
self.res_users_model = self.env['res.users']
14+
15+
self.partner_1 = self.env['res.partner'].create({
16+
'name': 'SERPENTCS ',
17+
'email': '[email protected]'})
18+
19+
# Groups
20+
self.grp_mngr =\
21+
self.env.ref('project.group_project_manager')
22+
self.grp_user = self.env.ref('project.group_project_user')
23+
# Company
24+
self.company = self.env.ref('base.main_company')
25+
# Main Operating Unit
26+
self.main_OU = self.env.ref('operating_unit.main_operating_unit')
27+
# B2C Operating Unit
28+
self.b2c_OU = self.env.ref('operating_unit.b2c_operating_unit')
29+
# Create User 1 with Main OU
30+
self.user1 = self._create_user('user_1', [self.grp_mngr,
31+
self.grp_user],
32+
self.company, [self.main_OU])
33+
# Create User 2 with B2C OU
34+
self.user2 = self._create_user('user_2', [self.grp_mngr,
35+
self.grp_user],
36+
self.company, [self.b2c_OU])
37+
38+
self.project1 = self._create_project(self.user1, self.main_OU)
39+
self.project2 = self._create_project(self.user2, self.b2c_OU)
40+
self.task1 = self._create_task(self.user1, self.project1)
41+
self.task2 = self._create_task(self.user2, self.project2)
42+
43+
def _create_user(self, login, groups, company, operating_units):
44+
""" Create a user. """
45+
group_ids = [group.id for group in groups]
46+
user = self.res_users_model.create({
47+
'name': login,
48+
'login': login,
49+
'password': 'demo',
50+
'email': '[email protected]',
51+
'company_id': company.id,
52+
'company_ids': [(4, company.id)],
53+
'operating_unit_ids': [(4, ou.id) for ou in operating_units],
54+
'groups_id': [(6, 0, group_ids)]
55+
})
56+
return user
57+
58+
def _create_project(self, uid, operating_unit):
59+
project = self.project_obj.sudo(uid).create({
60+
'name': 'Test Project',
61+
'operating_unit_id': operating_unit.id,
62+
'privacy_visibility': 'employees',
63+
'partner_id': self.partner_1.id
64+
})
65+
return project
66+
67+
def _create_task(self, uid, project):
68+
task = self.task_obj.sudo(uid).create({
69+
'name': 'Test Task',
70+
'user_id': uid.id,
71+
'project_id': project.id
72+
})
73+
return task
74+
75+
def test_project(self):
76+
# User 2 is only assigned to B2C Operating Unit, and cannot
77+
# access Project for Main Operating Unit.
78+
projects = self.project_obj.sudo(self.user2.id).search(
79+
[('id', '=', self.project2.id),
80+
('operating_unit_id', '=', self.main_OU.id)])
81+
self.assertEqual(projects.ids, [], 'User 2 should not have access to '
82+
'%s' % self.main_OU.name)
83+
self.assertEqual(self.project1.operating_unit_id.id, self.main_OU.id)
84+
85+
def test_project_task(self):
86+
# User 2 is only assigned to B2C Operating Unit, and cannot
87+
# access Task for Main Operating Unit.
88+
tasks = self.task_obj.sudo(self.user2.id).search(
89+
[('id', '=', self.task2.id),
90+
('operating_unit_id', '=', self.main_OU.id)])
91+
self.assertEqual(tasks.ids, [], 'User 2 should not have access to '
92+
'%s' % self.main_OU.name)
93+
self.assertEqual(self.task1.operating_unit_id.id,
94+
self.project1.operating_unit_id.id)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<odoo>
2+
<!-- Copyright (C) 2019 Open Source Integrators
3+
Copyright (C) 2019 Serpent Consulting Services
4+
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
5+
6+
<record id="view_edit_project_form_inherit" model="ir.ui.view">
7+
<field name="name">project.project.form</field>
8+
<field name="model">project.project</field>
9+
<field name="inherit_id" ref="project.edit_project"/>
10+
<field name="arch" type="xml">
11+
<field name="user_id" position="after">
12+
<field name="operating_unit_id"/>
13+
</field>
14+
</field>
15+
</record>
16+
17+
</odoo>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<odoo>
2+
<!-- Copyright (C) 2019 Open Source Integrators
3+
Copyright (C) 2019 Serpent Consulting Services
4+
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
5+
6+
<record id="view_view_task_form2_inherit" model="ir.ui.view">
7+
<field name="name">project.task.form</field>
8+
<field name="model">project.task</field>
9+
<field name="inherit_id" ref="project.view_task_form2"/>
10+
<field name="arch" type="xml">
11+
<field name="user_id" position="after">
12+
<field name="operating_unit_id"/>
13+
</field>
14+
</field>
15+
</record>
16+
17+
</odoo>

0 commit comments

Comments
 (0)