diff --git a/addons/mail/__init__.py b/addons/mail/__init__.py index cbd477f55e6..4cf2caf8804 100644 --- a/addons/mail/__init__.py +++ b/addons/mail/__init__.py @@ -24,6 +24,7 @@ import mail_message import mail_thread import mail_group import mail_subscription +import mail_vote import ir_needaction import res_users import res_partner diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index b96b6e3791e..1b5178e7271 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -230,6 +230,7 @@ class mail_message(osv.Model): select=True, ondelete='set null', help="Parent message, used for displaying as threads with hierarchy"), 'child_ids': fields.one2many('mail.message', 'parent_id', 'Child Messages'), + 'vote_ids': fields.one2many('mail.vote', 'msg_id', 'Votes'), } _defaults = { @@ -237,6 +238,46 @@ class mail_message(osv.Model): 'state': 'received', } + + #--------------------------------------------------- + #Mail Vote system (Like or Unlike comments + #----------------------------------------------------- + + def get_vote_summary(self, cr, uid, ids, context=None): + ''' + Return message ,count vote of message id given by .particular user with True or False. + ''' + for message in self.browse(cr, uid, ids, context): + is_vote_liked = False + vote_count = len(message.vote_ids) + for vote in message.vote_ids: + if vote.user_id.id == uid: + is_vote_liked = True + break + res = { + 'msg_id': message.id, + 'vote_count': vote_count, + 'is_vote_liked': is_vote_liked + } + return res + + def vote_toggle(self, cr, uid, ids, context=None): + ''' + Toggles when Comment is liked or unlike. + Return the number of votes of particular message. + ''' + vote_pool = self.pool.get('mail.vote') + vote_count = 0 + for message in self.browse(cr, uid, ids, context): + voters_id = vote_pool.search(cr, uid, [('msg_id', '=', message.id), ('user_id', '=', uid)], context=context) + if not voters_id: + new_vote_id = vote_pool.create(cr, uid, {'msg_id': message.id, 'user_id': uid}, context=context) + else: + vote_pool.unlink(cr, uid, voters_id, context=context) + if message.vote_ids: + vote_count = len(message.vote_ids) + return vote_count + #------------------------------------------------------ # Email api #------------------------------------------------------ diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index f0dd023bf06..092050ff812 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -64,12 +64,14 @@ class mail_thread(osv.Model): def _get_message_ids(self, cr, uid, ids, name, args, context=None): res = {} + img_vote = "" for id in ids: message_ids = self.message_search(cr, uid, [id], context=context) subscriber_ids = self.message_get_subscribers(cr, uid, [id], context=context) + vote_list = self.message_vote_ids(cr, uid, ids, context=context) res[id] = { 'message_ids': message_ids, - 'message_summary': "9 %d + %d" % (len(message_ids), len(subscriber_ids)), + 'message_summary': "Msg: %d . Fol: %d . %s %d" % (len(message_ids), len(subscriber_ids), img_vote, len(vote_list)), } return res @@ -100,7 +102,15 @@ class mail_thread(osv.Model): #------------------------------------------------------ # Automatic subscription when creating/reading #------------------------------------------------------ - + def message_vote_ids(self, cr, uid, ids, context=None): + message_pool = self.pool.get('mail.message') + vote_list = [] + message_ids = self.message_search(cr, uid, [id], context=context) + for message in message_pool.browse(cr, uid, message_ids, context=context): + if message.vote_ids: + vote_list.append(message.vote_ids) + return vote_list + def create(self, cr, uid, vals, context=None): """Automatically subscribe the creator """ thread_id = super(mail_thread, self).create(cr, uid, vals, context=context) diff --git a/addons/mail/mail_vote.py b/addons/mail/mail_vote.py new file mode 100644 index 00000000000..5d63de80864 --- /dev/null +++ b/addons/mail/mail_vote.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# OpenERP, Open Source Management Solution +# Copyright (C) 2012-Today OpenERP SA (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see +# +############################################################################## + +from osv import osv, fields +from tools.translate import _ + +class mail_vote(osv.Model): + ''' + Mail vote feature allow users to like and unlike particular message or Document's message comment. + It counts the number of votes per document. + ''' + _name = 'mail.vote' + _description = 'Mail Vote' + _columns = { + 'msg_id': fields.many2one('mail.message', 'Message', required=True), + 'user_id': fields.many2one('res.users', 'User', required=True), + } +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index 3677d424c14..1941a41a259 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -7,3 +7,4 @@ access_mail_notification_all,mail.notification.all,model_mail_notification,,1,1, access_mail_group,mail.group,model_mail_group,base.group_user,1,1,1,1 access_mail_alias_user,mail.alias,model_mail_alias,base.group_user,1,1,1,0 access_mail_alias_system,mail.alias,model_mail_alias,base.group_system,1,1,1,1 +access_mail_vote,mail.vote,model_mail_vote,base.group_user,1,1,1,1 diff --git a/addons/mail/static/src/css/mail.css b/addons/mail/static/src/css/mail.css index c0317633aa7..ae934eeb4ff 100644 --- a/addons/mail/static/src/css/mail.css +++ b/addons/mail/static/src/css/mail.css @@ -275,6 +275,35 @@ display: none; } +/*--------------------------------------------------------------*/ +/* Mail Vote System (Like or Unlike Comment) +/*--------------------------------------------------------------*/ + +.oe_mail_vote_image{ + height='12px'; + width='16px'; +} + +button.oe_mail_msg_vote_like{ + height:21px; + width: 30px; + padding: 1px; + background: #8A89BA; + margin-top: -4px; +} + +button.oe_mail_msg_vote_like:hover{ + background: #8A89BA; +} + +button.oe_mail_msg_vote_like span { + color: white; +} + +span.oe_mail_vote_string{ + color: #807FB4; +} + /* ------------------------------------------------------------ */ /* mail.compose.message form view & OpenERP hacks /* ------------------------------------------------------------ */ diff --git a/addons/mail/static/src/img/vote.gif b/addons/mail/static/src/img/vote.gif new file mode 100644 index 00000000000..0e6b874770e Binary files /dev/null and b/addons/mail/static/src/img/vote.gif differ diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js index da6816d3441..8b60e96744c 100644 --- a/addons/mail/static/src/js/mail.js +++ b/addons/mail/static/src/js/mail.js @@ -559,6 +559,48 @@ openerp.mail = function(session) { return display_done && compose_done; }, + //Mail vote Functionality... + add_vote_event: function(element){ + vote_img = element.find('.oe_mail_msg_vote_like'); + self = this; + if (vote_img) + vote_img.click(function(){ + self.subscribe_vote($(this).attr('data-id')); + }); + return + }, + + find_parent_element: function(name, message_id){ + parent_element = false; + _.each($(name), function(element){ + if ($(element).attr("data-id") == message_id){ + parent_element = element; + } + }); + return parent_element; + }, + + render_vote: function(message_id){ + var self = this; + this.mail_message = new session.web.DataSet(this, 'mail.message'); + this.mail_message.call('get_vote_summary',[[parseInt(message_id)]]).then(function(result){ + if (result){ + parent_element = self.find_parent_element(".oe_mail_msg_vote", message_id); + vote_element = session.web.qweb.render('VoteDisplay', result); + $(parent_element).html(vote_element); + self.add_vote_event($(parent_element)); + } + }); + }, + + subscribe_vote: function(message_id){ + var self = this; + this.mail_message = new session.web.DataSet(this, 'mail.message'); + return this.mail_message.call('vote_toggle', [[parseInt(message_id)]]).then(function(result){ + self.render_vote(message_id); + }); + }, + /** * Override-hack of do_action: automatically reload the chatter. * Normally it should be called only when clicking on 'Post/Send' @@ -697,6 +739,10 @@ openerp.mail = function(session) { display_comments: function (records) { var self = this; + //Render Vote. + _.each(records, function(record){ + self.render_vote(record.id); + }); // sort the records mail.ChatterUtils.records_struct_add_records(this.comments_structure, records, this.params.parent_id); //build attachments download urls and compute time-relative from dates @@ -1119,7 +1165,7 @@ openerp.mail = function(session) { var records = self.comments_structure.tree_struct[root_id]['for_thread_msgs']; var model_name = self.comments_structure.msgs[root_id]['model']; var res_id = self.comments_structure.msgs[root_id]['res_id']; - var render_res = session.web.qweb.render('mail.wall_thread_container', {}); + var render_res = session.web.qweb.render('mail.Wall_thread_container', {}); $('
  • ').html(render_res).appendTo(self.$element.find('ul.oe_mail_wall_threads')); var thread = new mail.Thread(self, { 'res_model': model_name, 'res_id': res_id, 'uid': self.session.uid, 'records': records, diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml index 86d115f29c8..bd18d78e41d 100644 --- a/addons/mail/static/src/xml/mail.xml +++ b/addons/mail/static/src/xml/mail.xml @@ -45,7 +45,7 @@ wall_thread_container template for the wall Each discussion thread is contained inside this template --> - + + + + Votes : + +
  • + + + + + + +
  • + +
  • @@ -155,6 +174,7 @@
  • +
  • Reply