diff --git a/addons/website_slides/__init__.py b/addons/website_slides/__init__.py index 7d34c7c054a..88710707227 100644 --- a/addons/website_slides/__init__.py +++ b/addons/website_slides/__init__.py @@ -3,3 +3,4 @@ from . import controllers from . import models +from . import wizard diff --git a/addons/website_slides/__manifest__.py b/addons/website_slides/__manifest__.py index 32b4f407e67..a5df3cf0cef 100644 --- a/addons/website_slides/__manifest__.py +++ b/addons/website_slides/__manifest__.py @@ -25,16 +25,18 @@ Share and Publish Videos, Presentations and Documents' 'data': [ 'views/assets.xml', 'views/res_config_settings_views.xml', - 'views/website_slides_templates_homepage.xml', - 'views/website_slides_templates.xml', - 'views/website_slides_embed_templates.xml', 'views/slide_slide_views.xml', 'views/slide_channel_partner_views.xml', 'views/slide_channel_views.xml', 'views/slide_channel_tag_views.xml', - 'views/slide_channel_invite_views.xml', 'views/website_slides_menu_views.xml', + 'views/website_slides_templates_homepage.xml', + 'views/website_slides_templates_course.xml', + 'views/website_slides_templates_lesson.xml', + 'views/website_slides_templates_lesson_embed.xml', 'views/website_slides_templates_profile.xml', + 'views/website_slides_templates_utils.xml', + 'wizard/slide_channel_invite_views.xml', 'data/ir_data.xml', 'data/gamification_data.xml', 'data/mail_data.xml', diff --git a/addons/website_slides/controllers/__init__.py b/addons/website_slides/controllers/__init__.py index acf000fd92c..5f151657861 100644 --- a/addons/website_slides/controllers/__init__.py +++ b/addons/website_slides/controllers/__init__.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. from . import mail from . import main diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index 50cea64c078..f0248462994 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -53,8 +53,8 @@ class WebsiteSlides(WebsiteProfile): return True 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) + most_viewed_slides = slide._get_most_viewed_slides(self._slides_per_list) + related_slides = slide._get_related_slides(self._slides_per_list) values = { 'slide': slide, 'most_viewed_slides': most_viewed_slides, @@ -521,7 +521,7 @@ class WebsiteSlides(WebsiteProfile): @http.route(['/slides/slide/send_share_email'], type='json', auth='user', website=True) def slide_send_share_email(self, slide_id, email): slide = request.env['slide.slide'].browse(int(slide_id)) - result = slide.send_share_email(email) + result = slide._send_share_email(email) return result # -------------------------------------------------- diff --git a/addons/website_slides/models/__init__.py b/addons/website_slides/models/__init__.py index 2768668e3e4..9a55188c7ae 100644 --- a/addons/website_slides/models/__init__.py +++ b/addons/website_slides/models/__init__.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. from . import gamification_challenge from . import slide_slide from . import slide_question from . import slide_channel from . import slide_channel_tag -from . import slide_channel_invite from . import res_config_settings from . import website from . import res_users diff --git a/addons/website_slides/models/slide_channel.py b/addons/website_slides/models/slide_channel.py index 766fde193a0..edb496a14e8 100644 --- a/addons/website_slides/models/slide_channel.py +++ b/addons/website_slides/models/slide_channel.py @@ -259,41 +259,6 @@ 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 action_redirect_to_members(self): - action = self.env.ref('website_slides.slide_channel_partner_action').read()[0] - action['view_mode'] = 'tree' - action['domain'] = [('channel_id', 'in', self.ids)] - if len(self) == 1: - action['context'] = {'default_channel_id': self.id} - - return action - - @api.multi - def action_channel_invite(self): - self.ensure_one() - - if self.enroll != 'invite': - raise UserError(_("You cannot send invitations for channels that are not set as 'invite'.")) - - template = self.env.ref('website_slides.mail_template_slide_channel_invite', raise_if_not_found=False) - - local_context = dict( - self.env.context, - default_channel_id=self.id, - default_use_template=bool(template), - default_template_id=template and template.id or False, - notif_layout='mail.mail_notification_light', - ) - return { - 'type': 'ir.actions.act_window', - 'view_type': 'form', - 'view_mode': 'form', - 'res_model': 'slide.channel.invite', - 'target': 'new', - 'context': local_context, - } - # --------------------------------------------------------- # ORM Overrides # --------------------------------------------------------- @@ -364,6 +329,41 @@ class Channel(models.Model): # Business / Actions # --------------------------------------------------------- + @api.multi + def action_redirect_to_members(self): + action = self.env.ref('website_slides.slide_channel_partner_action').read()[0] + action['view_mode'] = 'tree' + action['domain'] = [('channel_id', 'in', self.ids)] + if len(self) == 1: + action['context'] = {'default_channel_id': self.id} + + return action + + @api.multi + def action_channel_invite(self): + self.ensure_one() + + if self.visibility != 'invite': + raise UserError(_("You cannot send invitations for channels that are not set as 'invite'.")) + + template = self.env.ref('website_slides.mail_template_slide_channel_invite', raise_if_not_found=False) + + local_context = dict( + self.env.context, + default_channel_id=self.id, + default_use_template=bool(template), + default_template_id=template and template.id or False, + notif_layout='mail.mail_notification_light', + ) + return { + 'type': 'ir.actions.act_window', + 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'slide.channel.invite', + 'target': 'new', + 'context': local_context, + } + def action_add_member(self, **member_values): """ Adds the logged in user in the channel members. (see '_action_add_members' for more info) @@ -413,11 +413,6 @@ class Channel(models.Model): for channel in self: channel._action_add_members(channel.mapped('enroll_group_ids.users.partner_id')) - def list_all(self): - return { - 'channels': [{'id': channel.id, 'name': channel.name, 'website_url': channel.website_url} for channel in self.search([])] - } - # --------------------------------------------------------- # Rating Mixin API # --------------------------------------------------------- diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index fe022f83b31..24e043be6e3 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -77,17 +77,6 @@ class SlideTag(models.Model): class Slide(models.Model): - """ This model represents actual presentations. Those must be one of four - types: - - - Presentation - - Document - - Infographic - - Video - - Webpage - - Slide has various statistics like view count, embed count, like, dislikes """ - _name = 'slide.slide' _inherit = ['mail.thread', 'website.seo.metadata', 'website.published.mixin', 'rating.mixin'] _description = 'Slides' @@ -99,10 +88,6 @@ class Slide(models.Model): } _order = 'category_sequence asc, sequence asc' - _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.") - ] - def _default_access_token(self): return str(uuid.uuid4()) @@ -161,13 +146,17 @@ class Slide(models.Model): likes = fields.Integer('Likes', compute='_compute_user_info', store=True) dislikes = fields.Integer('Dislikes', compute='_compute_user_info', store=True) user_vote = fields.Integer('User vote', compute='_compute_user_info') - embed_code = fields.Text('Embed Code', readonly=True, compute='_get_embed_code') + embed_code = fields.Text('Embed Code', readonly=True, compute='_compute_embed_code') # views embedcount_ids = fields.One2many('slide.embed', 'slide_id', string="Embed Count") 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) + _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.") + ] + @api.depends('slide_views', 'public_views') def _compute_total(self): for record in self: @@ -216,7 +205,8 @@ class Slide(models.Model): self.env['slide.slide.partner'] ) - def _get_embed_code(self): + @api.depends('document_id', 'slide_type', 'mime_type') + def _compute_embed_code(self): base_url = request and request.httprequest.url_root or self.env['ir.config_parameter'].sudo().get_param('web.base.url') if base_url[-1] == '/': base_url = base_url[:-1] @@ -235,7 +225,7 @@ class Slide(models.Model): record.embed_code = False @api.onchange('url') - def on_change_url(self): + def _on_change_url(self): self.ensure_one() if self.url: res = self._parse_document_url(self.url) @@ -250,6 +240,7 @@ class Slide(models.Model): @api.multi @api.depends('name') def _compute_website_url(self): + # TDE FIXME: clena this link.tracker strange stuff super(Slide, self)._compute_website_url() base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for slide in self: @@ -321,6 +312,10 @@ class Slide(models.Model): self._post_publication() return res + # --------------------------------------------------------- + # Mail/Rating + # --------------------------------------------------------- + @api.multi def get_access_action(self, access_uid=None): """ Instead of the classic form view, redirect to website if it is published. """ @@ -335,10 +330,6 @@ class Slide(models.Model): } return super(Slide, self).get_access_action(access_uid) - # --------------------------------------------------------- - # Business Methods - # --------------------------------------------------------- - @api.multi def _notify_get_groups(self, message, groups): """ Add access button to everyone if the document is active. """ @@ -350,7 +341,12 @@ class Slide(models.Model): return groups - def get_related_slides(self, limit=20): + # --------------------------------------------------------- + # Business Methods + # --------------------------------------------------------- + + def _get_related_slides(self, limit=20): + # TDE FIXME: should build a smarter domain domain = request.website.website_domain() domain += [('website_published', '=', True), ('id', '!=', self.id)] if self.category_id: @@ -358,7 +354,8 @@ class Slide(models.Model): for record in self.search(domain, limit=limit): yield record - def get_most_viewed_slides(self, limit=20): + def _get_most_viewed_slides(self, limit=20): + # TDE FIXME: should build a smarter domain domain = request.website.website_domain() domain += [('website_published', '=', True), ('id', '!=', self.id)] for record in self.search(domain, limit=limit, order='total_views desc'): @@ -387,10 +384,13 @@ class Slide(models.Model): self.write({'access_token': self._default_access_token()}) return self._sign_token(partner_id) - @api.one - def send_share_email(self, email): + def _send_share_email(self, email): + # TDE FIXME: template to check + mail_ids = [] base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - return self.channel_id.share_template_id.with_context(email=email, base_url=base_url).send_mail(self.id, notif_layout='mail.mail_notification_light') + for record in self: + mail_ids.append(self.channel_id.share_template_id.with_context(email=email, base_url=base_url).send_mail(record.id, notif_layout='mail.mail_notification_light')) + return mail_ids def action_like(self): self.check_access_rights('read') diff --git a/addons/website_slides/views/website_slides_templates_course.xml b/addons/website_slides/views/website_slides_templates_course.xml new file mode 100644 index 00000000000..5df196a2e1b --- /dev/null +++ b/addons/website_slides/views/website_slides_templates_course.xml @@ -0,0 +1,420 @@ + + + + + + + + + + + + + diff --git a/addons/website_slides/views/website_slides_templates.xml b/addons/website_slides/views/website_slides_templates_lesson.xml similarity index 57% rename from addons/website_slides/views/website_slides_templates.xml rename to addons/website_slides/views/website_slides_templates_lesson.xml index 7f0bc0d9553..3b3600b6e47 100644 --- a/addons/website_slides/views/website_slides_templates.xml +++ b/addons/website_slides/views/website_slides_templates_lesson.xml @@ -1,454 +1,7 @@ - - - - - - - - - - - - - - - - - + - - - - - - - - - - - + diff --git a/addons/website_slides/views/website_slides_embed_templates.xml b/addons/website_slides/views/website_slides_templates_lesson_embed.xml similarity index 100% rename from addons/website_slides/views/website_slides_embed_templates.xml rename to addons/website_slides/views/website_slides_templates_lesson_embed.xml diff --git a/addons/website_slides/views/website_slides_templates_utils.xml b/addons/website_slides/views/website_slides_templates_utils.xml new file mode 100644 index 00000000000..57d5c2fced5 --- /dev/null +++ b/addons/website_slides/views/website_slides_templates_utils.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/addons/website_slides/wizard/__init__.py b/addons/website_slides/wizard/__init__.py new file mode 100644 index 00000000000..4020988908b --- /dev/null +++ b/addons/website_slides/wizard/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import slide_channel_invite diff --git a/addons/website_slides/models/slide_channel_invite.py b/addons/website_slides/wizard/slide_channel_invite.py similarity index 100% rename from addons/website_slides/models/slide_channel_invite.py rename to addons/website_slides/wizard/slide_channel_invite.py diff --git a/addons/website_slides/views/slide_channel_invite_views.xml b/addons/website_slides/wizard/slide_channel_invite_views.xml similarity index 100% rename from addons/website_slides/views/slide_channel_invite_views.xml rename to addons/website_slides/wizard/slide_channel_invite_views.xml