diff --git a/addons/website_slides_survey/controllers/main.py b/addons/website_slides_survey/controllers/main.py index cda54c29322..a0b4cf9b53c 100644 --- a/addons/website_slides_survey/controllers/main.py +++ b/addons/website_slides_survey/controllers/main.py @@ -1,13 +1,67 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import http +from odoo import http, _ from odoo.http import request +from odoo.exceptions import AccessError + +from odoo.addons.website_slides.controllers.main import WebsiteSlides -class WebsiteSlidesSurvey(http.Controller): +class WebsiteSlidesSurvey(WebsiteSlides): + @http.route(['/slides_survey/certification/search_read'], type='json', auth='user', methods=['POST'], website=True) def slides_certification_search_read(self, fields): + can_create = request.env['survey.survey'].check_access_rights('create', raise_exception=False) return { 'read_results': request.env['survey.survey'].search_read([('certification', '=', True)], fields), + 'can_create': can_create, } + + # ------------------------------------------------------------ + # Overrides + # ------------------------------------------------------------ + + @http.route(['/slides/add_slide'], type='json', auth='user', methods=['POST'], website=True) + def create_slide(self, *args, **post): + create_new_survey = post['slide_type'] == "certification" and post.get('survey') and not post['survey']['id'] + linked_survey_id = int(post.get('survey', {}).get('id') or 0) + + if create_new_survey: + # If user cannot create a new survey, no need to create the slide either. + if not request.env['survey.survey'].check_access_rights('create', raise_exception=False): + return {'error': _('You are not allowed to create a survey.')} + + # Create survey first as certification slide needs a survey_id (constraint) + post['survey_id'] = request.env['survey.survey'].create({ + 'title': post['survey']['title'], + 'background_image': post['image_1920'], + 'questions_layout': 'page_per_question', + 'is_attempts_limited': True, + 'attempts_limit': 1, + 'is_time_limited': False, + 'scoring_type': 'scoring_without_answers', + 'certification': True, + 'scoring_success_min': 70.0, + 'certification_mail_template_id': request.env.ref('survey.mail_template_certification').id, + }).id + elif linked_survey_id: + try: + request.env['survey.survey'].browse([linked_survey_id]).read(['title']) + except AccessError: + return {'error': _('You are not allowed to link a certification.')} + + post['survey_id'] = post['survey']['id'] + + # Then create the slide + result = super(WebsiteSlidesSurvey, self).create_slide(*args, **post) + + if create_new_survey: + # Set the redirect_url used in toaster + action_id = request.env.ref('survey.action_survey_form').id + result.update({ + 'redirect_url': '/web#id=%s&action=%s&model=survey.survey&view_type=form' % (post['survey_id'], action_id), + 'redirect_to_certification': True + }) + + return result diff --git a/addons/website_slides_survey/static/src/js/slides_certification_upload_toast.js b/addons/website_slides_survey/static/src/js/slides_certification_upload_toast.js new file mode 100644 index 00000000000..e258201bc79 --- /dev/null +++ b/addons/website_slides_survey/static/src/js/slides_certification_upload_toast.js @@ -0,0 +1,39 @@ +odoo.define('website_slides_survey.certification_upload_toast', function (require) { +'use strict'; + +var publicWidget = require('web.public.widget'); + +var sessionStorage = window.sessionStorage; +var core = require('web.core'); +var _t = core._t; + + +publicWidget.registry.CertificationUploadToast = publicWidget.Widget.extend({ + selector: '.o_wslides_survey_certification_upload_toast', + + /** + * @override + */ + start: function () { + var self = this; + this._super.apply(this, arguments).then(function () { + var url = sessionStorage.getItem("survey_certification_url"); + if (url) { + self.displayNotification({ + type: 'info', + title: _t('Certification created'), + message: _.str.sprintf( + _t('Follow this link to add questions to your certification. Edit certification'), + url + ), + sticky: true, + }); + sessionStorage.removeItem("survey_certification_url"); + } + }); + }, +}); + +return publicWidget.registry.CertificationUploadToast; + +}); diff --git a/addons/website_slides_survey/static/src/js/slides_upload.js b/addons/website_slides_survey/static/src/js/slides_upload.js index 817f80004c0..54dc18da723 100644 --- a/addons/website_slides_survey/static/src/js/slides_upload.js +++ b/addons/website_slides_survey/static/src/js/slides_upload.js @@ -3,12 +3,34 @@ odoo.define('website_slides_survey.upload_modal', function (require) { var core = require('web.core'); var _t = core._t; +var sessionStorage = window.sessionStorage; var SlidesUpload = require('website_slides.upload_modal'); /** * Management of the new 'certification' slide_type */ SlidesUpload.SlideUploadDialog.include({ + events: _.extend({}, SlidesUpload.SlideUploadDialog.prototype.events || {}, { + 'change input#certification_id': '_onChangeCertification' + }), + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * Will automatically set the title of the slide to the title of the chosen certification + */ + _onChangeCertification: function (ev) { + if (ev.added && ev.added.text) { + this.$("input#name").val(ev.added.text); + } + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + /** * Overridden to add the "certification" slide type * @@ -56,7 +78,7 @@ SlidesUpload.SlideUploadDialog.include({ var result = this._super.apply(this, arguments); var $certificationInput = this.$('#certification_id'); - if ($certificationInput.length !== 0){ + if ($certificationInput.length !== 0) { var $select2Container = $certificationInput .closest('.form-group') .find('.select2-container'); @@ -76,15 +98,38 @@ SlidesUpload.SlideUploadDialog.include({ * @override * @private */ - _getSelect2DropdownValues: function (){ + _getSelect2DropdownValues: function () { var result = this._super.apply(this, arguments); var certificateValue = this.$('#certification_id').select2('data'); + var survey = {}; if (certificateValue) { - result['survey_id'] = certificateValue.id; + if (certificateValue.create) { + survey.id = false; + survey.title = certificateValue.text; + } else { + survey.id = certificateValue.id; + } } + result['survey'] = survey; return result; - } + }, + + /** + * Overridde to handle certification created on-the-fly: toaster will hold + * survey edit url, need to put it in session to use it in CertificationUploadToast + * + * @override + * @private + */ + _onFormSubmitDone: function (data) { + if (!data.error && data.redirect_to_certification) { + sessionStorage.setItem("survey_certification_url", data.redirect_url); + window.location.reload(); + } else { + this._super.apply(this, arguments); + } + }, }); SlidesUpload.websiteSlidesUpload.include({ diff --git a/addons/website_slides_survey/static/src/xml/website_slide_upload.xml b/addons/website_slides_survey/static/src/xml/website_slide_upload.xml index 0b273a15b21..073a16277c3 100644 --- a/addons/website_slides_survey/static/src/xml/website_slide_upload.xml +++ b/addons/website_slides_survey/static/src/xml/website_slide_upload.xml @@ -3,33 +3,28 @@
-
- -
- +
+
+
+ + +
+
+ + +
+ +
-
- -
-
+ +
Content Preview
-
-
-
    -
  • -
    - -
    - -
  • -
-
-
- +
+
diff --git a/addons/website_slides_survey/views/assets.xml b/addons/website_slides_survey/views/assets.xml index 40eae653970..5b8fd3a0530 100644 --- a/addons/website_slides_survey/views/assets.xml +++ b/addons/website_slides_survey/views/assets.xml @@ -8,6 +8,7 @@