From 687d675de5eb01dd2e1ef803c79acfb30d9dabc7 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Tue, 6 May 2014 15:48:05 +0200 Subject: [PATCH] [FIX] gamification: using batch mode to check rewards bzr revid: mat@openerp.com-20140506134805-4nsurv82cg9anfvm --- addons/gamification/models/challenge.py | 27 +++++++++++++------------ 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/addons/gamification/models/challenge.py b/addons/gamification/models/challenge.py index b1f297abde0..5668f5d8682 100644 --- a/addons/gamification/models/challenge.py +++ b/addons/gamification/models/challenge.py @@ -712,34 +712,35 @@ class gamification_challenge(osv.Model): 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 += _("
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 += _("
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 += _("
Nobody has succeeded to reach every goal, no badge is rewared for this challenge.")