Skip to content

Commit 5ac09fc

Browse files
committed
Merge PR #1152 into 16.0
Signed-off-by pedrobaeza
2 parents 550a198 + 324dfaa commit 5ac09fc

File tree

3 files changed

+106
-1
lines changed

3 files changed

+106
-1
lines changed

announcement/models/announcement.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,18 @@ def create(self, vals_list):
228228
return records
229229

230230
def write(self, vals):
231-
"""Adjust attachments for being accesible to receivers of the announcement."""
231+
"""Adjust attachments for being accesible to receivers of the announcement.
232+
Adjust unread_announcement_ids when specific users are modified
233+
(if users are removed).
234+
"""
235+
data = {}
236+
for item in self:
237+
data[self] = item.allowed_user_ids
232238
res = super().write(vals)
239+
if vals.get("specific_user_ids"):
240+
for item in self:
241+
unlink_users = data[self] - item.allowed_user_ids
242+
unlink_users.unread_announcement_ids -= item
233243
self._process_attachments(vals)
234244
return res
235245

announcement/tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_announcement
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# Copyright 2025 Tecnativa - Víctor Martínez
2+
# Copyright 2025 Tecnativa - David Bañón
3+
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
4+
from datetime import datetime, timedelta
5+
6+
from odoo import Command
7+
from odoo.tests import new_test_user, tagged, users
8+
9+
from odoo.addons.base.tests.common import BaseCommon
10+
11+
12+
@tagged("-at_install", "post_install")
13+
class TestAnnouncement(BaseCommon):
14+
@classmethod
15+
def setUpClass(cls):
16+
super().setUpClass()
17+
cls.general_announcement = cls.env["announcement"].create(
18+
{
19+
"name": "Test announcement",
20+
"content": "<p>Test content for test announcement</p>",
21+
"is_general_announcement": True,
22+
"notification_date": datetime.now() + timedelta(days=-1),
23+
"notification_expiry_date": datetime.now() + timedelta(days=+1),
24+
"active": True,
25+
}
26+
)
27+
cls.expired_announcement = cls.env["announcement"].create(
28+
{
29+
"name": "Test expired announcement",
30+
"content": "<p>Its gone</p>",
31+
"is_general_announcement": True,
32+
"notification_date": datetime.now() + timedelta(days=-2),
33+
"notification_expiry_date": datetime.now() + timedelta(days=-1),
34+
"active": True,
35+
}
36+
)
37+
cls.user = new_test_user(cls.env, login="test-user")
38+
cls.user_system = new_test_user(
39+
cls.env, login="test-user-system", groups="base.group_system"
40+
)
41+
cls.admin_announcement = cls.env["announcement"].create(
42+
{
43+
"name": "Test admin only announcement",
44+
"content": "<p>Test content for admins only</p>",
45+
"announcement_type": "user_group",
46+
"user_group_ids": cls.env.ref("base.group_system"),
47+
"notification_date": datetime.now() + timedelta(days=-1),
48+
"notification_expiry_date": datetime.now() + timedelta(days=+1),
49+
"active": True,
50+
}
51+
)
52+
cls.custom_announcement = cls.env["announcement"].create(
53+
{
54+
"name": "Test custom only announcement",
55+
"content": "<p>Test content for custom users</p>",
56+
"announcement_type": "specific_users",
57+
"specific_user_ids": [
58+
Command.link(cls.user.id),
59+
Command.link(cls.user_system.id),
60+
],
61+
"notification_date": datetime.now() + timedelta(days=-1),
62+
"notification_expiry_date": datetime.now() + timedelta(days=+1),
63+
"active": True,
64+
}
65+
)
66+
67+
@users("test-user-system")
68+
def test_announcements_user_system(self):
69+
res = self.env.user.get_announcements()
70+
announcement_ids = [announcement["id"] for announcement in res["data"]]
71+
self.assertIn(self.general_announcement.id, announcement_ids)
72+
self.assertIn(self.admin_announcement.id, announcement_ids)
73+
self.assertIn(self.custom_announcement.id, announcement_ids)
74+
self.assertNotIn(self.expired_announcement.id, announcement_ids)
75+
76+
@users("test-user")
77+
def test_announcements_user(self):
78+
res = self.env.user.get_announcements()
79+
announcement_ids = [announcement["id"] for announcement in res["data"]]
80+
self.assertIn(self.general_announcement.id, announcement_ids)
81+
self.assertIn(self.custom_announcement.id, announcement_ids)
82+
self.assertNotIn(self.admin_announcement.id, announcement_ids)
83+
self.assertNotIn(self.expired_announcement.id, announcement_ids)
84+
85+
def test_custom_anouncement_write(self):
86+
self.assertIn(self.custom_announcement, self.user.unread_announcement_ids)
87+
self.custom_announcement.write(
88+
{"specific_user_ids": [Command.unlink(self.user.id)]}
89+
)
90+
self.assertNotIn(self.custom_announcement, self.user.unread_announcement_ids)
91+
self.custom_announcement.write(
92+
{"specific_user_ids": [Command.link(self.user.id)]}
93+
)
94+
self.assertIn(self.custom_announcement, self.user.unread_announcement_ids)

0 commit comments

Comments
 (0)