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 @@