[ADD] automatic checking of goals

bzr revid: mat@openerp.com-20130311173229-xn2g2ce3su1b6au1
This commit is contained in:
Martin Trigaux 2013-03-11 18:32:29 +01:00
parent 1ddd1bf300
commit 3bb68922c2
1 changed files with 38 additions and 21 deletions

View File

@ -108,10 +108,10 @@ class gamification_badge(osv.Model):
('everyone', 'Everyone'),
('users', 'A selected list of users'),
('having', 'People having some badges'),
('computed', 'Nobody'),
('nobody', 'Nobody'),
],
string="Authorization Rule",
help="Who can give this badge",
string="User Authorization Rule",
help="Who can grant this badge",
required=True),
'rule_auth_user_ids': fields.many2many('res.users', 'rel_badge_auth_users',
string='Authorized Users',
@ -124,14 +124,14 @@ class gamification_badge(osv.Model):
help="This badge can not be send indefinitely"),
'rule_max_number': fields.integer('Limitation Number',
help="The maximum number of time this badge can be sent per month."),
'auto_rule': fields.selection([
('manual', 'Given by User Only'),
'rule_automatic': fields.selection([
('manual', 'Given by Users Only'),
('goals', 'List of Goals'),
('python', 'Python Code'),
],
string="Authorization Rule",
help="Who can give this badge",
string="Automatic Rule",
help="Can this badge be automatically rewarded",
required=True),
'compute_code': fields.text('Compute Code',
@ -164,6 +164,7 @@ class gamification_badge(osv.Model):
'stat_count': 0,
'stat_count_distinct': 0,
'stat_this_month': 0,
'rule_automatic': 'manual',
}
def send_badge(self, cr, uid, badge_id, badge_user_ids, user_from=None, context=None):
@ -205,21 +206,37 @@ class gamification_badge(osv.Model):
:return: list of res.users ids that should receive the badge"""
context = context or {}
badge = self.browse(cr, uid, badge_id, context=context)
if badge.rule_auth != 'computed':
return []
code_obj = compile(badge.compute_code, '<string>', 'exec')
code_globals = {}
code_locals = {'cr': cr, 'uid': uid, 'context': context, 'result': []}
exec code_obj in code_globals, code_locals
if 'result' in code_locals and type(code_locals['result']) == list:
user_badge_ids = self.pool.get('gamification.badge.user').search(
cr, uid, [('user_id', 'in', code_locals['result'])], context=context)
self.send_badge(cr, uid, badge.id, user_badge_ids, context=context)
if badge.rule_automatic == 'python':
code_obj = compile(badge.compute_code, '<string>', 'exec')
code_globals = {}
code_locals = {'cr': cr, 'uid': uid, 'context': context, 'result': []}
exec code_obj in code_globals, code_locals
if 'result' in code_locals and type(code_locals['result']) == list:
return self.pool.get('gamification.badge.user').search(
cr, uid, [('user_id', 'in', code_locals['result'])], context=context)
# self.send_badge(cr, uid, badge.id, user_badge_ids, context=context)
return True
elif badge.rule_automatic == 'goals':
common_users = None
for goal_type in badge.goal_type_ids:
res = self.pool.get('gamification.goal').read_group(cr, uid, [
('type_id', '=', goal_type.id),
('state', '=', 'reached'),
], ['user_id', 'state', 'type_id'], ['user_id'], context=context)
users = [goal.user_id.id for goal in res]
if common_users is None:
# first type, include all
common_users = users
else:
merged_list = [user_id for user_id in users if user_id in common_users]
common_users = merged_list
return common_users
# else badge.rule_automatic == 'manual':
return []
def can_grant_badge(self, cr, uid, user_from_id, badge_id, context=None):
"""Check if a user can grant a badge to another user
@ -230,7 +247,7 @@ class gamification_badge(osv.Model):
context = context or {}
badge = self.browse(cr, uid, badge_id, context=context)
if badge.rule_auth == 'computed':
if badge.rule_auth == 'nobody':
return False
elif badge.rule_auth == 'list':
if user_from_id not in [user.id for user in badge.rule_auth_user_ids]: