|
|
"""Return:
the list of unique res.users ids having received this badge
the total number of time this badge was granted
the total number of users this badge was granted to
"""
defaults = {
'granted_count': 0,
'granted_users_count': 0,
'unique_owner_ids': [],
}
if not self.ids:
self.update(defaults)
return
Users = self.env["res.users"]
query = Users._search([])
badge_alias = query.join("res_users", "id", "gamification_badge_user", "user_id", "badges")
rows = self.env.execute_query(SQL(
"""
SELECT %(badge_alias)s.badge_id, count(res_users.id) as stat_count,
count(distinct(res_users.id)) as stat_count_distinct,
array_agg(distinct(res_users.id)) as unique_owner_ids
FROM %(from_clause)s
WHERE %(where_clause)s
AND %(badge_alias)s.badge_id IN %(ids)s
GROUP BY %(badge_alias)s.badge_id
""",
from_clause=query.from_clause,
where_clause=query.where_clause or SQL("TRUE"),
badge_alias=SQL.identifier(badge_alias),
ids=tuple(self.ids),
))
mapping = {
badge_id: {
'granted_count': count,
'granted_users_count': distinct_count,
'unique_owner_ids': owner_ids,
}
for (badge_id, count, distinct_count, owner_ids) in rows
}
for badge in self:
badge.update(mapping.get(badge.id, defaults))
|
|