diff --git a/mail_activity_done/README.rst b/mail_activity_done/README.rst index e2168816..b78fab61 100644 --- a/mail_activity_done/README.rst +++ b/mail_activity_done/README.rst @@ -79,6 +79,7 @@ Contributors - Manuel Regidor (https://www.sygel.es) - Bernat Puig (`www.forgeflow.com `__) +- Stefan Rijnhart Maintainers ----------- diff --git a/mail_activity_done/__manifest__.py b/mail_activity_done/__manifest__.py index b39fcc29..944cecd8 100644 --- a/mail_activity_done/__manifest__.py +++ b/mail_activity_done/__manifest__.py @@ -2,7 +2,7 @@ # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). { "name": "Mail Activity Done", - "version": "17.0.1.0.0", + "version": "18.0.1.0.0", "author": "ForgeFlow, Odoo Community Association (OCA)", "license": "LGPL-3", "category": "Discuss", diff --git a/mail_activity_done/models/__init__.py b/mail_activity_done/models/__init__.py index a28b2462..1ff38802 100644 --- a/mail_activity_done/models/__init__.py +++ b/mail_activity_done/models/__init__.py @@ -1,2 +1 @@ from . import mail_activity -from . import res_users diff --git a/mail_activity_done/models/mail_activity.py b/mail_activity_done/models/mail_activity.py index c61880c4..75d304e6 100644 --- a/mail_activity_done/models/mail_activity.py +++ b/mail_activity_done/models/mail_activity.py @@ -1,7 +1,6 @@ # Copyright 2018-22 ForgeFlow # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). from odoo import api, fields, models -from odoo.osv import expression delete_sentinel = object() @@ -82,11 +81,3 @@ class MailActivityMixin(models.AbstractModel): activity_ids = fields.One2many( domain=lambda self: [("res_model", "=", self._name), ("active", "=", True)] ) - - def _read_progress_bar(self, domain, group_by, progress_bar): - """ - Exclude completed activities from progress bar result. - Pass an extra domain to super to filter out records with only done activities. - """ - domain = expression.AND([domain, [("activity_ids.done", "=", False)]]) - return super()._read_progress_bar(domain, group_by, progress_bar) diff --git a/mail_activity_done/models/res_users.py b/mail_activity_done/models/res_users.py deleted file mode 100644 index 6524d101..00000000 --- a/mail_activity_done/models/res_users.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2018-22 ForgeFlow -# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). -from odoo import api, fields, models, modules - - -class ResUsers(models.Model): - _inherit = "res.users" - - @api.model - def systray_get_activities(self): - # Here we totally override the method. Not very nice, but - # we should perhaps ask Odoo to add a hook here. - query = """SELECT m.id, count(*), act.res_model as model, - CASE - WHEN %(today)s::date - - act.date_deadline::date = 0 Then 'today' - WHEN %(today)s::date - - act.date_deadline::date > 0 Then 'overdue' - WHEN %(today)s::date - - act.date_deadline::date < 0 Then 'planned' - END AS states - FROM mail_activity AS act - JOIN ir_model AS m ON act.res_model_id = m.id - WHERE user_id = %(user_id)s - AND act.done = False - GROUP BY m.id, states, act.res_model; - """ - self.env.cr.execute( - query, {"today": fields.Date.context_today(self), "user_id": self.env.uid} - ) - activity_data = self.env.cr.dictfetchall() - model_ids = [a["id"] for a in activity_data] - model_names = { - n.id: n.display_name for n in self.env["ir.model"].sudo().browse(model_ids) - } - - user_activities = {} - for activity in activity_data: - if not user_activities.get(activity["model"]): - module = self.env[activity["model"]]._original_module - icon = module and modules.module.get_module_icon(module) - user_activities[activity["model"]] = { - "id": activity["id"], - "name": model_names[activity["id"]], - "model": activity["model"], - "icon": icon, - "total_count": 0, - "today_count": 0, - "overdue_count": 0, - "planned_count": 0, - "type": "activity", - } - user_activities[activity["model"]]["%s_count" % activity["states"]] += ( - activity["count"] - ) - if activity["states"] in ("today", "overdue"): - user_activities[activity["model"]]["total_count"] += activity["count"] - - return list(user_activities.values()) diff --git a/mail_activity_done/readme/CONTRIBUTORS.md b/mail_activity_done/readme/CONTRIBUTORS.md index 08df7ae2..923f96ea 100644 --- a/mail_activity_done/readme/CONTRIBUTORS.md +++ b/mail_activity_done/readme/CONTRIBUTORS.md @@ -5,3 +5,4 @@ - Radovan Skolnik \<\> () - Manuel Regidor \<\> () - Bernat Puig \<\> (www.forgeflow.com) +- Stefan Rijnhart \<\> diff --git a/mail_activity_done/static/description/index.html b/mail_activity_done/static/description/index.html index e591aa81..6f0f6a33 100644 --- a/mail_activity_done/static/description/index.html +++ b/mail_activity_done/static/description/index.html @@ -426,6 +426,7 @@

Contributors

  • Manuel Regidor <manuel.regidor@sygel.es> (https://www.sygel.es)
  • Bernat Puig <bernat.puig@forgeflow.com> (www.forgeflow.com)
  • +
  • Stefan Rijnhart <stefan@opener.amsterdam>
  • diff --git a/mail_activity_done/tests/test_mail_activity_done.py b/mail_activity_done/tests/test_mail_activity_done.py index 610e4183..50f37759 100644 --- a/mail_activity_done/tests/test_mail_activity_done.py +++ b/mail_activity_done/tests/test_mail_activity_done.py @@ -6,27 +6,28 @@ class TestMailActivityDoneMethods(TransactionCase): - def setUp(self): - super().setUp() + @classmethod + def setUpClass(cls): + super().setUpClass() - self.employee = self.env["res.users"].create( + cls.employee = cls.env["res.users"].create( { - "company_id": self.env.ref("base.main_company").id, + "company_id": cls.env.ref("base.main_company").id, "name": "Test User", "login": "testuser", - "groups_id": [(6, 0, [self.env.ref("base.group_user").id])], + "groups_id": [(6, 0, [cls.env.ref("base.group_user").id])], } ) - activity_type = self.env["mail.activity.type"].search( + activity_type = cls.env["mail.activity.type"].search( [("name", "=", "Meeting")], limit=1 ) - self.act1 = self.env["mail.activity"].create( + cls.act1 = cls.env["mail.activity"].create( { "activity_type_id": activity_type.id, - "res_id": self.env.ref("base.res_partner_1").id, + "res_id": cls.env.ref("base.res_partner_1").id, "res_model": "res.partner", - "res_model_id": self.env["ir.model"]._get("res.partner").id, - "user_id": self.employee.id, + "res_model_id": cls.env["ir.model"]._get("res.partner").id, + "user_id": cls.employee.id, "date_deadline": date.today(), } ) @@ -36,23 +37,57 @@ def test_mail_activity_done(self): self.assertTrue(self.act1.exists()) self.assertEqual(self.act1.state, "done") - def test_systray_get_activities(self): - act_count = self.employee.with_user(self.employee).systray_get_activities() + def test_get_activity_groups(self): + act_count = self.employee.with_user(self.employee)._get_activity_groups() self.assertEqual( len(act_count), 1, "Number of activities should be equal to one" ) + self.assertEqual(act_count[0]["total_count"], 1) + self.act1._action_done() + self.act1.flush_recordset() + act_count = self.employee.with_user(self.employee)._get_activity_groups() + self.assertFalse(act_count) def test_read_progress_bar(self): - res_partner = self.env["res.partner"].browse(self.act1.res_model_id) + partner = self.env["res.partner"].browse(self.act1.res_id) params = { - "domain": [], + "domain": [("id", "=", partner.id)], "group_by": "id", - "progress_bar": {"field": "activity_state"}, + "progress_bar": { + "field": "activity_state", + "colors": { + "overdue": "danger", + "today": "warning", + "planned": "success", + }, + }, } - result = res_partner._read_progress_bar(**params) - self.assertEqual(result[0]["__count"], 1) + # The activity is present in the progress bar + self.assertEqual( + partner.read_progress_bar(**params), + {str(partner.id): {"overdue": 0, "today": 1, "planned": 0}}, + ) + # After marking the activity as done, it is removed from the progress bar + self.act1._action_done() + self.act1.flush_recordset() + self.assertEqual( + partner.read_progress_bar(**params), + {str(partner.id): {"overdue": 0, "today": 0, "planned": 0}}, + ) + def test_activity_state_search(self): + today_activities = self.env["res.partner"].search( + [("activity_state", "=", "today")] + ) + self.assertEqual(len(today_activities), 1) + overdue_activities = self.env["res.partner"].search( + [("activity_state", "=", "overdue")] + ) + self.assertFalse(overdue_activities) + + # After the activity is marked as done, the activity state is unmarked self.act1._action_done() - self.assertEqual(self.act1.state, "done") - result = res_partner._read_progress_bar(**params) - self.assertEqual(len(result), 0) + today_activities = self.env["res.partner"].search( + [("activity_state", "=", "today")] + ) + self.assertFalse(today_activities) diff --git a/mail_activity_done/views/mail_activity_views.xml b/mail_activity_done/views/mail_activity_views.xml index c8e8289b..2ca2d7fe 100644 --- a/mail_activity_done/views/mail_activity_views.xml +++ b/mail_activity_done/views/mail_activity_views.xml @@ -34,17 +34,17 @@ domain="[('active', '=', False), ('state', '=', 'done')]" /> - + [('date_deadline', '<', context_today().strftime('%Y-%m-%d'))] - + [('date_deadline', '=', context_today().strftime('%Y-%m-%d'))] - + [('date_deadline', '>', context_today().strftime('%Y-%m-%d'))] @@ -88,7 +88,7 @@ - mail.activity.view.tree + mail.activity.view.list mail.activity @@ -96,7 +96,7 @@ - + state == 'done' date_deadline == current_date and state != 'done' - +