[FIX] gamification: using batch mode to check rewards
authorMartin Trigaux <mat@openerp.com>
Tue, 6 May 2014 13:48:05 +0000 (15:48 +0200)
committerMartin Trigaux <mat@openerp.com>
Tue, 6 May 2014 13:48:05 +0000 (15:48 +0200)
bzr revid: mat@openerp.com-20140506134805-4nsurv82cg9anfvm

addons/gamification/models/challenge.py

index b1f297a..5668f5d 100644 (file)
@@ -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 += _("<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.")