diff --git a/mail_activity_team/models/res_users.py b/mail_activity_team/models/res_users.py index 8da1c066b8..125d962d5c 100644 --- a/mail_activity_team/models/res_users.py +++ b/mail_activity_team/models/res_users.py @@ -1,5 +1,8 @@ # Copyright 2018-22 ForgeFlow S.L. +# Copyright 2026 Dixmit # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from collections import defaultdict + from odoo import api, fields, models, modules @@ -16,58 +19,58 @@ class ResUsers(models.Model): def systray_get_activities(self): if not self.env.context.get("team_activities"): return super().systray_get_activities() - 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, act.user_id as user_id - FROM mail_activity AS act - JOIN ir_model AS m ON act.res_model_id = m.id - WHERE team_id in ( - SELECT mail_activity_team_id - FROM mail_activity_team_users_rel - WHERE res_users_id = %(user_id)s - ) - GROUP BY m.id, states, act.res_model, act.user_id;""" - user = self.env.uid - self.env.cr.execute( - query, + activities = self.env["mail.activity"].search( + [("team_id.member_ids", "=", self.env.uid)] + ) + activities_by_record_by_model_name = defaultdict( + lambda: defaultdict(lambda: self.env["mail.activity"]) + ) + for activity in activities: + record = self.env[activity.res_model].browse(activity.res_id) + activities_by_record_by_model_name[activity.res_model][record] += activity + model_ids = list( { - "today": fields.Date.context_today(self), - "user_id": user, - }, + self.env["ir.model"]._get(name).id + for name in activities_by_record_by_model_name.keys() + } ) - activity_data = self.env.cr.dictfetchall() - model_ids = [a["id"] for a in activity_data] - model_names = { - n[0]: n[1] for n in self.env["ir.model"].sudo().browse(model_ids).name_get() - } 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"], - "type": "activity", - "icon": icon, - "total_count": 0, - "today_count": 0, - "overdue_count": 0, - "planned_count": 0, - } - user_activities[activity["model"]][ - "%s_count" % activity["states"] - ] += activity["count"] - if ( - activity["states"] in ("today", "overdue") - and activity["user_id"] != user - ): - user_activities[activity["model"]]["total_count"] += activity["count"] + for ( + model_name, + activities_by_record, + ) in activities_by_record_by_model_name.items(): + domain = [("id", "in", list({r.id for r in activities_by_record.keys()}))] + allowed_records = self.env[model_name].search(domain) + if not allowed_records: + continue + module = self.env[model_name]._original_module + icon = module and modules.module.get_module_icon(module) + model = self.env["ir.model"]._get(model_name).with_prefetch(model_ids) + user_activities[model_name] = { + "id": model.id, + "name": model.name, + "model": model_name, + "type": "activity", + "icon": icon, + "total_count": 0, + "today_count": 0, + "overdue_count": 0, + "planned_count": 0, + "actions": [ + { + "icon": "fa-clock-o", + "name": "Summary", + } + ], + } + for record, activities in activities_by_record.items(): + if record not in allowed_records: + continue + for activity in activities: + user_activities[model_name]["%s_count" % activity.state] += 1 + if ( + activity.state in ("today", "overdue") + and activity.user_id != self.env.user + ): + user_activities[model_name]["total_count"] += 1 return list(user_activities.values())