From f5b14f1122c6268906cd4dfc9c7ecff1fc05ce53 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Fri, 7 Mar 2014 15:04:30 +0530 Subject: [PATCH] [ADD] added dependancy of gamification mudule, add badge functionality. bzr revid: tpa@tinyerp.com-20140307093430-psyu9zcjox172ctp --- addons/website_forum/__openerp__.py | 2 +- addons/website_forum/controllers/main.py | 41 ++++++++-- addons/website_forum/models/website_forum.py | 31 +++++++- addons/website_forum/views/website_forum.xml | 80 +++++++++++++++++--- 4 files changed, 135 insertions(+), 19 deletions(-) diff --git a/addons/website_forum/__openerp__.py b/addons/website_forum/__openerp__.py index c71ac9a126f..298140bb472 100644 --- a/addons/website_forum/__openerp__.py +++ b/addons/website_forum/__openerp__.py @@ -29,7 +29,7 @@ Ask questions, get answers, no distractions """, 'author': 'OpenERP SA', - 'depends': ['website', 'website_mail'], + 'depends': ['website', 'website_mail', 'gamification'], 'data': [ 'data/forum_data.xml', 'views/website_forum.xml', diff --git a/addons/website_forum/controllers/main.py b/addons/website_forum/controllers/main.py index e592f272ebd..0460abb4e49 100644 --- a/addons/website_forum/controllers/main.py +++ b/addons/website_forum/controllers/main.py @@ -241,7 +241,7 @@ class website_forum(http.Controller): def tag_questions(self, forum, tag, page=1, **kwargs): cr, uid, context = request.cr, request.uid, request.context step = 10 - pager = request.website.pager(url="/forum/", total=len(tag.post_ids), page=page, step=step, scope=10) + pager = request.website.pager(url="/forum/%s/tag" % slug(forum), total=len(tag.post_ids), page=page, step=step, scope=10) values = { 'question_ids': tag.post_ids, @@ -265,6 +265,37 @@ class website_forum(http.Controller): } return request.website.render("website_forum.tag", values) + @http.route(['/forum//badges'], type='http', auth="public", website=True, multilang=True) + def badges(self, forum, **searches): + cr, uid, context = request.cr, request.uid, request.context + Badge = request.registry['gamification.badge'] + badge_ids = Badge.search(cr, uid, [('forum', '=', True)], context=context) + badges = Badge.browse(cr, uid, badge_ids, context=context) + values = { + 'badges': badges, + 'forum': forum, + 'searches': {'badges': True} + } + return request.website.render("website_forum.badge", values) + + @http.route(['/forum//badge/'], type='http', auth="public", website=True, multilang=True) + def badge_users(self, forum, badge, page=1, **kwargs): + cr, uid, context = request.cr, request.uid, request.context + step = 10 + pager = request.website.pager(url="/forum/%s/badge" % slug(forum), total=len(badge.owner_ids), page=page, step=step, scope=10) + + users = [badge_user.user_id for badge_user in badge.owner_ids] + print users + values = { + 'badge': badge, + 'users': users, + 'pager': pager, + 'forum': forum, + 'searches': kwargs + } + + return request.website.render("website_forum.badge_user", values) + @http.route(['/forum//users', '/forum/users/page/'], type='http', auth="public", website=True, multilang=True) def users(self, forum, page=1, **searches): cr, uid, context = request.cr, request.uid, request.context @@ -297,9 +328,9 @@ class website_forum(http.Controller): Vote.unlink(cr, uid, vote_ids, context=context) else: Vote.create(cr, uid, { - 'post_id': post_id, - 'user_id': uid, - 'vote': post.get('vote'), - }, context=context) + 'post_id': post_id, + 'user_id': uid, + 'vote': post.get('vote'), + }, context=context) return werkzeug.utils.redirect("/forum/%s/question/%s" % (slug(forum),post.get('question_id'))) diff --git a/addons/website_forum/models/website_forum.py b/addons/website_forum/models/website_forum.py index f69386e94e3..9e7ba059d7c 100644 --- a/addons/website_forum/models/website_forum.py +++ b/addons/website_forum/models/website_forum.py @@ -174,6 +174,18 @@ class Post(osv.Model): class Users(osv.Model): _inherit = 'res.users' + + def _get_user_badge_level(self, cr, uid, ids, name, args, context=None): + """Return total badge per level of users""" + result = dict.fromkeys(ids, False) + badge_user_obj = self.pool.get('gamification.badge.user') + for id in ids: + result[id] = { + 'gold_badge': badge_user_obj.search(cr, uid, [('badge_id.level', '=', 'gold'), ('user_id', '=', id)], context=context, count=True), + 'silver_badge': badge_user_obj.search(cr, uid, [('badge_id.level', '=', 'silver'), ('user_id', '=', id)], context=context, count=True), + 'bronze_badge': badge_user_obj.search(cr, uid, [('badge_id.level', '=', 'bronze'), ('user_id', '=', id)], context=context, count=True), + } + return result _columns = { # TODO: Remove these 3 field and compute number in /user controller 'question_ids':fields.one2many('website.forum.post', 'create_uid', 'Questions', domain=[('parent_id', '=', False)]), @@ -186,10 +198,12 @@ class Users(osv.Model): 'create_date': fields.datetime('Create Date', select=True, readonly=True), 'karma': fields.integer('Karma'), # Use Gamification for this - 'forum': fields.boolean('Is Forum Member') + 'forum': fields.boolean('Is Forum Member'), - # TODO: 'tag_ids':fields.function() - # Badges : use the gamification module + 'badges': fields.one2many('gamification.badge.user', 'user_id', 'Badges'), + 'gold_badge':fields.function(_get_user_badge_level, string="Number of gold badges", type='integer', multi='badge_level'), + 'silver_badge':fields.function(_get_user_badge_level, string="Number of silver badges", type='integer', multi='badge_level'), + 'bronze_badge':fields.function(_get_user_badge_level, string="Number of bronze badges", type='integer', multi='badge_level'), } _defaults = { 'forum': False @@ -223,6 +237,17 @@ class Vote(osv.Model): self.pool['website.forum.post'].create_activity(cr, uid, [int(vals.get('post_id'))], method='vote', context=context) return vote_id +class Badge(osv.Model): + _inherit = 'gamification.badge' + _columns = { + 'forum': fields.boolean('Is Forum Badge'), + #NOTE: we can create new BadgeLevel object instead of selection + 'level': fields.selection([('gold', 'gold'), ('silver', 'silver'), ('bronze', 'bronze')], 'Badge Level'), + } + _defaults = { + 'forum': False + } + class ForumActivity(osv.Model): _name = "website.forum.activity" _description = "Activity" diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml index 5d3741cee3b..6b4d64af7ba 100644 --- a/addons/website_forum/views/website_forum.xml +++ b/addons/website_forum/views/website_forum.xml @@ -95,8 +95,8 @@
  • Tags
  • -
  • - Badges +
  • + Badges