Skip to content

Commit 62045dc

Browse files
committed
[IMP] mail_activity_team: Improve default team_id retrieval
1 parent 20b7191 commit 62045dc

4 files changed

Lines changed: 254 additions & 18 deletions

File tree

mail_activity_team/models/mail_activity.py

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,34 @@
88
class MailActivity(models.Model):
99
_inherit = "mail.activity"
1010

11-
def _get_default_team_id(self, user_id=None):
11+
@api.model
12+
def _get_default_team_id(self, user_id=None, model_id=None):
1213
if not user_id:
1314
user_id = self.env.uid
14-
res_model = self.env.context.get("default_res_model")
15-
model = self.sudo().env["ir.model"].search([("model", "=", res_model)], limit=1)
15+
if not model_id:
16+
res_model = self.env.context.get("default_res_model")
17+
model = (
18+
self.sudo().env["ir.model"].search([("model", "=", res_model)], limit=1)
19+
)
20+
model_id = model.id if model else None
1621
domain = [("member_ids", "in", [user_id])]
17-
if res_model:
22+
if model_id:
1823
domain.extend(
19-
["|", ("res_model_ids", "=", False), ("res_model_ids", "in", model.ids)]
24+
[
25+
"|",
26+
("res_model_ids", "=", False),
27+
("res_model_ids", "in", [model_id]),
28+
]
29+
)
30+
results = self.env["mail.activity.team"].search(domain)
31+
if model_id:
32+
result_with_model = results.filtered(
33+
lambda team: model_id in team.res_model_ids.ids
2034
)
21-
return self.env["mail.activity.team"].search(domain, limit=1)
35+
if result_with_model:
36+
return result_with_model[0]
37+
38+
return results[0] if results else self.env["mail.activity.team"]
2239

2340
user_id = fields.Many2one(string="User", required=False, default=False)
2441
team_user_id = fields.Many2one(
@@ -27,7 +44,6 @@ def _get_default_team_id(self, user_id=None):
2744

2845
team_id = fields.Many2one(
2946
comodel_name="mail.activity.team",
30-
default=lambda s: s._get_default_team_id(),
3147
index=True,
3248
)
3349

@@ -47,6 +63,13 @@ def create(self, vals_list):
4763
# so if we don't have a user_team_id we don't want user_id too
4864
if "user_id" in vals and not vals.get("team_user_id", False):
4965
del vals["user_id"]
66+
elif vals.get("user_id") and not vals.get("team_user_id"):
67+
# legacy behavior, if we have user_id but no team_id, set the team_id
68+
team_id = self._get_default_team_id(
69+
vals["user_id"], vals.get("res_model_id")
70+
)
71+
if team_id:
72+
vals["team_id"] = team_id.id
5073
return super().create(vals_list)
5174

5275
@api.onchange("user_id")
@@ -55,9 +78,9 @@ def _onchange_user_id(self):
5578
self.team_id and self.user_id in self.team_id.member_ids
5679
):
5780
return
58-
self.team_id = self.with_context(
59-
default_res_model=self.sudo().res_model_id.model
60-
)._get_default_team_id(user_id=self.user_id.id)
81+
self.team_id = self._get_default_team_id(
82+
self.user_id.id, self.sudo().res_model_id.id
83+
)
6184

