From c5da7b8aeb8b5de224bd9c142908f742b759eb16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 25 Jan 2019 16:47:20 +0000 Subject: [PATCH] [IMP] website_slides: improve like / dislike Like / dislike of slides is fixed and improved to make a tri-state like behavior. Future commit will change this implementation in order to use a relationship table between users and slides as we are moving towards the eLearning platform. Let us have this simple implementation currently and rewrite it in a near future. This commit is linked to task ID 1933820 and PR #30553. --- addons/website_slides/controllers/main.py | 48 ++++++++++--- .../static/src/js/slides_like.js | 71 ++++++++++--------- .../static/src/scss/website_slides.scss | 2 +- .../views/website_slides_templates.xml | 16 ++--- 4 files changed, 81 insertions(+), 56 deletions(-) diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index f04a61c4903..6a3e52727dc 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -35,6 +35,28 @@ class WebsiteSlides(http.Controller): request.session[slide_key] = viewed_slides return True + def _check_session_slide_vote(self, slide, upvote=True): + if not request.session.get('__wslides_upvote'): + request.session['__wslides_upvote'] = [] + if not request.session.get('__wslides_downvote'): + request.session['__wslides_downvote'] = [] + if upvote and slide.id in request.session['__wslides_upvote']: + return False + if not upvote and slide.id in request.session['__wslides_downvote']: + return False + if upvote and slide.id in request.session['__wslides_downvote']: + request.session['__wslides_downvote'].remove(slide.id) + return 0 + if not upvote and slide.id in request.session['__wslides_upvote']: + request.session['__wslides_upvote'].remove(slide.id) + return 0 + if upvote: + request.session['__wslides_upvote'].append(slide.id) + return 1 + if not upvote: + request.session['__wslides_downvote'].append(slide.id) + return -1 + def _get_slide_detail(self, slide): most_viewed_slides = slide.get_most_viewed_slides(self._slides_per_list) related_slides = slide.get_related_slides(self._slides_per_list) @@ -209,16 +231,24 @@ class WebsiteSlides(http.Controller): # JSONRPC @http.route('/slides/slide/like', type='json', auth="user", website=True) - def slide_like(self, slide_id): + def slide_like(self, slide_id, upvote): + if request.website.is_public_user(): + return {'error': 'public_user'} slide = request.env['slide.slide'].browse(int(slide_id)) - slide.likes += 1 - return slide.likes - - @http.route('/slides/slide/dislike', type='json', auth="user", website=True) - def slide_dislike(self, slide_id): - slide = request.env['slide.slide'].browse(int(slide_id)) - slide.dislikes += 1 - return slide.dislikes + slide.check_access_rights('read') + slide.check_access_rule('read') + check = self._check_session_slide_vote(slide, upvote=upvote) + if check is False: + return {'error': 'vote_done'} + if check == 1: + slide.sudo().likes += 1 + elif check == 0 and upvote: + slide.sudo().dislikes -= 1 + elif check == 0 and not upvote: + slide.sudo().likes -= 1 + else: + slide.sudo().dislikes += 1 + return {'state': check, 'likes': slide.likes, 'dislikes': slide.dislikes} @http.route(['/slides/slide/send_share_email'], type='json', auth='user', website=True) def slide_send_share_email(self, slide_id, email): diff --git a/addons/website_slides/static/src/js/slides_like.js b/addons/website_slides/static/src/js/slides_like.js index e5ad9e22d7b..c32f484a713 100644 --- a/addons/website_slides/static/src/js/slides_like.js +++ b/addons/website_slides/static/src/js/slides_like.js @@ -11,42 +11,14 @@ var _t = core._t; var LikeButton = Widget.extend({ events: { - 'click': '_onClick', + 'click .o_wslides_like_up': '_onClickUp', + 'click .o_wslides_like_down': '_onClickDown', }, //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- - /** - * @private - * @param {Object} ev - */ - _applyAction: function (ev) { - var button = $(ev.currentTarget); - var slideID = button.data('slide-id'); - var userID = button.data('user-id'); - var isPublic = button.data('public-user'); - var href = button.data('href'); - if (isPublic) { - this._popoverAlert(button, _.str.sprintf(_t('Please login to vote this slide'), (document.URL))); - } else { - var target = button.find('.fa'); - if (localStorage.getItem('slide_vote_' + slideID) !== userID.toString()) { - this._rpc({ - route: href, - params: { - slide_id: slideID, - }, - }).then(function (data) { - target.text(data); - localStorage.setItem('slide_vote_' + slideID, userID); - }); - } else { - this._popoverAlert(button, _t('You have already voted for this slide')); - } - } - }, /** * @private * @param {Object} $el @@ -71,8 +43,38 @@ var LikeButton = Widget.extend({ /** * @private */ - _onClick: function () { - this._applyAction(); + _onClick: function (slideId, voteType) { + var self = this; + this._rpc({ + route: '/slides/slide/like', + params: { + slide_id: slideId, + upvote: voteType === 'like', + }, + }).then(function (data) { + if (! data.error) { + self.$el.find('span.o_wslides_like_up span').text(data.likes); + self.$el.find('span.o_wslides_like_down span').text(data.dislikes); + } else { + if (data.error === 'public_user') { + self._popoverAlert(self.$el, _.str.sprintf(_t('Please login to vote this slide'), (document.URL))); + } else if (data.error === 'vote_done') { + self._popoverAlert(self.$el, _t('You have already voted for this slide')); + } else { + self._popoverAlert(self.$el, _t('Unknown error')); + } + } + }); + }, + + _onClickUp: function (event) { + var slideId = $(event.currentTarget).data('slide-id'); + return this._onClick(slideId, 'like'); + }, + + _onClickDown: function (event) { + var slideId = $(event.currentTarget).data('slide-id'); + return this._onClick(slideId, 'dislike'); }, }); @@ -83,10 +85,9 @@ sAnimations.registry.websiteSlidesLike = sAnimations.Class.extend({ * @override * @param {Object} parent */ - start: function (parent) { + start: function () { var defs = [this._super.apply(this, arguments)]; - defs.push(new LikeButton(this).attachTo($('.oe_slide_js_like'))); - defs.push(new LikeButton(this).attachTo($('.oe_slide_js_unlike'))); + defs.push(new LikeButton(this).attachTo($('.o_wslides_like'))); return $.when.apply($, defs); }, }); diff --git a/addons/website_slides/static/src/scss/website_slides.scss b/addons/website_slides/static/src/scss/website_slides.scss index 658d973a5a0..e39e803c877 100644 --- a/addons/website_slides/static/src/scss/website_slides.scss +++ b/addons/website_slides/static/src/scss/website_slides.scss @@ -84,7 +84,7 @@ img.oe_slides_promote_image { border-bottom: 1px solid $nav-tabs-border-color; } -.oe_slide_js_like, .oe_slide_js_unlike{ +.o_wslides_like_up, .o_wslides_like_down { cursor: pointer; color: $link-color; } diff --git a/addons/website_slides/views/website_slides_templates.xml b/addons/website_slides/views/website_slides_templates.xml index 393123f9e05..c2f34ebb6e0 100644 --- a/addons/website_slides/views/website_slides_templates.xml +++ b/addons/website_slides/views/website_slides_templates.xml @@ -436,28 +436,22 @@
-
+
- + - +