Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 54 additions & 51 deletions mail_activity_team/models/res_users.py
Original file line number Diff line number Diff line change
@@ -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


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