diff --git a/addons/website_forum/models/forum.py b/addons/website_forum/models/forum.py
index 4dc172a90a0..03b45d6bf17 100644
--- a/addons/website_forum/models/forum.py
+++ b/addons/website_forum/models/forum.py
@@ -580,7 +580,7 @@ class Post(models.Model):
@api.one
def refuse(self):
if not self.can_moderate:
- raise KarmaError('Not enough karma to refuse a post')
+ raise KarmaError(_('Not enough karma to refuse a post'))
self.moderator_id = self.env.user
return True
@@ -799,7 +799,7 @@ class Post(models.Model):
self.ensure_one()
if not self.can_comment:
- raise KarmaError('Not enough karma to comment')
+ raise KarmaError(_('Not enough karma to comment'))
if not kwargs.get('record_name') and self.parent_id:
kwargs['record_name'] = self.parent_id.name
return super(Post, self).message_post(message_type=message_type, **kwargs)
diff --git a/addons/website_rating/static/src/js/website_mail.js b/addons/website_rating/static/src/js/website_mail.js
index 6fd9a305e95..832a2d60e00 100644
--- a/addons/website_rating/static/src/js/website_mail.js
+++ b/addons/website_rating/static/src/js/website_mail.js
@@ -301,7 +301,7 @@ odoo.define('website_rating.thread', function(require) {
'res_model': false,
'res_id': false,
'pid': 0,
- 'display_composer': !session.is_website_user,
+ 'display_composer': options['disable_composer'] ? false : !session.is_website_user,
'display_rating': true,
'csrf_token': odoo.csrf_token,
'user_id': session.user_id,
diff --git a/addons/website_rating/views/website_rating_templates.xml b/addons/website_rating/views/website_rating_templates.xml
index 8ce20495b32..c5893a7944e 100644
--- a/addons/website_rating/views/website_rating_templates.xml
+++ b/addons/website_rating/views/website_rating_templates.xml
@@ -61,7 +61,8 @@
t-att-data-default_message="default_message"
t-att-data-default_message_id="default_message_id"
t-att-data-default_rating_value="default_rating_value"
- t-att-data-force_submit_url="force_submit_url">
+ t-att-data-force_submit_url="force_submit_url"
+ t-att-data-disable_composer="disable_composer">
diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py
index c876881497b..83934343402 100644
--- a/addons/website_slides/controllers/main.py
+++ b/addons/website_slides/controllers/main.py
@@ -382,12 +382,15 @@ class WebsiteSlides(WebsiteProfile):
], order='write_date DESC', limit=1).read(['body', 'rating_value'])
last_message_data = last_message_values[0] if last_message_values else {}
values.update({
- 'message_post_hash': channel._sign_token(request.env.user.partner_id.id),
- 'message_post_pid': request.env.user.partner_id.id,
'last_message_id': last_message_data.get('id'),
'last_message': tools.html2plaintext(last_message_data.get('body', '')),
'last_rating_value': last_message_data.get('rating_value'),
})
+ if channel.can_review:
+ values.update({
+ 'message_post_hash': channel._sign_token(request.env.user.partner_id.id),
+ 'message_post_pid': request.env.user.partner_id.id,
+ })
# fetch slides and handle uncategorized slides; done as sudo because we want to display all
# of them but unreachable ones won't be clickable (+ slide controller will crash anyway)
@@ -574,6 +577,10 @@ class WebsiteSlides(WebsiteProfile):
if (upvote and slide_partners.vote == 1) or (not upvote and slide_partners.vote == -1):
return {'error': 'vote_done'}
slide = request.env['slide.slide'].browse(int(slide_id))
+ if not slide.channel_id.allow_comment:
+ return {'error': 'comment_disabled'}
+ if not slide.can_vote:
+ return {'error': 'missing_karma'}
if upvote:
slide.action_like()
else:
diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py
index 941477e69b2..cd7565bd41a 100644
--- a/addons/website_slides/models/slide_channel.py
+++ b/addons/website_slides/models/slide_channel.py
@@ -6,6 +6,7 @@ import uuid
from odoo import api, fields, models, tools, _
from odoo.addons.http_routing.models.ir_http import slug
+from odoo.addons.gamification.models.gamification_karma_rank import KarmaError
from odoo.exceptions import UserError
from odoo.osv import expression
@@ -114,7 +115,7 @@ class Channel(models.Model):
total_time = fields.Float('# Hours', compute='_compute_slides_statistics', digits=(10, 4), store=True)
# configuration
allow_comment = fields.Boolean(
- "Allow comment on Content", default=False,
+ "Allow rating on Course", default=False,
help="If checked it allows members to either:\n"
" * like content and post comments on documentation course;\n"
" * post comment and review on training course;")
@@ -155,7 +156,11 @@ class Channel(models.Model):
karma_gen_slide_vote = fields.Integer(string='Lesson voted', default=1)
karma_gen_channel_rank = fields.Integer(string='Course ranked', default=5)
karma_gen_channel_finish = fields.Integer(string='Course finished', default=10)
- # TODO DBE : Add karma based action rules (like in forum)
+ # Karma based actions
+ karma_review = fields.Integer('Add a review', default=10, help="Karma needed to add a review on the course")
+ karma_slide_comment = fields.Integer('Add a comment', default=3, help="Karma needed to add a comment on a slide of this course")
+ karma_slide_vote = fields.Integer('Vote on slide', default=3, help="Karma needed to like/dislike a slide of this course.")
+ can_review = fields.Boolean('Can Review', compute='_compute_karma_rights')
@api.depends('slide_ids.is_published')
def _compute_slide_last_update(self):
@@ -263,6 +268,11 @@ class Channel(models.Model):
if channel.id: # avoid to perform a slug on a not yet saved record in case of an onchange.
channel.website_url = '%s/slides/%s' % (base_url, slug(channel))
+ @api.multi
+ def _compute_karma_rights(self):
+ for channel in self:
+ channel.can_review = self.env.user.karma >= channel.karma_review
+
# ---------------------------------------------------------
# ORM Overrides
# ---------------------------------------------------------
@@ -318,6 +328,8 @@ class Channel(models.Model):
through the 'Presentation Published' email, it should be considered as a
note as we don't want all channel followers to be notified of this answer. """
self.ensure_one()
+ if kwargs.get('message_type') == 'comment' and not self.can_review:
+ raise KarmaError(_('Not enough karma to review'))
if parent_id:
parent_message = self.env['mail.message'].sudo().browse(parent_id)
if parent_message.subtype_id and parent_message.subtype_id == self.env.ref('website_slides.mt_channel_slide_published'):
diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py
index 2b4a13eefc1..a4a96001673 100644
--- a/addons/website_slides/models/slide_slide.py
+++ b/addons/website_slides/models/slide_slide.py
@@ -13,6 +13,7 @@ from werkzeug import urls
from odoo import api, fields, models, _
from odoo.addons.http_routing.models.ir_http import slug
+from odoo.addons.gamification.models.gamification_karma_rank import KarmaError
from odoo.exceptions import Warning, UserError
from odoo.http import request
from odoo.addons.http_routing.models.ir_http import url_for
@@ -155,6 +156,9 @@ class Slide(models.Model):
slide_views = fields.Integer('# of Website Views', store=True, compute="_compute_slide_views")
public_views = fields.Integer('# of Public Views')
total_views = fields.Integer("Total # Views", default="0", compute='_compute_total', store=True)
+ # Karma Based action
+ can_comment = fields.Boolean('Can Comment', compute='_compute_karma_rights')
+ can_vote = fields.Boolean('Can Vote', compute='_compute_karma_rights')
_sql_constraints = [
('exclusion_html_content_and_url', "CHECK(html_content IS NULL OR url IS NULL)", "A slide is either filled with a document url or HTML content. Not both.")
@@ -267,6 +271,12 @@ class Slide(models.Model):
def _get_can_publish_error_message(self):
return _("Publishing is restricted to the responsible of training courses or members of the publisher group for documentation courses")
+ @api.multi
+ def _compute_karma_rights(self):
+ for slide in self:
+ slide.can_comment = self.env.user.karma >= slide.channel_id.karma_slide_comment
+ slide.can_vote = self.env.user.karma >= slide.channel_id.karma_slide_vote
+
# ---------------------------------------------------------
# ORM Overrides
# ---------------------------------------------------------
@@ -313,6 +323,14 @@ class Slide(models.Model):
# Mail/Rating
# ---------------------------------------------------------
+ @api.multi
+ @api.returns('mail.message', lambda value: value.id)
+ def message_post(self, message_type='notification', **kwargs):
+ self.ensure_one()
+ if message_type == 'comment' and not self.can_comment: # user comments have a restriction on karma
+ raise KarmaError(_('Not enough karma to comment'))
+ return super(Slide, self).message_post(message_type=message_type, **kwargs)
+
@api.multi
def get_access_action(self, access_uid=None):
""" Instead of the classic form view, redirect to website if it is published. """
diff --git a/addons/website_slides/static/src/js/slides_slide_like.js b/addons/website_slides/static/src/js/slides_slide_like.js
index d5afc5c4409..bb0542a5f7e 100644
--- a/addons/website_slides/static/src/js/slides_slide_like.js
+++ b/addons/website_slides/static/src/js/slides_slide_like.js
@@ -59,6 +59,10 @@ var SlideLikeWidget = Widget.extend({
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 if (data.error === 'comment_disabled') {
+ self._popoverAlert(self.$el, _t('Votes and comments are disabled for this channel'));
+ } else if (data.error === 'missing_karma') {
+ self._popoverAlert(self.$el, _t('You don\'t have enough karma to vote'));
} else {
self._popoverAlert(self.$el, _t('Unknown error'));
}
diff --git a/addons/website_slides/views/slide_channel_views.xml b/addons/website_slides/views/slide_channel_views.xml
index e85097bdd8b..541492f5ff3 100644
--- a/addons/website_slides/views/slide_channel_views.xml
+++ b/addons/website_slides/views/slide_channel_views.xml
@@ -111,6 +111,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/website_slides/views/website_slides_templates_course.xml b/addons/website_slides/views/website_slides_templates_course.xml
index ccc215ebf4f..e3a6583ca8b 100644
--- a/addons/website_slides/views/website_slides_templates_course.xml
+++ b/addons/website_slides/views/website_slides_templates_course.xml
@@ -104,6 +104,7 @@
+
@@ -115,7 +116,7 @@
Course
-
+
Review
diff --git a/addons/website_slides/views/website_slides_templates_lesson.xml b/addons/website_slides/views/website_slides_templates_lesson.xml
index 225d3ecdc48..c589092aaa4 100644
--- a/addons/website_slides/views/website_slides_templates_lesson.xml
+++ b/addons/website_slides/views/website_slides_templates_lesson.xml
@@ -237,19 +237,21 @@
- Rating
-
-
-
-
-
-
-
-
-
-
+
+ Rating
+
-
+
@@ -287,8 +289,7 @@
-
-
+