6285
@api.onchange("team_id")
6386
def _onchange_team_id(self):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from . import test_mail_activity_team
2+
from . import test_mail_activity
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
from odoo import Command
2+
from odoo.tests import users
3+
4+
from odoo.addons.base.tests.common import BaseCommon
5+
6+
7+
class TestMailActivity(BaseCommon):
8+
@classmethod
9+
def setUpClass(cls):
10+
super().setUpClass()
11+
12+
# Create Users
13+
cls.user = cls.env["res.users"].create(
14+
{
15+
"company_id": cls.env.ref("base.main_company").id,
16+
"name": "Employee",
17+
"login": "csu",
18+
"email": "crmuser@yourcompany.com",
19+
"groups_id": [
20+
Command.set(
21+
[
22+
cls.env.ref("base.group_user").id,
23+
cls.env.ref("base.group_partner_manager").id,
24+
]
25+
)
26+
],
27+
}
28+
)
29+
cls.user2 = cls.env["res.users"].create(
30+
{
31+
"company_id": cls.env.ref("base.main_company").id,
32+
"name": "Employee 2",
33+
"login": "csu2",
34+
"email": "crmuser2@yourcompany.com",
35+
"groups_id": [Command.set([cls.env.ref("base.group_user").id])],
36+
}
37+
)
38+
cls.partner_ir_model = cls.env["ir.model"]._get("res.partner")
39+
cls.partner_client = cls.env.ref("base.res_partner_1")
40+
# Create Activity Types
41+
cls.activity1 = cls.env["mail.activity.type"].create(
42+
{
43+
"name": "Initial Contact",
44+
"delay_count": 5,
45+
"delay_unit": "days",
46+
"summary": "ACT 1 : Presentation, barbecue, ... ",
47+
"res_model": "res.partner",
48+
}
49+
)
50+
51+
@users("csu")
52+
def test_get_default_team_id_one_team_with_model(self):
53+
"""Test _get_default_team_id correctly finds team with specified model_id"""
54+
# Create a team specific to res.partner model
55+
team_partner = (
56+
self.env["mail.activity.team"]
57+
.sudo()
58+
.create(
59+
{
60+
"name": "Partner Team",
61+
"res_model_ids": [Command.set([self.partner_ir_model.id])],
62+
"member_ids": [Command.set([self.user.id])],
63+
}
64+
)
65+
)
66+
# Test with model_id parameter - should find the team
67+
result_team_from_user = (
68+
self.env["mail.activity"]
69+
.with_context(default_res_model="res.partner")
70+
._get_default_team_id(user_id=self.user.id)
71+
)
72+
self.assertEqual(
73+
result_team_from_user,
74+
team_partner,
75+
"Should return the team matching the model_id",
76+
)
77+
result_team = self.env["mail.activity"]._get_default_team_id(
78+
user_id=self.user.id, model_id=self.partner_ir_model.id
79+
)
80+
self.assertEqual(
81+
result_team,
82+
team_partner,
83+
"Should return the team matching the model_id",
84+
)
85+
result_team_from_model = self.env["mail.activity"]._get_default_team_id(
86+
model_id=self.partner_ir_model.id
87+
)
88+
self.assertEqual(
89+
result_team_from_model,
90+
team_partner,
91+
"Should return the team matching the model_id",
92+
)
93+
94+
@users("csu")
95+
def test_get_default_team_id_one_team_without_model_restriction(self):
96+
"""Test _get_default_team_id finds team without model restrictions"""
97+
# Create a team without model restrictions
98+
team_generic = (
99+
self.env["mail.activity.team"]
100+
.sudo()
101+
.create(
102+
{
103+
"name": "Generic Team",
104+
"res_model_ids": [Command.clear()], # No model restrictions
105+
"member_ids": [Command.set([self.user.id])],
106+
}
107+
)
108+
)
109+
# Test with a different model - should find the generic team
110+
user_ir_model = self.env["ir.model"]._get("res.users")
111+
result_team = self.env["mail.activity"]._get_default_team_id(
112+
user_id=self.user.id, model_id=user_ir_model.id
113+
)
114+
self.assertEqual(
115+
result_team,
116+
team_generic,
117+
"Should return team without model restrictions",
118+
)
119+
result_team_from_user = self.env["mail.activity"]._get_default_team_id(
120+
user_id=self.user.id
121+
)
122+
self.assertEqual(
123+
result_team_from_user,
124+
team_generic,
125+
"Should return team without model restrictions",
126+
)
127+
result_team_from_model = (
128+
self.env["mail.activity"]
129+
.with_context(default_res_model="res.partner")
130+
._get_default_team_id(model_id=user_ir_model.id)
131+
)
132+
self.assertEqual(
133+
result_team_from_model,
134+
team_generic,
135+
"Should return team without model restrictions",
136+
)
137+
138+
def test_get_default_team_id_no_match(self):
139+
"""Test _get_default_team_id returns empty when no team matches"""
140+
# Create a team for a specific model
141+
user_ir_model = self.env["ir.model"]._get("res.users")
142+
self.env["mail.activity.team"].sudo().create(
143+
{
144+
"name": "Users Team",
145+
"res_model_ids": [Command.set([user_ir_model.id])],
146+
"member_ids": [Command.set([self.user.id])],
147+
}
148+
)
149+
# Search for a different user who is not a member
150+
result_team = self.env["mail.activity"]._get_default_team_id(
151+
user_id=self.user2.id, model_id=user_ir_model.id
152+
)
153+
self.assertFalse(
154+
result_team,
155+
"Should return empty recordset when user is not a team member",
156+
)
157+
158+
def test_get_default_team_id_priority_model_match(self):
159+
"""Test _get_default_team_id returns first matching team"""
160+
# Create two teams for the same model and user
161+
self.env["mail.activity.team"].create(
162+
{
163+
"name": "Team A",
164+
"res_model_ids": [Command.clear()], # No model restrictions
165+
"member_ids": [Command.set([self.user.id])],
166+
}
167+
)
168+
team_b = self.env["mail.activity.team"].create(
169+
{
170+
"name": "Team B",
171+
"res_model_ids": [Command.set([self.partner_ir_model.id])],
172+
"member_ids": [Command.set([self.user.id])],
173+
}
174+
)
175+
# Test - should return the first match (based on search order)
176+
result_team = self.env["mail.activity"]._get_default_team_id(
177+
user_id=self.user.id, model_id=self.partner_ir_model.id
178+
)
179+
self.assertEqual(
180+
result_team,
181+
team_b,
182+
"Should return the team with model match",
183+
)
184+
# Verify it's a single record
185+
self.assertEqual(len(result_team), 1, "Should return only one team")
186+
187+
def test_create_activity_with_team_assigns_correct_team(self):
188+
"""Test creating activity with user_id but no team_id assigns default team"""
189+
# Clean up existing activities
190+
self.env["mail.activity"].search([]).unlink()
191+
# Create a team for the partner model
192+
team_auto = self.env["mail.activity.team"].create(
193+
{
194+
"name": "Auto Assign Team",
195+
"res_model_ids": [Command.set([self.partner_ir_model.id])],
196+
"member_ids": [Command.set([self.user.id])],
197+
}
198+
)
199+
# Create an activity with user_id but no team_id
200+
activity = self.env["mail.activity"].create(
201+
{
202+
"activity_type_id": self.activity1.id,
203+
"note": "Test auto team assignment",
204+
"res_id": self.partner_client.id,
205+
"res_model_id": self.partner_ir_model.id,
206+
"user_id": self.user.id,
207+
}
208+
)
209+
# Verify team was automatically assigned
210+
self.assertEqual(
211+
activity.team_id,
212+
team_auto,
213+
"Team should be automatically assigned based on user and model",
214+
)

