From c30ab2400438c20b8eb66f5c6c792c54e918f227 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Wed, 12 Mar 2014 12:37:35 +0530 Subject: [PATCH 1/6] [IMP] improved code for filter as new changes landedn in trunk bzr revid: tpa@tinyerp.com-20140312070735-2np27bur8d7cd3nv --- addons/website_forum/controllers/main.py | 12 +++++------ addons/website_forum/views/website_forum.xml | 22 ++++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/addons/website_forum/controllers/main.py b/addons/website_forum/controllers/main.py index 57588249b54..cba4dc9ab6b 100644 --- a/addons/website_forum/controllers/main.py +++ b/addons/website_forum/controllers/main.py @@ -54,7 +54,7 @@ class website_forum(http.Controller): return request.redirect("/forum/%s" % forum_id) @http.route(['/forum/', '/forum//page/'], type='http', auth="public", website=True, multilang=True) - def questions(self, forum, page=1, **searches): + def questions(self, forum, page=1, filters='', **searches): cr, uid, context = request.cr, request.uid, request.context Forum = request.registry['website.forum.post'] domain = [('forum_id', '=', forum.id), ('parent_id', '=', False)] @@ -65,13 +65,12 @@ class website_forum(http.Controller): ('name', 'ilike', search), ('content', 'ilike', search)] - type = searches.get('type',False) - if not type: - searches['type'] = 'all' - if type == 'unanswered': + if not filters: + filters = 'all' + if filters == 'unanswered': domain += [ ('child_ids', '=', False) ] #TODO: update domain to show followed questions of user - if type == 'followed': + if filters == 'followed': domain += [ ('create_uid', '=', uid) ] step = 10 @@ -86,6 +85,7 @@ class website_forum(http.Controller): 'question_ids': question_ids, 'forum': forum, 'pager': pager, + 'filters': filters, 'searches': searches, } diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml index 0557b078759..6fcd176819d 100644 --- a/addons/website_forum/views/website_forum.xml +++ b/addons/website_forum/views/website_forum.xml @@ -83,7 +83,7 @@ From 58bcab39c1c258056f9b2b59f71090687feeaea0 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Wed, 12 Mar 2014 09:53:25 +0100 Subject: [PATCH 3/6] [IMP] cleaned code bzr revid: fp@tinyerp.com-20140312085325-msue61gt1adda0jn --- addons/website_forum/views/website_forum.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml index 9406b8f4bea..e96887ba41b 100644 --- a/addons/website_forum/views/website_forum.xml +++ b/addons/website_forum/views/website_forum.xml @@ -51,8 +51,8 @@ @@ -452,7 +452,7 @@ - + awarded users @@ -477,9 +477,9 @@

- - users - user + + users + user received this badge:

