Skip to content

Commit f1fffe2

Browse files
committed
[FIX]mail_activity_done: Remove systray_get_activities override.
In odoo 16 the systray_get_activities function uses the ORM, there is no need to override it. Also fixes the activity count in kanban views.
1 parent 8b76bf4 commit f1fffe2

File tree

5 files changed

+127
-89
lines changed

5 files changed

+127
-89
lines changed
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
from . import mail_activity
2-
from . import res_users

mail_activity_done/models/mail_activity.py

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# Copyright 2018-22 ForgeFlow <http://www.forgeflow.com>
22
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
33
from odoo import api, fields, models
4-
from odoo.osv import expression
54

65
delete_sentinel = object()
76

@@ -88,7 +87,44 @@ class MailActivityMixin(models.AbstractModel):
8887
def _read_progress_bar(self, domain, group_by, progress_bar):
8988
"""
9089
Exclude completed activities from progress bar result.
91-
Pass an extra domain to super to filter out records with only done activities.
9290
"""
93-
domain = expression.AND([domain, [("activity_ids.done", "=", False)]])
94-
return super()._read_progress_bar(domain, group_by, progress_bar)
91+
execute_org = self._cr.execute
92+
93+
def execute(query, params=None, log_exceptions=True):
94+
original_where = "WHERE res_model = '{}'".format(self._name)
95+
replace_where = (
96+
"WHERE res_model = '{}' AND mail_activity.done = FALSE".format(
97+
self._name
98+
)
99+
)
100+
return execute_org(
101+
query.replace(original_where, replace_where),
102+
params=params,
103+
log_exceptions=log_exceptions,
104+
)
105+
106+
self._cr.execute = execute
107+
try:
108+
return super()._read_progress_bar(domain, group_by, progress_bar)
109+
finally:
110+
self._cr.execute = execute_org
111+
112+
def _search_activity_state(self, operator, value):
113+
execute_org = self._cr.execute
114+
115+
def execute(query, params=None, log_exceptions=True):
116+
return execute_org(
117+
query.replace(
118+
"WHERE mail_activity.res_model = %(res_model_table)s",
119+
"WHERE mail_activity.res_model = %(res_model_table)s AND "
120+
"mail_activity.done = FALSE",
121+
),
122+
params=params,
123+
log_exceptions=log_exceptions,
124+
)
125+
126+
self._cr.execute = execute
127+
try:
128+
return super()._search_activity_state(operator, value)
129+
finally:
130+
self._cr.execute = execute_org

mail_activity_done/models/res_users.py

Lines changed: 0 additions & 59 deletions
This file was deleted.

mail_activity_done/static/description/index.html

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88

