Merge PR #912 into 13.0

Signed-off-by etobella
pull/917/head
OCA-git-bot 2022-05-27 11:58:57 +00:00
commit 6b5091caed
8 changed files with 238 additions and 45 deletions

View File

@ -15,6 +15,7 @@
"views/assets_backend.xml",
"security/ir.model.access.csv",
"security/mail_activity_team_security.xml",
"views/mail_activity_type.xml",
"views/mail_activity_team_views.xml",
"views/mail_activity_views.xml",
"views/res_users_views.xml",

View File

@ -2,3 +2,4 @@ from . import mail_activity_team
from . import mail_activity
from . import mail_activity_mixin
from . import res_users
from . import mail_activity_type

View File

@ -38,7 +38,7 @@ class MailActivity(models.Model):
if self.team_id and self.user_id in self.team_id.member_ids:
return res
self.team_id = self.with_context(
default_res_model=self.res_model_id.id
default_res_model=self.res_model_id.model
)._get_default_team_id(user_id=self.user_id.id)
return res
@ -74,3 +74,12 @@ class MailActivity(models.Model):
and a.user_id not in a.team_id.with_context(active_test=True).member_ids
):
raise ValidationError(_("The assigned user is not member of the team."))
@api.onchange("activity_type_id")
def _onchange_activity_type_id(self):
super(MailActivity, self)._onchange_activity_type_id()
if self.activity_type_id.default_team_id:
self.team_id = self.activity_type_id.default_team_id
members = self.activity_type_id.default_team_id.member_ids
if self.user_id not in members and members:
self.user_id = members[:1]

View File

