From 5ac6593fc8e123da8d76ca73d24efa8e76fb0f56 Mon Sep 17 00:00:00 2001 From: Majda EL MARIOULI Date: Wed, 6 Mar 2024 14:41:37 -0500 Subject: [PATCH] TA#63122 [FIX] migration mail_activity_not_deleted (#138) --- mail_activity_not_deleted/__manifest__.py | 2 +- .../models/mail_activity.py | 13 --- mail_activity_not_deleted/models/user.py | 105 ++++++++++-------- 3 files changed, 62 insertions(+), 58 deletions(-) diff --git a/mail_activity_not_deleted/__manifest__.py b/mail_activity_not_deleted/__manifest__.py index d33f7a6..e2d35c8 100644 --- a/mail_activity_not_deleted/__manifest__.py +++ b/mail_activity_not_deleted/__manifest__.py @@ -3,7 +3,7 @@ { 'name': 'Mail Activity Not Deleted', - 'version': '1.0.0', + 'version': '14.0.1.0.1', 'author': 'Numigi', 'maintainer': 'Numigi', 'license': 'LGPL-3', diff --git a/mail_activity_not_deleted/models/mail_activity.py b/mail_activity_not_deleted/models/mail_activity.py index 5bfbfd4..173cad9 100644 --- a/mail_activity_not_deleted/models/mail_activity.py +++ b/mail_activity_not_deleted/models/mail_activity.py @@ -24,7 +24,6 @@ def _compute_state(self): activity.state = "done" def unlink(self): - self._send_signal_done() self.write( {"active": False, "date_done": datetime.now()} ) @@ -33,18 +32,6 @@ def unlink(self): return True - def _send_signal_done(self): - """Send the signal to the chatter that the activity has been completed. - - The code in this method was extracted odoo/addons/mail/models/mail_activity.py. - """ - for activity in self: - if activity.date_deadline <= fields.Date.today(): - self.env["bus.bus"].sendone( - (self._cr.dbname, "res.partner", activity.user_id.partner_id.id), - {"type": "activity_updated", "activity_deleted": True}, - ) - def _update_record_date_deadline(self): """Update the stored fields that depend on activity_ids on the related record.""" record = self.env[self.res_model].browse(self.res_id) diff --git a/mail_activity_not_deleted/models/user.py b/mail_activity_not_deleted/models/user.py index f9e4aa2..1d72d7a 100644 --- a/mail_activity_not_deleted/models/user.py +++ b/mail_activity_not_deleted/models/user.py @@ -1,6 +1,8 @@ # © 2023 Numigi (tm) and all its contributors (https://bit.ly/numigiens) # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from collections import defaultdict + from odoo import api, fields, models, modules @@ -17,50 +19,65 @@ def systray_get_activities(self): Only the active filter was added in the sql query. """ - 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.active - - GROUP BY m.id, states, act.res_model; - """ - self.env.cr.execute(query, { - 'today': fields.Date.context_today(self), - 'user_id': self.env.uid, - }) + query = """SELECT array_agg(res_id) as res_ids, m.id, count(*), + 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.active + GROUP BY m.id, states; + """ + 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[0]: n[1] for n in self.env['ir.model'].browse(model_ids).name_get()} - + records_by_state_by_model = defaultdict( + lambda: {"today": set(), "overdue": set(), "planned": set(), "all": set()} + ) + for data in activity_data: + records_by_state_by_model[data["id"]][data["states"]] = set(data["res_ids"]) + records_by_state_by_model[data["id"]]["all"] = records_by_state_by_model[ + data["id"] + ]["all"] | set(data["res_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']] = { - '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'): - user_activities[activity['model']]['total_count'] += activity['count'] - - user_activities[activity['model']]['actions'] = [{ - 'icon': 'fa-clock-o', - 'name': 'Summary', - }] + for model_id in records_by_state_by_model: + model_dic = records_by_state_by_model[model_id] + model = ( + self.env["ir.model"] + .browse(model_id) + .with_prefetch(tuple(records_by_state_by_model.keys())) + ) + allowed_records = self.env[model.model].search( + [("id", "in", tuple(model_dic["all"]))] + ) + if not allowed_records: + continue + module = self.env[model.model]._original_module + icon = module and modules.module.get_module_icon(module) + today = len(model_dic["today"] & set(allowed_records.ids)) + overdue = len(model_dic["overdue"] & set(allowed_records.ids)) + user_activities[model.model] = { + "name": model.name, + "model": model.model, + "type": "activity", + "icon": icon, + "total_count": today + overdue, + "today_count": today, + "overdue_count": overdue, + "planned_count": len(model_dic["planned"] & set(allowed_records.ids)), + "actions": [ + { + "icon": "fa-clock-o", + "name": "Summary", + } + ], + } return list(user_activities.values())