5e012674b87e2e4bc9634ba065b0f08d6b9b0185
[odoo/odoo.git] / addons / website_forum / models / res_users.py
1 # -*- coding: utf-8 -*-
2
3 from datetime import datetime
4 import hashlib
5 from urllib import urlencode
6
7 from openerp import models, fields, api
8
9
10 class Users(models.Model):
11     _inherit = 'res.users'
12
13     def __init__(self, pool, cr):
14         init_res = super(Users, self).__init__(pool, cr)
15         self.SELF_WRITEABLE_FIELDS = list(
16             set(
17                 self.SELF_WRITEABLE_FIELDS +
18                 ['country_id', 'city', 'website', 'website_description', 'website_published']))
19         return init_res
20
21     create_date = fields.Datetime('Create Date', readonly=True, copy=False, select=True)
22     karma = fields.Integer('Karma', default=0)
23     badge_ids = fields.One2many('gamification.badge.user', 'user_id', string='Badges', copy=False)
24     gold_badge = fields.Integer('Gold badges count', compute="_get_user_badge_level")
25     silver_badge = fields.Integer('Silver badges count', compute="_get_user_badge_level")
26     bronze_badge = fields.Integer('Bronze badges count', compute="_get_user_badge_level")
27
28     @api.multi
29     @api.depends('badge_ids')
30     def _get_user_badge_level(self):
31         """ Return total badge per level of users
32         TDE CLEANME: shouldn't check type is forum ? """
33         badge_groups = self.env['gamification.badge.user'].read_group(
34             [('level', 'in', ['gold', 'silver', 'bronze'])],
35             ['user_id', 'level', 'badge_id'],
36             ['user_id', 'level'],
37             lazy=False)
38         badge_data = dict()
39         for group in badge_groups:
40             badge_data.setdefault(group['user_id'][0], dict())[group['level']] = group['__count']
41         for user in self:
42             user.gold_badge = badge_data.get(user.id) and badge_data[user.id].get('gold', 0) or 0
43             user.silver_badge = badge_data.get(user.id) and badge_data[user.id].get('silver', 0) or 0
44             user.bronze_badge = badge_data.get(user.id) and badge_data[user.id].get('bronze', 0) or 0
45
46     @api.model
47     def _generate_forum_token(self, user_id, email):
48         """Return a token for email validation. This token is valid for the day
49         and is a hash based on a (secret) uuid generated by the forum module,
50         the user_id, the email and currently the day (to be updated if necessary). """
51         forum_uuid = self.env['ir.config_parameter'].sudo().get_param('website_forum.uuid')
52         return hashlib.sha256('%s-%s-%s-%s' % (
53             datetime.now().replace(hour=0, minute=0, second=0, microsecond=0),
54             forum_uuid,
55             user_id,
56             email)).hexdigest()
57
58     @api.one
59     def send_forum_validation_email(self, forum_id=None):
60         token = self._generate_forum_token(self.id, self.email)
61         activation_template_id = self.env['ir.model.data'].xmlid_to_res_id('website_forum.validation_email')
62         if activation_template_id:
63             params = {
64                 'token': token,
65                 'id': self.id,
66                 'email': self.email}
67             if forum_id:
68                 params['forum_id'] = forum_id
69             base_url = self.env['ir.config_parameter'].get_param('web.base.url')
70             token_url = base_url + '/forum/validate_email?%s' % urlencode(params)
71             self.env['email.template'].sudo().with_context(token_url=token_url).send_mail(activation_template_id, self.id, force_send=True)
72         return True
73
74     @api.one
75     def process_forum_validation_token(self, token, email, forum_id=None, context=None):
76         validation_token = self._generate_forum_token(self.id, email)
77         if token == validation_token and self.karma == 0:
78             karma = 3
79             forum = None
80             if forum_id:
81                 forum = self.env['forum.forum'].browse(forum_id)
82             else:
83                 forum_ids = self.env['forum.forum'].search([], limit=1)
84                 if forum_ids:
85                     forum = forum_ids[0]
86             if forum:
87                 # karma gained: karma to ask a question and have 2 downvotes
88                 karma = forum.karma_ask + (-2 * forum.karma_gen_question_downvote)
89             return self.write({'karma': karma})
90         return False
91
92     @api.multi
93     def add_karma(self, karma):
94         for user in self:
95             user.karma += karma
96         return True
97
98     @api.model
99     def get_serialised_gamification_summary(self, excluded_categories=None):
100         if isinstance(excluded_categories, list):
101             if 'forum' not in excluded_categories:
102                 excluded_categories.append('forum')
103         else:
104             excluded_categories = ['forum']
105         return super(Users, self).get_serialised_gamification_summary()