Skip to content

Commit

Permalink
TA#63122 [FIX] migration mail_activity_not_deleted (#138)
Browse files Browse the repository at this point in the history
  • Loading branch information
majouda committed Mar 6, 2024
1 parent 073a012 commit 5ac6593
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 58 deletions.
2 changes: 1 addition & 1 deletion mail_activity_not_deleted/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

{

Check warning on line 4 in mail_activity_not_deleted/__manifest__.py

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

mail_activity_not_deleted/__manifest__.py#L4

Statement seems to have no effect
'name': 'Mail Activity Not Deleted',
'version': '1.0.0',
'version': '14.0.1.0.1',
'author': 'Numigi',
'maintainer': 'Numigi',
'license': 'LGPL-3',
Expand Down
13 changes: 0 additions & 13 deletions mail_activity_not_deleted/models/mail_activity.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()}
)
Expand All @@ -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)
Expand Down
105 changes: 61 additions & 44 deletions mail_activity_not_deleted/models/user.py
Original file line number Diff line number Diff line change
@@ -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


Expand All @@ -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())

0 comments on commit 5ac6593

Please sign in to comment.