@@ -628,7 +628,7 @@ - X + X
From 559600f7e74703642c367ebb0da2a3782f777daf Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Wed, 12 Mar 2014 10:00:24 +0100 Subject: [PATCH 4/6] [IMP] badges bzr revid: fp@tinyerp.com-20140312090024-xvyvds6773ff3smi --- .../website_forum/data/forum_badges_data.xml | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/addons/website_forum/data/forum_badges_data.xml b/addons/website_forum/data/forum_badges_data.xml index 497ebc6d333..1689a3c5092 100644 --- a/addons/website_forum/data/forum_badges_data.xml +++ b/addons/website_forum/data/forum_badges_data.xml @@ -6,16 +6,9 @@ Autobiographer - Completed all user profile fields + Completed own biography True - gold - - - - Citizen Patrol - First flagged post - True - silver + bronze @@ -31,7 +24,7 @@ True gold - + Critic First downvote @@ -45,7 +38,7 @@ True gold - + Editor First edit @@ -59,17 +52,17 @@ True silver - + Enthusiast - Visited site every day for 30 days in a row + Voted on questions/answers for 15 days in a row True silver - + Expert - Very active in one tag + Posted more than 10 questions or answers in one tag True silver From 07e5c1340cf8def6627d9c79f4218e93cb6b638b Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Wed, 12 Mar 2014 14:46:02 +0530 Subject: [PATCH 5/6] [IMP] improved code to start functionality of sorting. bzr revid: tpa@tinyerp.com-20140312091602-41w3zi7k3mu6mo1m --- addons/website_forum/controllers/main.py | 16 ++++++++++++--- addons/website_forum/models/website_forum.py | 18 +++++++++++++++-- addons/website_forum/views/website_forum.xml | 21 +++++++++++--------- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/addons/website_forum/controllers/main.py b/addons/website_forum/controllers/main.py index 62e228f8a1b..c40f8b23a34 100644 --- a/addons/website_forum/controllers/main.py +++ b/addons/website_forum/controllers/main.py @@ -54,10 +54,11 @@ class website_forum(http.Controller): return request.redirect("/forum/%s" % forum_id) @http.route(['/forum/', '/forum//page/'], type='http', auth="public", website=True, multilang=True) - def questions(self, forum, page=1, filters='', **searches): + def questions(self, forum, page=1, filters='', sorting='', **searches): cr, uid, context = request.cr, request.uid, request.context Forum = request.registry['website.forum.post'] domain = [('forum_id', '=', forum.id), ('parent_id', '=', False)] + order = "id desc" search = searches.get('search',False) if search: @@ -73,11 +74,18 @@ class website_forum(http.Controller): if filters == 'followed': domain += [ ('create_uid', '=', uid) ] + if sorting == 'date': + order = 'write_date desc' + if sorting == 'answered': + order = 'child_count desc' + if sorting == 'vote': + order = 'vote_count desc' + step = 10 question_count = Forum.search(cr, uid, domain, count=True, context=context) pager = request.website.pager(url="/forum/%s/" % slug(forum), total=question_count, page=page, step=step, scope=10) - obj_ids = Forum.search(cr, uid, domain, limit=step, offset=pager['offset'], context=context) + obj_ids = Forum.search(cr, uid, domain, limit=step, offset=pager['offset'], order=order, context=context) question_ids = Forum.browse(cr, uid, obj_ids, context=context) values = { @@ -86,6 +94,7 @@ class website_forum(http.Controller): 'forum': forum, 'pager': pager, 'filters': filters, + 'sorting': sorting, 'searches': searches, } @@ -107,10 +116,11 @@ class website_forum(http.Controller): for answer in question.child_ids: if answer.create_uid.id == request.uid: answer_done = True - post['type'] = 'question' + filters = 'question' values = { 'question': question, 'searches': post, + 'filters': filters, 'answer_done': answer_done, 'reversed': reversed, 'forum': forum, diff --git a/addons/website_forum/models/website_forum.py b/addons/website_forum/models/website_forum.py index dba8d0a7163..16b32e3c037 100644 --- a/addons/website_forum/models/website_forum.py +++ b/addons/website_forum/models/website_forum.py @@ -62,7 +62,6 @@ class Post(osv.Model): _name = 'website.forum.post' _description = "Question" _inherit = ['mail.thread', 'website.seo.metadata'] - _order = "id desc" def _get_votes(self, cr, uid, ids, field_name, arg, context): res = dict.fromkeys(ids, False) @@ -94,6 +93,16 @@ class Post(osv.Model): result[vote.post_id.id] = True return result.keys() + def _get_child_count(self, cr, uid, ids, field_name=False, arg={}, context=None): + res = dict.fromkeys(ids, 0) + for post in self.browse(cr, uid, ids, context=context): + if post.parent_id: + res[post.parent_id.id] = len(post.parent_id.child_ids) + return res + + def _get_child(self, cr, uid, ids, context=None): + return ids + _columns = { 'name': fields.char('Title', size=128), 'forum_id': fields.many2one('website.forum', 'Forum', required=True), @@ -114,6 +123,11 @@ class Post(osv.Model): 'parent_id': fields.many2one('website.forum.post', 'Question'), 'child_ids': fields.one2many('website.forum.post', 'parent_id', 'Answers'), + 'child_count':fields.function(_get_child_count, string="Answers", type='integer', + store={ + 'website.forum.post': (_get_child, [], 10), + } + ), 'history_ids': fields.one2many('blog.post.history', 'post_id', 'History', help='Last post modifications'), # TODO FIXME: when website_mail/mail_thread.py inheritance work -> this field won't be necessary @@ -143,7 +157,7 @@ class Post(osv.Model): _defaults = { 'state': 'active', 'vote_count': 0, - 'active': True + 'active': True, } def create_history(self, cr, uid, ids, vals, context=None): diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml index e96887ba41b..deb6db1efc6 100644 --- a/addons/website_forum/views/website_forum.xml +++ b/addons/website_forum/views/website_forum.xml @@ -159,28 +159,31 @@ No filter filter: Unanswered filter: Followed + Sort by: Last activity date + Sort by: Most answered + Sort by: Most votes
From c03ffffa8a02da44a91b354cc6f04fd658a905e2 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Wed, 12 Mar 2014 15:24:13 +0530 Subject: [PATCH 6/6] [IMP] instead of using len(question.child_ids) use child_count, remove forum filed from gamification.badge use only level, rename controller from /badges to /badge and /tags to /tag bzr revid: tpa@tinyerp.com-20140312095413-23d39ir8txd3f35q --- addons/website_forum/controllers/main.py | 11 +++---- .../website_forum/data/forum_badges_data.xml | 32 ------------------- addons/website_forum/models/website_forum.py | 6 ++-- addons/website_forum/views/website_forum.xml | 20 ++++++------ 4 files changed, 17 insertions(+), 52 deletions(-) diff --git a/addons/website_forum/controllers/main.py b/addons/website_forum/controllers/main.py index c40f8b23a34..0509cd348ef 100644 --- a/addons/website_forum/controllers/main.py +++ b/addons/website_forum/controllers/main.py @@ -253,10 +253,9 @@ class website_forum(http.Controller): def tag_questions(self, forum, tag, page=1, **kwargs): cr, uid, context = request.cr, request.uid, request.context Post = request.registry['website.forum.post'] - post_ids = [que.id for que in tag.post_ids] - obj_ids = Post.search(cr, uid, [('forum_id', '=', forum.id), ('id', 'in', post_ids)], context=context) + obj_ids = Post.search(cr, uid, [('forum_id', '=', forum.id), ('tags', '=', tag.id)], context=context) question_ids = Post.browse(cr, uid, obj_ids, context=context) - pager = request.website.pager(url="/forum/%s/tag" % slug(forum), total=len(tag.post_ids), page=page, step=10, scope=10) + pager = request.website.pager(url="/forum/%s/tag" % slug(forum), total=len(obj_ids), page=page, step=10, scope=10) kwargs['tags'] = 'True' values = { @@ -267,7 +266,7 @@ class website_forum(http.Controller): } return request.website.render("website_forum.index", values) - @http.route(['/forum//tags'], type='http', auth="public", website=True, multilang=True) + @http.route(['/forum//tag'], type='http', auth="public", website=True, multilang=True) def tags(self, forum, page=1, **searches): cr, uid, context = request.cr, request.uid, request.context Tag = request.registry['website.forum.tag'] @@ -280,11 +279,11 @@ 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) + @http.route(['/forum//badge'], 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) + badge_ids = Badge.search(cr, uid, [('level', '!=', False)], context=context) badges = Badge.browse(cr, uid, badge_ids, context=context) values = { 'badges': badges, diff --git a/addons/website_forum/data/forum_badges_data.xml b/addons/website_forum/data/forum_badges_data.xml index 1689a3c5092..b9156289684 100644 --- a/addons/website_forum/data/forum_badges_data.xml +++ b/addons/website_forum/data/forum_badges_data.xml @@ -7,222 +7,190 @@ Autobiographer Completed own biography - True bronze Cleanup First rollback - True gold Commentator Posted 10 comments - True gold Critic First downvote - True gold Disciplined Deleted own post with 3 or more upvotes - True gold Editor First edit - True gold Enlightened First answer was accepted with 3 or more votes - True silver Enthusiast Voted on questions/answers for 15 days in a row - True silver Expert Posted more than 10 questions or answers in one tag - True silver Famous Question Asked a question with 500 views - True gold Favorite Question Question favorited by 5 users - True silver Good Answer Answer voted up 6 times - True silver Good Question Question voted up 6 times - True silver Great Answer Answer voted up 15 times - True gold Great Question Question voted up 15 times - True gold Guru Answer accepted with 15 or more votes - True silver Necromancer Answered a question more than 30 days later with at least 2 votes - True silver Nice Answer Answer voted up 4 times - True bronze Nice Quesiotn Question voted up 4 times - True bronze Notable Question Asked a question with 250 views - True silver Organizer First retag - True bronze Peer Pressure Deleted own post with 3 or more downvotes - True gold Popular Question Asked a question with 150 views - True gold Pundit Left 10 comments with score of 10 or more - True silver Scholar Asked a question and accepted an answer - True gold self-Learner Answered own question with at least 4 up votes - True gold Stellar Question Question favorited by 25 users - True bronze Associate Editor Edited 30 entries - True silver Student Asked first question with at least one up vote - True gold Supporter First upvote - True gold Taxonomist Created a tag used by 15 questions - True silver Teacher Received at least 3 upvote for an answer for the first time - True gold diff --git a/addons/website_forum/models/website_forum.py b/addons/website_forum/models/website_forum.py index 16b32e3c037..64e34c654f9 100644 --- a/addons/website_forum/models/website_forum.py +++ b/addons/website_forum/models/website_forum.py @@ -228,7 +228,7 @@ class PostHistory(osv.Model): _description = 'Post History' _inherit = ['website.seo.metadata'] _columns = { - 'name': fields.char('Post Title') + 'name': fields.char('Post Title'), 'post_id': fields.many2one('website.forum.post', 'Post', ondelete='cascade'), 'date': fields.datetime('Created on', select=True, readonly=True), 'user_id': fields.many2one('res.users', 'Created by', select=True, readonly=True), @@ -267,7 +267,7 @@ class Vote(osv.Model): vote_ids = self.search(cr, uid, [('post_id', '=', post_id), ('user_id','=',uid)], context=context) if vote_ids: self.write(cr, uid, vote_uid, { - 'vote': vote) + 'vote': vote }, context=context) else: self.create(cr, uid, { @@ -279,8 +279,6 @@ class Vote(osv.Model): class Badge(osv.Model): _inherit = 'gamification.badge' _columns = { - # TODO: remove this forum field and use level is not False instead - 'forum': fields.boolean('Is a Forum Badge'), 'level': fields.selection([('bronze', 'bronze'), ('silver', 'silver'), ('gold', 'gold')], 'Forum Badge Level'), } diff --git a/addons/website_forum/views/website_forum.xml b/addons/website_forum/views/website_forum.xml index deb6db1efc6..7637374268e 100644 --- a/addons/website_forum/views/website_forum.xml +++ b/addons/website_forum/views/website_forum.xml @@ -35,10 +35,10 @@