mail_activity_team/wizard/mail_activity_schedule.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ def _compute_activity_team_id(self):
2525
if scheduler.activity_type_id.default_team_id:
2626
scheduler.activity_team_id = scheduler.activity_type_id.default_team_id
2727
elif not scheduler.activity_team_id:
28-
scheduler.activity_team_id = (
29-
self.env["mail.activity"]
30-
.with_context(default_res_model=scheduler.sudo().res_model_id.model)
31-
._get_default_team_id(user_id=scheduler.activity_team_user_id.id)
28+
scheduler.activity_team_id = self.env[
29+
"mail.activity"
30+
]._get_default_team_id(
31+
scheduler.activity_team_user_id.id, scheduler.sudo().res_model_id.id
3232
)
3333

3434
@api.onchange("activity_team_id")
@@ -53,10 +53,8 @@ def _onchange_activity_team_user_id(self):
5353
and self.activity_team_user_id in self.activity_team_id.member_ids
5454
):
5555
return
56-
self.activity_team_id = (
57-
self.env["mail.activity"]
58-
.with_context(default_res_model=self.sudo().res_model_id.model)
59-
._get_default_team_id(user_id=self.activity_team_user_id.id)
56+
self.activity_team_id = self.env["mail.activity"]._get_default_team_id(
57+
self.activity_team_user_id.id, self.sudo().res_model_id.id
6058
)
6159

6260
def _action_schedule_activities(self):

0 commit comments

Comments
 (0)