Skip to content

Commit c165e32

Browse files
[IMP] sales_security_team: revert changes to recover esencial functionality
1 parent 880a8c1 commit c165e32

File tree

5 files changed

+157
-24
lines changed

5 files changed

+157
-24
lines changed

sales_team_security/models/ir_rule.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,33 @@ def _compute_domain(self, model_name, mode="read"):
2626
"""
2727
res = super()._compute_domain(model_name, mode=mode)
2828
user = self.env.user
29-
group_my_records = "sales_team.group_sale_salesman"
30-
group_all_records = "sales_team.group_sale_salesman_all_leads"
29+
group1 = "sales_team.group_sale_salesman"
30+
group2 = "sales_team_security.group_sale_team_manager"
31+
group3 = "sales_team.group_sale_salesman_all_leads"
3132
if model_name == "res.partner" and not self.env.su:
32-
if user.has_group(group_my_records) and not user.has_group(
33-
group_all_records
34-
):
35-
domain_followers = [
33+
if user.has_group(group1) and not user.has_group(group3):
34+
extra_domain = [
3635
"|",
3736
("message_partner_ids", "in", user.partner_id.ids),
3837
("id", "=", user.partner_id.id),
3938
]
40-
domain_user = [("user_id", "in", [user.id, False])]
41-
extra_domain = expression.OR([domain_followers, domain_user])
39+
if user.has_group(group2):
40+
extra_domain += [
41+
"|",
42+
("team_id", "=", user.sale_team_id.id),
43+
("team_id", "=", False),
44+
]
45+
else:
46+
extra_domain += [
47+
"|",
48+
("user_id", "=", user.id),
49+
"&",
50+
("user_id", "=", False),
51+
"|",
52+
("team_id", "=", False),
53+
("team_id", "=", user.sale_team_id.id),
54+
]
55+
4256
extra_domain = expression.normalize_domain(extra_domain)
4357
res = expression.AND([extra_domain] + [res])
4458
return res

sales_team_security/models/res_partner.py

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
44

55

6+
from lxml import etree
7+
68
from odoo import api, fields, models
79

810

@@ -11,6 +13,62 @@ class ResPartner(models.Model):
1113

1214
# add indexes for better performance on record rules
1315
user_id = fields.Many2one(index=True)
16+
# team_id = fields.Many2one(
17+
# "crm.team",
18+
# string="Sales Team",
19+
# compute="_compute_team_id",
20+
# precompute=True, # avoid queries post-create
21+
# ondelete="set null",
22+
# readonly=False,
23+
# store=True,
24+
# index=True,
25+
# )
26+
27+
@api.model
28+
def get_view(self, view_id=None, view_type="form", **options):
29+
"""
30+
Patch view to inject the default value for the team_id and user_id.
31+
"""
32+
# FIXME: Use base_view_inheritance_extension when available
33+
res = super().get_view(view_id, view_type, **options)
34+
if view_type == "form":
35+
eview = etree.fromstring(res["arch"])
36+
xml_fields = eview.xpath("//field[@name='child_ids']")
37+
if xml_fields:
38+
context_str = (
39+
xml_fields[0]
40+
.get("context", "{}")
41+
.replace(
42+
"{",
43+
"{'default_team_id': team_id, 'default_user_id': user_id,",
44+
1,
45+
)
46+
)
47+
xml_fields[0].set("context", context_str)
48+
res["arch"] = etree.tostring(eview)
49+
return res
50+
51+
@api.onchange("parent_id")
52+
def _onchange_parent_id_sales_team_security(self):
53+
"""If assigning a parent partner and the contact doesn't have
54+
team or salesman, we put the parent's one (if any).
55+
"""
56+
if self.parent_id and self.parent_id.user_id and not self.user_id:
57+
self.user_id = self.parent_id.user_id.id
58+
59+
# @api.onchange("user_id")
60+
# def _onchange_user_id_sales_team_security(self):
61+
# if self.user_id.sale_team_id:
62+
# self.team_id = self.user_id.sale_team_id
63+
64+
# @api.depends("parent_id")
65+
# def _compute_team_id(self):
66+
# for partner in self.filtered(
67+
# lambda partner: not partner.team_id
68+
# and partner.company_type == "person"
69+
# and partner.parent_id.team_id
70+
# ):
71+
# partner.team_id = partner.parent_id.team_id
1472

1573
def _remove_key_followers(self, partner):
1674
for record in self.mapped("commercial_partner_id"):
@@ -23,7 +81,7 @@ def _remove_key_followers(self, partner):
2381
def _add_followers_from_salesmen(self):
2482
"""Sync followers in commercial partner + delivery/invoice contacts."""
2583
for record in self.commercial_partner_id:
26-
followers = (record.child_ids + record).user_id.partner_id
84+
followers = (record.child_ids + record).mapped("user_id.partner_id")
2785
# Look for delivery and invoice addresses
2886
childrens = record.child_ids.filtered(
2987
lambda x: x.type in {"invoice", "delivery"}
@@ -35,6 +93,7 @@ def create(self, vals_list):
3593
"""Sync followers on contact creation."""
3694
records = super().create(vals_list)
3795
records._add_followers_from_salesmen()
96+
# records._sync_team_id_to_children()
3897
return records
3998

4099
def write(self, vals):
@@ -50,4 +109,14 @@ def write(self, vals):
50109
result = super().write(vals)
51110
if "user_id" in vals or vals.get("type") in {"invoice", "delivery"}:
52111
self._add_followers_from_salesmen()
112+
# if "user_id" in vals or "team_id" in vals:
113+
# self._sync_team_id_to_children()
53114
return result
115+
116+
# def _sync_team_id_to_children(self):
117+
# for parent in self:
118+
# if parent.child_ids:
119+
# for child in parent.child_ids:
120+
# child.team_id = parent.team_id
121+
# if parent.user_id:
122+
# child.user_id = parent.user_id

sales_team_security/tests/common.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ def setUpClass(cls):
2525
"crm_team_id": cls.team.id,
2626
}
2727
)
28-
cls.partner = cls.env["res.partner"].create({"name": "Test partner"})
28+
cls.partner = cls.env["res.partner"].create(
29+
{"name": "Test partner", "team_id": cls.team.id}
30+
)
2931
cls.partner_child_1 = cls.env["res.partner"].create(
3032
{"name": "Child 1", "parent_id": cls.partner.id}
3133
)
@@ -51,13 +53,12 @@ def setUpClass(cls):
5153
cls.check_permission_subscribe = False
5254

5355
def _check_permission(self, salesman, team, expected):
54-
vals = {"user_id": salesman.id if salesman else salesman}
55-
# Check if the record has a team_id field
56-
# This is needed for the test to work with different models
57-
# such as sales_team_security_crm and sales_team_security_sale modules.
58-
if "team_id" in self.record._fields:
59-
vals["team_id"] = team.id if team else team
60-
self.record.write(vals)
56+
self.record.write(
57+
{
58+
"user_id": salesman.id if salesman else salesman,
59+
"team_id": team.id if team else team,
60+
}
61+
)
6162
domain = [("id", "=", self.record.id)]
6263
if (
6364
self.check_permission_subscribe
@@ -70,11 +71,12 @@ def _check_permission(self, salesman, team, expected):
7071

7172
@mute_logger("odoo.models.unlink")
7273
def _check_whole_permission_set(self, extra_checks=True):
73-
is_res_partner = self.record._name == "res.partner"
7474
self._check_permission(False, False, True)
7575
self._check_permission(self.user, False, True)
7676
self._check_permission(self.user2, False, False)
7777
self._check_permission(False, self.team, True)
78+
if extra_checks:
79+
self._check_permission(False, self.team2, False)
7880
self._check_permission(self.user, self.team, True)
7981
self._check_permission(self.user, self.team2, True)
8082
self._check_permission(self.user2, self.team2, False)
@@ -85,19 +87,19 @@ def _check_whole_permission_set(self, extra_checks=True):
8587
]
8688
self._check_permission(False, False, True)
8789
self._check_permission(self.user, False, True)
88-
if not is_res_partner:
89-
self._check_permission(self.user2, False, True)
90+
self._check_permission(self.user2, False, True)
9091
self._check_permission(False, self.team, True)
92+
if extra_checks:
93+
self._check_permission(False, self.team2, False)
9194
self._check_permission(self.user, self.team, True)
92-
if is_res_partner:
95+
if self.record._name == "res.partner":
9396
self.check_permission_subscribe = True
9497
self._check_permission(self.user, self.team2, True)
9598
self.check_permission_subscribe = False
9699
else:
97100
self._check_permission(self.user, self.team2, True)
98101
self._check_permission(self.user2, self.team2, False)
99-
if not is_res_partner:
100-
self._check_permission(self.user2, self.team, True)
102+
self._check_permission(self.user2, self.team, True)
101103
# Add to group "See all leads"
102104
self.user.groups_id = [
103105
(4, self.env.ref("sales_team.group_sale_salesman_all_leads").id)
@@ -112,7 +114,7 @@ def _check_whole_permission_set(self, extra_checks=True):
112114
self._check_permission(self.user2, self.team2, True)
113115
self._check_permission(self.user2, self.team, True)
114116
# Regular internal user
115-
if extra_checks and is_res_partner:
117+
if extra_checks:
116118
self.user.groups_id = [(6, 0, [self.env.ref("base.group_user").id])]
117119
self._check_permission(False, False, True)
118120
self._check_permission(self.user, False, True)

sales_team_security/tests/test_sales_team_security.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
# Copyright 2021 Tecnativa - Víctor Martínez
33
# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html
44

5+
from lxml import etree
56

7+
from ..hooks import post_init_hook
68
from .common import TestCommon
79

810

@@ -15,11 +17,35 @@ def setUpClass(cls):
1517
cls.record = cls.partner
1618

1719
def test_onchange_parent_id(self):
20+
contact = self.env["res.partner"].create(
21+
{"name": "Test contact", "parent_id": self.partner.id}
22+
)
23+
contact._onchange_parent_id_sales_team_security()
24+
self.assertEqual(contact.team_id, self.team)
1825
contact2 = self.env["res.partner"].create(
1926
{"name": "Test contact", "parent_id": self.partner2.id}
2027
)
28+
contact2._onchange_parent_id_sales_team_security()
2129
self.assertEqual(contact2.user_id, self.user)
2230

31+
def test_onchange_user_id(self):
32+
contact = self.env["res.partner"].create(
33+
{
34+
"name": "Test contact",
35+
"user_id": self.user.id,
36+
}
37+
)
38+
contact._onchange_user_id_sales_team_security()
39+
self.assertEqual(contact.team_id, self.team)
40+
41+
def test_assign_contacts_team(self):
42+
contact = self.env["res.partner"].create(
43+
{"name": "Test contact", "parent_id": self.partner.id, "team_id": False}
44+
)
45+
post_init_hook(self.env)
46+
contact.env.invalidate_all()
47+
self.assertEqual(contact.team_id, self.partner.team_id)
48+
2349
def test_change_user_id_partner(self):
2450
self.partner.write({"user_id": self.user.id})
2551
self.assertIn(self.user_partner, self.partner.message_partner_ids)
@@ -43,6 +69,15 @@ def test_change_user_id_partner_child_1(self):
4369
self.assertNotIn(self.user_partner, self.partner_child_2.message_partner_ids)
4470
self.assertIn(self.user2_partner, self.partner_child_2.message_partner_ids)
4571

72+
def test_partner_fields_view_get(self):
73+
res = self.env["res.partner"].get_view(
74+
view_id=self.ref("base.view_partner_form")
75+
)
76+
eview = etree.fromstring(res["arch"])
77+
xml_fields = eview.xpath("//field[@name='child_ids']")
78+
self.assertTrue(xml_fields)
79+
self.assertTrue("default_team_id" in xml_fields[0].get("context", ""))
80+
4681
def test_partner_permissions(self):
4782
self._check_whole_permission_set()
4883

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<odoo>
3+
<record id="view_partner_form" model="ir.ui.view">
4+
<field name="name">Partner form (with sales info in contacts)</field>
5+
<field name="model">res.partner</field>
6+
<field name="inherit_id" ref="base.view_partner_form" />
7+
<field name="arch" type="xml">
8+
<field name="user_id" position="after">
9+
<field name="team_id" />
10+
</field>
11+
</field>
12+
</record>
13+
</odoo>

0 commit comments

Comments
 (0)