@ -30,15 +30,35 @@ class MailActivityMixin(models.AbstractModel):
user-team missmatch. We can hook onto `act_values` dict as it's passed
to the create activity method.
"""
user_id = act_values.get("user_id")
if user_id:
team = (
self.env["mail.activity"]
.with_context(default_res_model=self._name,)
._get_default_team_id(user_id=user_id)
)
# Even if it comes empty, we don't want to mismatch the user's team
act_values.update({"team_id": team.id})
if "team_id" not in act_values:
if act_type_xmlid:
activity_type = self.sudo().env.ref(act_type_xmlid)
else:
activity_type = (
self.env["mail.activity.type"]
.sudo()
.browse(act_values["activity_type_id"])
)
if activity_type.default_team_id:
act_values.update({"team_id": activity_type.default_team_id.id})
if (
not act_values.get("user_id")
and activity_type.default_team_id.member_ids
):
act_values.update(
{"user_id": activity_type.default_team_id.member_ids[:1].id}
)
else:
user_id = act_values.get("user_id")
if user_id:
team = (
self.env["mail.activity"]
.with_context(default_res_model=self._name,)
._get_default_team_id(user_id=user_id)
)
# Even if it comes empty, we don't want to mismatch the user's team
if team:
act_values.update({"team_id": team.id})
return super().activity_schedule(
act_type_xmlid=act_type_xmlid,
date_deadline=date_deadline,

View File

@ -0,0 +1,11 @@
# Copyright 2022 CreuBlanca
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class MailActivityType(models.Model):
_inherit = "mail.activity.type"
default_team_id = fields.Many2one(comodel_name="mail.activity.team")

View File

@ -63,12 +63,9 @@ class ResUsers(models.Model):
user_activities[activity["model"]][
"%s_count" % activity["states"]
] += activity["count"]
if activity["states"] in ("today", "overdue"):
user_activities[activity["model"]]["total_count"] += activity["count"]
if activity["user_id"] == user and activity["states"] in (
"today",
"overdue",
if (
activity["states"] in ("today", "overdue")
and activity["user_id"] != user
):
user_activities[activity["model"]]["total_count"] -= activity["count"]
user_activities[activity["model"]]["total_count"] += activity["count"]
return list(user_activities.values())

View File

@ -1,13 +1,14 @@
# Copyright 2018 ForgeFlow, S.L.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.exceptions import ValidationError
from odoo.tests.common import TransactionCase
from odoo.tests.common import Form, SavepointCase
class TestMailActivityTeam(TransactionCase):
def setUp(self):
super(TestMailActivityTeam, self).setUp()
class TestMailActivityTeam(SavepointCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
self = cls
self.env["mail.activity.team"].search([]).unlink()
self.employee = self.env["res.users"].create(
@ -101,6 +102,18 @@ class TestMailActivityTeam(TransactionCase):
)
)
self.team3 = (
self.env["mail.activity.team"]
.sudo()
.create(
{
"name": "Team 3",
"res_model_ids": [(6, 0, [self.partner_ir_model.id])],
"member_ids": [(6, 0, [self.employee.id, self.employee2.id])],
}
)
)
self.act2 = (
self.env["mail.activity"]
.with_user(self.employee)
@ -125,6 +138,18 @@ class TestMailActivityTeam(TransactionCase):
}
)
def test_activity_members(self):
self.team1.member_ids |= self.employee2
self.partner_client.refresh()
self.assertIn(self.employee2, self.partner_client.activity_team_user_ids)
self.assertIn(self.employee, self.partner_client.activity_team_user_ids)
self.assertEqual(
self.partner_client,
self.env["res.partner"].search(
[("activity_team_user_ids", "=", self.employee.id)]
),
)
def test_team_and_user_onchange(self):
with self.assertRaises(ValidationError):
self.team1.member_ids = [(3, self.employee.id)]
@ -153,48 +178,155 @@ class TestMailActivityTeam(TransactionCase):
self.team2._onchange_user_id()
self.assertTrue(self.employee3 in self.team2.member_ids)
def test_activity_onchanges(self):
def test_activity_onchanges_keep_user(self):
self.assertEqual(
self.act2.team_id, self.team1, "Error: Activity 2 should have Team 1."
)
self.act2.team_id = False
self.act2._onchange_team_id()
self.assertEqual(self.act2.user_id, self.employee)
self.act2.team_id = self.team2
self.act2._onchange_team_id()
self.assertEqual(self.act2.user_id, self.employee)
self.act2.user_id = self.employee2
self.act2._onchange_user_id()
self.assertEqual(self.act2.team_id, self.team2)
with Form(self.act2) as form:
form.team_id = self.env["mail.activity.team"]
self.assertEqual(form.user_id, self.employee)
def test_activity_onchanges_user_no_member_team(self):
self.assertEqual(
self.act2.team_id, self.team1, "Error: Activity 2 should have Team 1."
)
with Form(self.act2) as form:
form.user_id = self.employee2
self.assertEqual(form.team_id, self.team2)
def test_activity_onchanges_user_no_team(self):
self.assertEqual(
self.act2.team_id, self.team1, "Error: Activity 2 should have Team 1."
)
with Form(self.act2) as form:
form.team_id = self.env["mail.activity.team"]
form.user_id = self.employee2
self.assertEqual(form.team_id, self.team2)
def test_activity_onchanges_team_no_member(self):
self.assertEqual(
self.act2.team_id, self.team1, "Error: Activity 2 should have Team 1."
)
self.team2.user_id = False
self.team2.member_ids = False
with Form(self.act2) as form:
form.team_id = self.team2
self.assertFalse(form.user_id)
def test_activity_onchanges_team_different_member(self):
self.assertEqual(
self.act2.team_id, self.team1, "Error: Activity 2 should have Team 1."
)
self.team2.user_id = self.employee2
self.team2.member_ids = self.employee2
with Form(self.act2) as form:
form.team_id = self.team2
self.assertEqual(form.user_id, self.employee2)
def test_activity_onchanges_team_different_member_no_leader(self):
self.assertEqual(
self.act2.team_id, self.team1, "Error: Activity 2 should have Team 1."
)
self.team2.user_id = False
self.team2.member_ids = self.employee2
with Form(self.act2) as form:
form.team_id = self.team2
self.assertEqual(form.user_id, self.employee2)
def test_activity_onchanges_activity_type_set_team(self):
self.assertEqual(
self.act2.team_id, self.team1, "Error: Activity 2 should have Team 1."
)
self.activity1.default_team_id = self.team2
self.assertEqual(self.act2.activity_type_id, self.activity2)
with Form(self.act2) as form:
form.activity_type_id = self.activity1
self.assertEqual(form.team_id, self.team2)
def test_activity_onchanges_activity_type_no_team(self):
self.assertEqual(
self.act2.team_id, self.team1, "Error: Activity 2 should have Team 1."
)
self.assertEqual(self.act2.activity_type_id, self.activity2)
with Form(self.act2) as form:
form.activity_type_id = self.activity1
self.assertEqual(form.team_id, self.team1)
def test_activity_constrain(self):
with self.assertRaises(ValidationError):
self.act2.write({"user_id": self.employee2.id, "team_id": self.team1.id})
self.team1.user_id = False
self.act2.user_id = False
self.act2._onchange_user_id()
self.team2.member_ids = [(4, self.employee3.id)]
self.act2.team_id = self.team1
self.act2.team_id = False
self.act2.user_id = self.employee3
self.act2._onchange_user_id()
self.act2.team_id = self.team2
self.team2.member_ids = [(3, self.act2.user_id.id)]
self.act2._onchange_team_id()
def test_schedule_activity(self):
"""Correctly assign teams to auto scheduled activities. Those won't
trigger onchanges and could raise constraints and team missmatches"""
partner_record = self.employee.partner_id.sudo(self.employee.id)
partner_record = self.employee.partner_id.with_user(self.employee.id)
activity = partner_record.activity_schedule(
user_id=self.employee2.id,
activity_type_id=self.env.ref("mail.mail_activity_data_call").id,
)
self.assertEqual(activity.team_id, self.team2)
def test_schedule_activity_default_team(self):
"""Correctly assign teams to auto scheduled activities. Those won't
trigger onchanges and could raise constraints and team missmatches"""
partner_record = self.employee.partner_id.with_user(self.employee.id)
self.env.ref("mail.mail_activity_data_call").default_team_id = self.team2
activity = partner_record.activity_schedule(
act_type_xmlid="mail.mail_activity_data_call", user_id=self.employee2.id,
)
self.assertEqual(activity.team_id, self.team2)
self.assertEqual(activity.user_id, self.employee2)
def test_schedule_activity_default_team_no_user(self):
"""Correctly assign teams to auto scheduled activities. Those won't
trigger onchanges and could raise constraints and team missmatches"""
partner_record = self.employee.partner_id.with_user(self.employee.id)
self.activity2.default_team_id = self.team2
self.team2.member_ids = self.employee2
activity = partner_record.activity_schedule(activity_type_id=self.activity2.id,)
self.assertEqual(activity.team_id, self.team2)
self.assertEqual(activity.user_id, self.employee2)
def test_activity_count(self):
res = (
self.env["res.users"]
.sudo(self.employee.id)
.with_user(self.employee.id)
.with_context({"team_activities": True})
.systray_get_activities()
)
self.assertEqual(res[0]["total_count"], 0)
self.assertEqual(res[0]["today_count"], 1)
partner_record = self.employee.partner_id.with_user(self.employee.id)
self.activity2.default_team_id = self.team2
activity = partner_record.activity_schedule(
activity_type_id=self.activity2.id, user_id=self.employee2.id
)
activity.flush()
res = (
self.env["res.users"]
.with_user(self.employee.id)
.with_context({"team_activities": True})
.systray_get_activities()
)
self.assertEqual(res[0]["total_count"], 1)
self.assertEqual(res[0]["today_count"], 2)
res = self.env["res.users"].with_user(self.employee.id).systray_get_activities()
self.assertEqual(res[0]["total_count"], 2)
def test_activity_schedule_next(self):
self.activity1.write(
{
"default_team_id": self.team1.id,
"default_next_type_id": self.activity2.id,
"force_next": True,
}
)
self.activity2.default_team_id = self.team2
self.team2.member_ids = self.employee2
partner_record = self.employee.partner_id.with_user(self.employee.id)
activity = partner_record.activity_schedule(activity_type_id=self.activity1.id)
activity.flush()
_messages, next_activities = activity._action_done()
self.assertTrue(next_activities)
self.assertEqual(next_activities.team_id, self.team2)
self.assertEqual(next_activities.user_id, self.employee2)

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2022 CreuBlanca
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record model="ir.ui.view" id="mail_activity_type_form_view">
<field name="name">mail.activity.type.form (in mail_activity_team)</field>
<field name="model">mail.activity.type</field>
<field name="inherit_id" ref="mail.mail_activity_type_view_form" />
<field name="arch" type="xml">
<field name="default_user_id" position="after">
<field
name="default_team_id"
options="{'no_create': True, 'no_edit': True}"
/>
</field>
</field>
</record>
</odoo>