Odoo Mindscape. Understand Odoo faster. Explore modules, fields, dependencies and version differences in one place instead of digging through the source code.

Module: Gamification

Entity: gamification.badge

Compute Method: _get_owners_info

Inputs Method Outputs
  • id
"""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))

Back to entity