rewarded_users = []
challenge_ended = end_date == yesterday.strftime(DF) or force
if challenge.reward_id and challenge_ended or challenge.reward_realtime:
- for user in challenge.user_ids:
- reached_goal_ids = self.pool.get('gamification.goal').search(cr, uid, [
- ('challenge_id', '=', challenge.id),
- ('user_id', '=', user.id),
- ('start_date', '=', start_date),
- ('end_date', '=', end_date),
- ('state', '=', 'reached')
- ], context=context)
- if len(reached_goal_ids) == len(challenge.line_ids):
+ # not using start_date as intemportal goals have a start date but no end_date
+ reached_goals = self.pool.get('gamification.goal').read_group(cr, uid, [
+ ('challenge_id', '=', challenge.id),
+ ('end_date', '=', end_date),
+ ('state', '=', 'reached')
+ ], fields=['user_id'], groupby=['user_id'], context=context)
+ for reach_goals_user in reached_goals:
+ if reach_goals_user['user_id_count'] == len(challenge.line_ids):
# the user has succeeded every assigned goal
+ user_id = reach_goals_user['user_id'][0]
if challenge.reward_realtime:
badges = self.pool['gamification.badge.user'].search(cr, uid, [
('challenge_id', '=', challenge.id),
('badge_id', '=', challenge.reward_id.id),
- ('user_id', '=', user.id),
+ ('user_id', '=', user_id),
], count=True, context=context)
if badges > 0:
# has already recieved the badge for this challenge
continue
- self.reward_user(cr, uid, user.id, challenge.reward_id.id, challenge.id, context=context)
- rewarded_users.append(user)
+ self.reward_user(cr, uid, user_id, challenge.reward_id.id, challenge.id, context=context)
+ rewarded_users.append(user_id)
if challenge_ended:
# open chatter message
message_body = _("The challenge %s is finished." % challenge.name)
if rewarded_users:
- message_body += _("<br/>Reward (badge %s) for every succeeding user was sent to %s." % (challenge.reward_id.name, ", ".join([user.name for user in rewarded_users])))
+ user_names = self.pool['res.users'].name_get(cr, uid, rewarded_users, context=context)
+ message_body += _("<br/>Reward (badge %s) for every succeeding user was sent to %s." % (challenge.reward_id.name, ", ".join([user for user in user_names])))
else:
message_body += _("<br/>Nobody has succeeded to reach every goal, no badge is rewared for this challenge.")