From 63285ce0261904e11ade679bc8e39462ae083b3a Mon Sep 17 00:00:00 2001 From: Thomas Josse Date: Fri, 22 Oct 2021 06:51:54 +0000 Subject: [PATCH] [ADD] website_slides: merging slide.slide.link into resource Purpose ======= This commit is used to merge 2 models into 1: `slide.slide.resource` and `slide.slide.link` Specifications ============== These models are merged in order to create a unique table for the *Additional Resources* of a Content. In order to do that, we merged the models into `slide.slide.resource` that will contain either a link or a file. task-2597345 See odoo/enterprise#20480 See odoo/upgrade#2784 Part-of: odoo/odoo#75646 --- .../website_slides/data/slide_slide_demo.xml | 27 +++++++--- addons/website_slides/models/__init__.py | 1 + addons/website_slides/models/slide_slide.py | 20 ------- .../models/slide_slide_resource.py | 50 +++++++++++++++++ .../security/ir.model.access.csv | 2 - .../security/website_slides_security.xml | 11 ++++ addons/website_slides/tests/__init__.py | 1 + addons/website_slides/tests/test_resources.py | 53 +++++++++++++++++++ .../views/slide_slide_views.xml | 2 +- .../views/website_slides_templates_lesson.xml | 18 ++++--- ...ite_slides_templates_lesson_fullscreen.xml | 12 +++-- 11 files changed, 153 insertions(+), 44 deletions(-) create mode 100644 addons/website_slides/models/slide_slide_resource.py create mode 100644 addons/website_slides/tests/test_resources.py diff --git a/addons/website_slides/data/slide_slide_demo.xml b/addons/website_slides/data/slide_slide_demo.xml index 9926f174e07..7817d5db91c 100644 --- a/addons/website_slides/data/slide_slide_demo.xml +++ b/addons/website_slides/data/slide_slide_demo.xml @@ -20,6 +20,7 @@ + file Document @@ -186,18 +187,21 @@ Just some basics Energy Efficiency Facts. - + + url Energy Efficient Link 1 http://www.example.com - + + url Energy Efficient Link 2 http://www.example.com + file Presentation @@ -263,12 +267,14 @@ We had a little chat with Harry Potted, sure he had interesting things to say ! - + + url Know More Link 1 http://www.example.com - + + url Know More Link 2 http://www.example.com @@ -389,18 +395,21 @@ A summary of know-how: what are the main trees categories and how to differentiate them. - + + url Trees Classification Link http://www.example.com - + + url Main types of trees Link http://www.example.com + file Tree image @@ -742,12 +751,14 @@ Tools you will need to complete this course. - + + url Example Link 1 http://www.example.com - + + url Example Link 2 http://www.example.com diff --git a/addons/website_slides/models/__init__.py b/addons/website_slides/models/__init__.py index 6d256bb8eb6..7b958fbdc78 100644 --- a/addons/website_slides/models/__init__.py +++ b/addons/website_slides/models/__init__.py @@ -7,6 +7,7 @@ from . import slide_slide from . import slide_question from . import slide_channel from . import slide_channel_tag +from . import slide_slide_resource from . import res_config_settings from . import website from . import res_users diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index a91a978021f..c19ba8bf62b 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -55,25 +55,6 @@ class SlidePartnerRelation(models.Model): ('partner_id', 'in', self.partner_id.ids), ])._recompute_completion() - -class SlideLink(models.Model): - _name = 'slide.slide.link' - _description = "External URL for a particular slide" - - slide_id = fields.Many2one('slide.slide', required=True, ondelete='cascade') - name = fields.Char('Title', required=True) - 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' @@ -173,7 +154,6 @@ class Slide(models.Model): datas = fields.Binary('File', attachment=True) 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=True, help="Allow the user to download the content of the slide.") mime_type = fields.Char('Mime-type') diff --git a/addons/website_slides/models/slide_slide_resource.py b/addons/website_slides/models/slide_slide_resource.py new file mode 100644 index 00000000000..13eed97618b --- /dev/null +++ b/addons/website_slides/models/slide_slide_resource.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError + + +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') + resource_type = fields.Selection([('file', 'File'), ('url', 'Link')], required=True) + name = fields.Char('Name', compute="_compute_name", readonly=False, store=True) + data = fields.Binary('Resource', compute='_compute_reset_resources', store=True, readonly=False) + file_name = fields.Char(store=True) + link = fields.Char('Link', compute='_compute_reset_resources', store=True, readonly=False) + + _sql_constraints = [ + ('check_url', "CHECK (resource_type != 'url' OR link IS NOT NULL)", 'A resource of type url must contain a link.'), + ('check_file_type', "CHECK (resource_type != 'file' OR link IS NULL)", 'A resource of type file cannot contain a link.'), + ] + + @api.depends('resource_type') + def _compute_reset_resources(self): + for resource in self: + if resource.resource_type == 'file': + resource.link = False + resource.data = resource.data + else: + resource.data = False + resource.link = resource.link + + @api.depends('file_name', 'resource_type', 'data', 'link') + def _compute_name(self): + for resource in self: + to_update = not resource.name or resource.name == _("Resource") + if to_update: + new_name = _("Resource") + if resource.resource_type == 'file' and (resource.data or resource.file_name): + new_name = self.file_name + elif resource.resource_type == 'url': + new_name = self.link + resource.name = new_name + + @api.constrains('data') + def _check_link_type(self): + for record in self: + if record.resource_type != 'file' and record.data: + raise ValidationError(_("Resource %(resource_name)s is a link and should not contain a data file", resource_name=record.name)) diff --git a/addons/website_slides/security/ir.model.access.csv b/addons/website_slides/security/ir.model.access.csv index 355ebc5ade4..0336e1bf8b2 100644 --- a/addons/website_slides/security/ir.model.access.csv +++ b/addons/website_slides/security/ir.model.access.csv @@ -21,8 +21,6 @@ access_slide_channel_partners_all,slide.channel.users.all,model_slide_channel_pa access_slide_channel_partners_system,slide.channel.users.system,model_slide_channel_partner,website_slides.group_website_slides_officer,1,1,1,1 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 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 f8689d090ce..5964c06984f 100644 --- a/addons/website_slides/security/website_slides_security.xml +++ b/addons/website_slides/security/website_slides_security.xml @@ -198,5 +198,16 @@ + + + Resource: manager: crud all + + [(1, '=', 1)] + + + + + + diff --git a/addons/website_slides/tests/__init__.py b/addons/website_slides/tests/__init__.py index ec3a0a5f741..9b7fc83ac65 100644 --- a/addons/website_slides/tests/__init__.py +++ b/addons/website_slides/tests/__init__.py @@ -3,6 +3,7 @@ from . import common from . import test_karma +from . import test_resources from . import test_security from . import test_slide_utils from . import test_statistics diff --git a/addons/website_slides/tests/test_resources.py b/addons/website_slides/tests/test_resources.py new file mode 100644 index 00000000000..561a3a6d3aa --- /dev/null +++ b/addons/website_slides/tests/test_resources.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from psycopg2 import IntegrityError + +from odoo.addons.website_slides.tests import common +from odoo.exceptions import ValidationError +from odoo.tests.common import users +from odoo.tools import mute_logger + + +class TestResources(common.SlidesCase): + + @users('user_officer') + @mute_logger('odoo') + def test_constraints(self): + self.link = self.env["slide.slide.resource"].create({ + 'name': 'Test Link', + 'resource_type': 'url', + 'link': 'https://www.example.com', + 'slide_id': self.slide.id, + }) + + self.resource = self.env["slide.slide.resource"].create({ + 'name': 'Test Resource', + 'resource_type': 'file', + 'data': '1111', + 'slide_id': self.slide.id, + }) + + self.assertEqual(len(self.slide.slide_resource_ids), 2) + with self.assertRaises(ValidationError, msg="Cannot have a type link with a file"): + self.env["slide.slide.resource"].create({ + 'name': 'Raise Error Test Resource', + 'resource_type': 'url', + 'link': '1111', + 'data': '1111', + 'slide_id': self.slide.id, + }) + self.assertEqual(len(self.slide.slide_resource_ids), 2) + with self.assertRaises(IntegrityError, msg="Cannot have a type file with a link"): + self.env["slide.slide.resource"].create({ + 'name': 'Raise Error Test File With Link', + 'resource_type': 'file', + 'link': '1111', + 'slide_id': self.slide.id, + }) + with self.assertRaises(IntegrityError, msg="Cannot have an empty link"): + self.env["slide.slide.resource"].create({ + 'name': 'Raise Error Test Empty URL', + 'resource_type': 'url', + 'slide_id': self.slide.id, + }) diff --git a/addons/website_slides/views/slide_slide_views.xml b/addons/website_slides/views/slide_slide_views.xml index a45e4100518..d9ed6f72ffa 100644 --- a/addons/website_slides/views/slide_slide_views.xml +++ b/addons/website_slides/views/slide_slide_views.xml @@ -139,7 +139,7 @@ - + -