Skip to content

Commit

Permalink
[15.0][FIX] mail_activity_done: KeyError user_activites[model.model]
Browse files Browse the repository at this point in the history
A KeyError occurs for a missing model in the user_activities, when
updating the user_activites[model.model] dict.

The fix to initialize the activity data wasn't straightforward.
However just backporting (copied) the code from 16.0 seems to work!
  • Loading branch information
bobslee committed Aug 20, 2024
1 parent 1355ecf commit ee3fc87
Showing 1 changed file with 46 additions and 55 deletions.
101 changes: 46 additions & 55 deletions mail_activity_done/models/res_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,69 +3,60 @@
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
from collections import defaultdict

from odoo import api, fields, models
from odoo import api, fields, models, modules


class ResUsers(models.Model):
_inherit = "res.users"

@api.model
def systray_get_activities(self):
# TODO: Simplify if Odoo allows to modify query
res = super().systray_get_activities()
# Convert list to dict
user_activities = {}
for item in res:
user_activities[item["model"]] = item
# Redo the method only with the archived records and subtract them.
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 = False
GROUP BY m.id, states;
"""
# 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,
},
query, {"today": fields.Date.context_today(self), "user_id": self.env.uid}
)
activity_data = self.env.cr.dictfetchall()
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"])
for model_id in records_by_state_by_model:
model_dic = records_by_state_by_model[model_id]
model = (
self.env["ir.model"]
.sudo()
.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
today = len(model_dic["today"] & set(allowed_records.ids))
overdue = len(model_dic["overdue"] & set(allowed_records.ids))
# Decrease total
user_activities[model.model]["total_count"] -= today + overdue
user_activities[model.model]["today_count"] -= today
user_activities[model.model]["overdue_count"] -= overdue
user_activities[model.model]["planned_count"] -= len(
model_dic["planned"] & set(allowed_records.ids)
)
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"],
"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())

0 comments on commit ee3fc87

Please sign in to comment.