99
/*
1010
:Author: David Goodger (goodger@python.org)
11-
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
11+
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
1212
:Copyright: This stylesheet has been placed in the public domain.
1313
1414
Default cascading style sheet for the HTML output of Docutils.
15+
Despite the name, some widely supported CSS2 features are used.
1516
1617
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
1718
customize this style sheet.
@@ -274,7 +275,7 @@
274275
margin-left: 2em ;
275276
margin-right: 2em }
276277

277-
pre.code .ln { color: grey; } /* line numbers */
278+
pre.code .ln { color: gray; } /* line numbers */
278279
pre.code, code { background-color: #eeeeee }
279280
pre.code .comment, code .comment { color: #5C6576 }
280281
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -300,7 +301,7 @@
300301
span.pre {
301302
white-space: pre }
302303

303-
span.problematic {
304+
span.problematic, pre.problematic {
304305
color: red }
305306

306307
span.section-subtitle {
@@ -426,7 +427,9 @@ <h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
426427
<div class="section" id="maintainers">
427428
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
428429
<p>This module is maintained by the OCA.</p>
429-
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
430+
<a class="reference external image-reference" href="https://odoo-community.org">
431+
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
432+
</a>
430433
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
431434
mission is to support the collaborative development of Odoo features and
432435
promote its widespread use.</p>

mail_activity_done/tests/test_mail_activity_done.py

Lines changed: 80 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,66 @@
88
class TestMailActivityDoneMethods(TransactionCase):
99
def setUp(self):
1010
super(TestMailActivityDoneMethods, self).setUp()
11-
1211
self.employee = self.env["res.users"].create(
1312
{
1413
"company_id": self.env.ref("base.main_company").id,
1514
"name": "Test User",
16-
"login": "testuser",
17-
"groups_id": [(6, 0, [self.env.ref("base.group_user").id])],
15+
"login": "testuser@testuser.local",
16+
"email": "testuser@testuser.local",
17+
"tz": "Europe/Brussels",
18+
"groups_id": [
19+
(
20+
6,
21+
0,
22+
[
23+
self.env.ref("base.group_user").id,
24+
self.env.ref("base.group_partner_manager").id,
25+
],
26+
)
27+
],
1828
}
1929
)
20-
activity_type = self.env["mail.activity.type"].search(
21-
[("name", "=", "Meeting")], limit=1
30+
self.partner = (
31+
self.env["res.partner"]
32+
.with_user(self.employee)
33+
.create({"name": "test partner"})
2234
)
23-
self.act1 = self.env["mail.activity"].create(
24-
{
25-
"activity_type_id": activity_type.id,
26-
"res_id": self.env.ref("base.res_partner_1").id,
27-
"res_model": "res.partner",
28-
"res_model_id": self.env["ir.model"]._get("res.partner").id,
29-
"user_id": self.employee.id,
30-
"date_deadline": date.today(),
31-
}
35+
activity_type = self.env["mail.activity.type"].create(
36+
{"name": "test activity type"}
37+
)
38+
self.act1 = (
39+
self.env["mail.activity"]
40+
.with_user(self.employee)
41+
.create(
42+
{
43+
"activity_type_id": activity_type.id,
44+
"res_id": self.partner.id,
45+
"res_model": "res.partner",
46+
"res_model_id": self.env["ir.model"]._get("res.partner").id,
47+
"user_id": self.employee.id,
48+
"date_deadline": date.today(),
49+
}
50+
)
3251
)
52+
self.act2 = (
53+
self.env["mail.activity"]
54+
.with_user(self.employee)
55+
.create(
56+
{
57+
"activity_type_id": activity_type.id,
58+
"res_id": self.partner.id,
59+
"res_model": "res.partner",
60+
"res_model_id": self.env["ir.model"]._get("res.partner").id,
61+
"user_id": self.employee.id,
62+
"date_deadline": date.today(),
63+
}
64+
)
65+
)
66+
self.activities = self.act1 + self.act2
67+
68+
def _set_activities_done(self):
69+
self.activities._action_done()
70+
self.activities.flush_recordset()
3371

3472
def test_mail_activity_done(self):
3573
self.act1._action_done()
@@ -39,20 +77,41 @@ def test_mail_activity_done(self):
3977
def test_systray_get_activities(self):
4078
act_count = self.employee.with_user(self.employee).systray_get_activities()
4179
self.assertEqual(
42-
len(act_count), 1, "Number of activities should be equal to one"
80+
act_count[0]["total_count"],
81+
2,
82+
"Number of activities should be equal to two",
83+
)
84+
self.act1._action_done()
85+
act_count = self.employee.with_user(self.employee).systray_get_activities()
86+
self.assertEqual(
87+
act_count[0]["total_count"],
88+
1,
89+
"Number of activities should be equal to one",
4390
)
4491

4592
def test_read_progress_bar(self):
46-
res_partner = self.env["res.partner"].browse(self.act1.res_model_id)
4793
params = {
4894
"domain": [],
4995
"group_by": "id",
5096
"progress_bar": {"field": "activity_state"},
5197
}
52-
result = res_partner._read_progress_bar(**params)
98+
result = self.partner._read_progress_bar(**params)
5399
self.assertEqual(result[0]["__count"], 1)
54-
55-
self.act1._action_done()
56-
self.assertEqual(self.act1.state, "done")
57-
result = res_partner._read_progress_bar(**params)
100+
self._set_activities_done()
101+
result = self.partner._read_progress_bar(**params)
58102
self.assertEqual(len(result), 0)
103+
104+
def test_activity_state_search(self):
105+
today_activities = (
106+
self.env["res.partner"]
107+
.with_user(self.employee)
108+
.search([("activity_state", "=", "today")])
109+
)
110+
self.assertEqual(len(today_activities), 1)
111+
self._set_activities_done()
112+
today_activities = (
113+
self.env["res.partner"]
114+
.with_user(self.employee)
115+
.search([("activity_state", "=", "today")])
116+
)
117+
self.assertEqual(len(today_activities), 0)

0 commit comments

Comments
 (0)