From 1894dc54148bd008ffd8ab29ce5cf6cb9c4afaea Mon Sep 17 00:00:00 2001 From: Patrick Hoste Date: Mon, 9 Sep 2019 12:18:50 +0000 Subject: [PATCH] [IMP] website_slides: allow to download slide content and additional resources PURPOSE Currently eLearning lacks feature of having downloadable resources on lessons. Indeed for example teachers would like to attach zip files or other resources linked to a given lesson. SPECIFICATIONS You can now allow the user to download the slide content for pdf and image slides. A new icon will be visible next to the fullscreen button on the pdf viewer. Course maintainers can also add additional resources to a slide which will be available to download for the user. Task ID 2066741 PR #39890 Signed-off-by: Thibault Delavallee (tde) --- .../views/website_slides_templates.xml | 35 +++++++++++++++++++ .../website_slides/data/slide_slide_demo.xml | 18 ++++++++++ addons/website_slides/models/slide_slide.py | 21 ++++++++++- .../security/ir.model.access.csv | 5 ++- .../security/website_slides_security.xml | 12 +++++++ .../src/js/slides_course_fullscreen_player.js | 1 + .../views/slide_slide_views.xml | 16 ++++++--- .../views/website_slides_templates_lesson.xml | 28 ++++++++++++++- .../website_slides_templates_lesson_embed.xml | 9 ++++- ...ite_slides_templates_lesson_fullscreen.xml | 15 +++++++- .../views/website_slides_templates_utils.xml | 7 ++++ 11 files changed, 158 insertions(+), 9 deletions(-) diff --git a/addons/website_sale_slides/views/website_slides_templates.xml b/addons/website_sale_slides/views/website_slides_templates.xml index ec51520fd3d..abeb0ec227d 100644 --- a/addons/website_sale_slides/views/website_slides_templates.xml +++ b/addons/website_sale_slides/views/website_slides_templates.xml @@ -79,4 +79,39 @@ + + + + + + + + diff --git a/addons/website_slides/data/slide_slide_demo.xml b/addons/website_slides/data/slide_slide_demo.xml index d5925fe69f9..5c8d20cf1f7 100644 --- a/addons/website_slides/data/slide_slide_demo.xml +++ b/addons/website_slides/data/slide_slide_demo.xml @@ -18,6 +18,12 @@ A summary of know-how: how and what. All the basics for this course about gardening. + + + Document + + + Home Gardening 2 @@ -191,6 +197,12 @@ http://www.example.com + + + Presentation + + + How to plant a potted tree 5 @@ -392,6 +404,12 @@ http://www.example.com + + + Tree image + + + Do you make beams out of lemon trees ? diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index e64a7ecf363..917371b0b29 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -63,6 +63,15 @@ class SlideLink(models.Model): link = fields.Char('Link', required=True) +class SlideResource(models.Model): + _name = 'slide.slide.resource' + _description = "Additional resource for a particular slide" + + slide_id = fields.Many2one('slide.slide', required=True, ondelete='cascade') + name = fields.Char('Name', required=True) + data = fields.Binary('Resource') + + class EmbeddedSlide(models.Model): """ Embedding in third party websites. Track view count, generate statistics. """ _name = 'slide.embed' @@ -160,6 +169,8 @@ class Slide(models.Model): url = fields.Char('Document URL', help="Youtube or Google Document URL") document_id = fields.Char('Document ID', help="Youtube or Google Document ID") link_ids = fields.One2many('slide.slide.link', 'slide_id', string="External URL for this slide") + slide_resource_ids = fields.One2many('slide.slide.resource', 'slide_id', string="Additional Resource for this slide") + slide_resource_downloadable = fields.Boolean('Allow Download', default=False, help="Allow the user to download the content of the slide.") mime_type = fields.Char('Mime-type') html_content = fields.Html("HTML Content", help="Custom HTML content for slides of type 'Web Page'.", translate=True) # website @@ -347,12 +358,20 @@ class Slide(models.Model): @api.onchange('datas') def _on_change_datas(self): - """ For PDFs, we assume that it takes 5 minutes to read a page. """ + """ For PDFs, we assume that it takes 5 minutes to read a page. + If the selected file is not a PDF, it is an image (You can + only upload PDF or Image file) then the slide_type is changed + into infographic and the uploaded dataS is transfered to the + image field. (It avoids the infinite loading in PDF viewer)""" if self.datas: data = base64.b64decode(self.datas) if data.startswith(b'%PDF-'): pdf = PyPDF2.PdfFileReader(io.BytesIO(data), overwriteWarnings=False) self.completion_time = (5 * len(pdf.pages)) / 60 + else: + self.slide_type = 'infographic' + self.image_1920 = self.datas + self.datas = None @api.depends('name', 'channel_id.website_id.domain') def _compute_website_url(self): diff --git a/addons/website_slides/security/ir.model.access.csv b/addons/website_slides/security/ir.model.access.csv index b6d1a76ce44..43f14a23bbf 100644 --- a/addons/website_slides/security/ir.model.access.csv +++ b/addons/website_slides/security/ir.model.access.csv @@ -22,4 +22,7 @@ access_slide_channel_partners_system,slide.channel.users.system,model_slide_chan access_slide_embed_all,slide.embed.all,model_slide_embed,,1,0,0,0 access_slide_embed_user,slide.embed.user,model_slide_embed,base.group_user,1,1,1,1 access_slide_slide_link_all,slide.slide.link.all,model_slide_slide_link,,1,0,0,0 -access_slide_slide_link_officer,slide.slide.link.officer,model_slide_slide_link,website_slides.group_website_slides_officer,1,1,1,1 \ No newline at end of file +access_slide_slide_link_officer,slide.slide.link.officer,model_slide_slide_link,website_slides.group_website_slides_officer,1,1,1,1 +access_slide_slide_resource_all,slide.slide.resource.all,model_slide_slide_resource,,1,0,0,0 +access_slide_slide_resource_public,slide.slide.resource.public,model_slide_slide_resource,base.group_public,0,0,0,0 +access_slide_slide_resource_publisher,slide.slide.resource.publisher,model_slide_slide_resource,website_slides.group_website_slides_officer,1,1,1,1 diff --git a/addons/website_slides/security/website_slides_security.xml b/addons/website_slides/security/website_slides_security.xml index a6a347dd85f..bcfd70f0682 100644 --- a/addons/website_slides/security/website_slides_security.xml +++ b/addons/website_slides/security/website_slides_security.xml @@ -155,5 +155,17 @@ + + + + Resource: restricted to channel members and channel responsible + + [('slide_id.channel_id.partner_ids', '=', user.partner_id.id)] + + + + + + \ No newline at end of file diff --git a/addons/website_slides/static/src/js/slides_course_fullscreen_player.js b/addons/website_slides/static/src/js/slides_course_fullscreen_player.js index 00490ed9a0a..ef317465bbc 100644 --- a/addons/website_slides/static/src/js/slides_course_fullscreen_player.js +++ b/addons/website_slides/static/src/js/slides_course_fullscreen_player.js @@ -15,6 +15,7 @@ odoo.define('website_slides.fullscreen', function (require) { var Dialog = require('web.Dialog'); + require('website_slides.course.join.widget'); /** * Helper: Get the slide dict matching the given criteria diff --git a/addons/website_slides/views/slide_slide_views.xml b/addons/website_slides/views/slide_slide_views.xml index 10fd9f7d3ad..0301710e345 100644 --- a/addons/website_slides/views/slide_slide_views.xml +++ b/addons/website_slides/views/slide_slide_views.xml @@ -75,13 +75,13 @@ - - @@ -89,8 +89,8 @@ - - + + @@ -98,6 +98,14 @@ + + + + + + + + diff --git a/addons/website_slides/views/website_slides_templates_lesson.xml b/addons/website_slides/views/website_slides_templates_lesson.xml index 71457ea0bb1..35d104c1589 100644 --- a/addons/website_slides/views/website_slides_templates_lesson.xml +++ b/addons/website_slides/views/website_slides_templates_lesson.xml @@ -162,7 +162,7 @@ -