summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqmo-odoo <qmo@odoo.com>2019-03-13 13:35:05 +0000
committerjem-odoo <jem@openerp.com>2019-03-15 20:38:58 +0000
commite8e8d7a956a9cc858c06673db62cb2eb9784c9df (patch)
tree9b174a445196d85abc8fb63eaafe33207292ce5f
parent44ae98d3ddbc4cf436e20539d7274e6bcba12e29 (diff)
[FIX] website_slides_survey: certification slide url
Before this commit, in fullscreen mode, clicking on the "pass certification" button would redirect the user to the "non-fullscreen" view. After this commit, the button directly redirects the user to the survey page. To avoid generating user_input of survey (test entry or not) for certification slides in fullscreen mode (table of content), we decided to create those user_input lazily: we redirect the user to a route that create (or reuse) the correct user_input. Task-1946511
-rw-r--r--addons/website_slides/controllers/main.py2
-rw-r--r--addons/website_slides_survey/controllers/slides.py63
-rw-r--r--addons/website_slides_survey/models/slide_slide.py52
-rw-r--r--addons/website_slides_survey/static/src/js/slides_course_fullscreen_player.js52
-rw-r--r--addons/website_slides_survey/static/src/scss/website_slides.scss9
-rw-r--r--addons/website_slides_survey/static/src/xml/website_slides_fullscreen.xml11
-rw-r--r--addons/website_slides_survey/views/assets.xml3
-rw-r--r--addons/website_slides_survey/views/website_slides_templates_lesson.xml20
-rw-r--r--addons/website_slides_survey/views/website_slides_templates_lesson_fullscreen.xml6
9 files changed, 113 insertions, 105 deletions
diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py
index 718d01be640..9a8a194a712 100644
--- a/addons/website_slides/controllers/main.py
+++ b/addons/website_slides/controllers/main.py
@@ -492,7 +492,7 @@ class WebsiteSlides(WebsiteProfile):
# sidebar: update with user channel progress
values['channel_progress'] = self._get_channel_progress(slide.channel_id, include_quiz=True)
- if 'fullscreen' in kwargs:
+ if kwargs.get('fullscreen') == '1':
return request.render("website_slides.slide_fullscreen", values)
else:
values['slide_access'] = slide.sudo(request.env.user)._get_slide_action_access()[slide.id]
diff --git a/addons/website_slides_survey/controllers/slides.py b/addons/website_slides_survey/controllers/slides.py
index a7dad0b175d..2442bc92e4b 100644
--- a/addons/website_slides_survey/controllers/slides.py
+++ b/addons/website_slides_survey/controllers/slides.py
@@ -2,54 +2,30 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import werkzeug
+import werkzeug.utils
+import werkzeug.exceptions
-from odoo.addons.website_slides.controllers.main import WebsiteSlides
from odoo import _
+from odoo import http
from odoo.http import request
+from odoo.addons.website_slides.controllers.main import WebsiteSlides
-class WebsiteSlides(WebsiteSlides):
-
- def _get_valid_slide_post_values(self):
- result = super(WebsiteSlides, self)._get_valid_slide_post_values()
- result.append('survey_id')
- return result
-
- def _get_slide_detail(self, slide):
- """ If the slide is a certification, we pass to the template additional information:
- - The certification url, built with the latest attempt (survey.user_input) token
- - A 'quizz_passed' boolean to know if we have to show the 'download certification' button
- - The 'survey_id' to be able to download the certification
- If the user is not a member of the channel, we give the opportunity to test the certification.
- The user still has to have the necessary rights, please check survey.survey._check_answer_creation
- for more info.
- This is used in the context of a website_publisher designing a course."""
- result = super(WebsiteSlides, self)._get_slide_detail(slide)
- if not request.env.user._is_public() and slide.slide_type == 'certification' and slide.survey_id:
- result['certification_test_entry'] = not slide.channel_id.is_member
- result['certification_done'] = False
- if slide.channel_id.is_member:
- user_membership_id_sudo = slide.user_membership_id.sudo()
- quizz_passed = user_membership_id_sudo.survey_quizz_passed
- result['certification_done'] = quizz_passed
- result['survey_id'] = slide.survey_id.id
- if not quizz_passed:
- last_user_input = next(user_input for user_input in user_membership_id_sudo.user_input_ids.sorted(
- lambda user_input: user_input.create_date, reverse=True
- ))
- result['certification_url'] = last_user_input._get_survey_url()
- else:
- user_input = slide.survey_id._create_answer(
- partner=request.env.user.partner_id,
- check_attempts=False,
- test_entry=True, **{
- 'slide_id': slide.id
- }
- )
- result['certification_url'] = user_input._get_survey_url()
+class WebsiteSlides(WebsiteSlides):
- return result
+ @http.route(['/slides_survey/slide/get_certification_url'], type='http', auth='user', website=True)
+ def slide_get_certification_url(self, slide_id, **kw):
+ fetch_res = self._fetch_slide(slide_id)
+ if fetch_res.get('error'):
+ raise werkzeug.exceptions.NotFound()
+ slide = fetch_res['slide']
+ if slide.channel_id.is_member:
+ slide.action_set_viewed()
+ certification_url = slide._generate_certification_url().get(slide.id)
+ if not certification_url:
+ raise werkzeug.exceptions.NotFound()
+ return werkzeug.utils.redirect(certification_url)
# Utils
# ---------------------------------------------------
@@ -58,6 +34,11 @@ class WebsiteSlides(WebsiteSlides):
raise werkzeug.exceptions.Forbidden(_("Certification slides are completed when the survey is succeeded."))
return super(WebsiteSlides, self)._set_completed_slide(slide, quiz_attempts_inc=quiz_attempts_inc)
+ def _get_valid_slide_post_values(self):
+ result = super(WebsiteSlides, self)._get_valid_slide_post_values()
+ result.append('survey_id')
+ return result
+
# Profile
# ---------------------------------------------------
def _prepare_user_slides_profile(self, user):
diff --git a/addons/website_slides_survey/models/slide_slide.py b/addons/website_slides_survey/models/slide_slide.py
index ef6122a4f40..da0598addc2 100644
--- a/addons/website_slides_survey/models/slide_slide.py
+++ b/addons/website_slides_survey/models/slide_slide.py
@@ -45,23 +45,41 @@ class Slide(models.Model):
('check_certification_preview', "CHECK(slide_type != 'certification' OR is_preview = False)", "A slide of type certification cannot be previewed."),
]
- def _action_set_viewed(self, target_partner, quiz_attempts_inc=False):
- """ If the slide viewed is a certification, we initialize the first survey.user_input
- for the current partner. """
- new_slide_partners = super(Slide, self)._action_set_viewed(target_partner, quiz_attempts_inc=quiz_attempts_inc)
- certification_slides = self.search([
- ('id', 'in', new_slide_partners.mapped('slide_id').ids),
- ('slide_type', '=', 'certification'),
- ('survey_id', '!=', False)
- ])
-
- for new_slide_partner in new_slide_partners:
- if new_slide_partner.slide_id in certification_slides and not new_slide_partner.user_input_ids:
- new_slide_partner.slide_id.survey_id._create_answer(
- partner=target_partner,
+ @api.multi
+ def _generate_certification_url(self):
+ """ get a map of certification url for certification slide from `self`. The url will come from the survey user input:
+ 1/ existing and not done user_input for member of the course
+ 2/ create a new user_input for member
+ 3/ for no member, a test user_input is created and the url is returned
+ Note: the slide.slides.partner should already exist
+ """
+ certification_urls = {}
+ for slide in self.filtered(lambda slide: slide.slide_type == 'certification' and slide.survey_id):
+ if slide.channel_id.is_member:
+ user_membership_id_sudo = slide.user_membership_id.sudo()
+ quizz_passed = user_membership_id_sudo.survey_quizz_passed
+ if not quizz_passed and user_membership_id_sudo.user_input_ids:
+ last_user_input = next(user_input for user_input in user_membership_id_sudo.user_input_ids.sorted(
+ lambda user_input: user_input.create_date, reverse=True
+ ))
+ certification_urls[slide.id] = last_user_input._get_survey_url()
+ elif not user_membership_id_sudo.user_input_ids:
+ user_input = slide.survey_id.sudo()._create_answer(
+ partner=self.env.user.partner_id,
+ check_attempts=False,
+ **{
+ 'slide_id': slide.id,
+ 'slide_partner_id': user_membership_id_sudo.id
+ }
+ )
+ certification_urls[slide.id] = user_input._get_survey_url()
+ else:
+ user_input = slide.survey_id.sudo()._create_answer(
+ partner=self.env.user.partner_id,
check_attempts=False,
- **{
- 'slide_id': new_slide_partner.slide_id.id,
- 'slide_partner_id': new_slide_partner.id
+ test_entry=True, **{
+ 'slide_id': slide.id
}
)
+ certification_urls[slide.id] = user_input._get_survey_url()
+ return certification_urls
diff --git a/addons/website_slides_survey/static/src/js/slides_course_fullscreen_player.js b/addons/website_slides_survey/static/src/js/slides_course_fullscreen_player.js
index 9fc8ffe3407..cf64b088d74 100644
--- a/addons/website_slides_survey/static/src/js/slides_course_fullscreen_player.js
+++ b/addons/website_slides_survey/static/src/js/slides_course_fullscreen_player.js
@@ -1,15 +1,39 @@
odoo.define('website_slides_survey.fullscreen', function (require) {
- "use strict";
-
- var core = require('web.core');
- var _t = core._t;
- var Fullscreen = require('website_slides.fullscreen');
-
- Fullscreen.include({
- xmlDependencies: (Fullscreen.prototype.xmlDependencies || []).concat(
- ["/website_slides_survey/static/src/xml/website_slides_fullscreen.xml"]
- ),
- });
-
- });
- \ No newline at end of file
+"use strict";
+
+var core = require('web.core');
+var QWeb = core.qweb;
+var Fullscreen = require('website_slides.fullscreen');
+
+Fullscreen.include({
+ xmlDependencies: (Fullscreen.prototype.xmlDependencies || []).concat(
+ ["/website_slides_survey/static/src/xml/website_slides_fullscreen.xml"]
+ ),
+ _preprocessSlideData: function (slidesDataList){
+ slidesDataList = this._super.apply(this, arguments);
+ slidesDataList.forEach(function (slideData, index){
+ if (slideData.type === "certification"){
+ slideData.certificationUrl = '/slides_survey/slide/get_certification_url?slide_id=' + slideData.id;
+ }
+ });
+ return slidesDataList;
+ },
+ /**
+ * Extend the _renderSlide method so that slides of type "certification"
+ * are also taken into account and rendered correctly
+ *
+ * @private
+ * @override
+ */
+ _renderSlide: function (){
+ var def = this._super.apply(this, arguments);
+ var $content = this.$('.o_wslides_fs_content');
+ if (this.get('slide').type === "certification"){
+ $content.html(QWeb.render('website.slides.fullscreen.certification',{widget: this}));
+ }
+ return $.when(def);
+ },
+});
+});
+
+
diff --git a/addons/website_slides_survey/static/src/scss/website_slides.scss b/addons/website_slides_survey/static/src/scss/website_slides.scss
deleted file mode 100644
index 84a24ede56f..00000000000
--- a/addons/website_slides_survey/static/src/scss/website_slides.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.o_wslides_fs_certification {
- display: flex;
- justify-content: center;
- align-items: center;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translateX(-50%) translateY(-50%);
-} \ No newline at end of file
diff --git a/addons/website_slides_survey/static/src/xml/website_slides_fullscreen.xml b/addons/website_slides_survey/static/src/xml/website_slides_fullscreen.xml
index e76839db82a..dab906f24eb 100644
--- a/addons/website_slides_survey/static/src/xml/website_slides_fullscreen.xml
+++ b/addons/website_slides_survey/static/src/xml/website_slides_fullscreen.xml
@@ -1,16 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates>
- <t t-extend="website.slides.fullscreen">
- <t t-jquery="t:last" t-operation="after">
- <div t-if="widget.get('slide').type === 'certification' &amp;&amp; !widget.get('slide').certificationDone" class="o_wslides_fs_certification">
+
+ <t t-name="website.slides.fullscreen.certification">
+ <div class="justify-content-center align-self-center">
+ <div t-if="widget.get('slide').type === 'certification' &amp;&amp; !widget.get('slide').completed" class="">
<a class="btn btn-primary" t-att-href="'/slides/slide/' + widget.get('slide').id" target="new"><i class="fa fa-trophy"/> Pass Certification</a>
</div>
- <div class="o_wslides_fs_certification" t-if="widget.get('slide').type == 'certification' &amp;&amp; widget.get('slide').completed">
+ <div class="" t-if="widget.get('slide').type === 'certification' &amp;&amp; widget.get('slide').completed">
<a role="button" class="btn btn-primary" t-att-href="'/survey/' + widget.get('slide').certificationId + '/get_certification'">
<i class="fa fa-fw fa-trophy" role="img" aria-label="Download certification" title="Download certification"/> Download certification
</a>
</div>
- </t>
+ </div>
</t>
<t t-extend="website.slides.fullscreen.title">
diff --git a/addons/website_slides_survey/views/assets.xml b/addons/website_slides_survey/views/assets.xml
index d7aab12568d..7a31fa078c8 100644
--- a/addons/website_slides_survey/views/assets.xml
+++ b/addons/website_slides_survey/views/assets.xml
@@ -2,9 +2,6 @@
<odoo>
<data>
<template id="assets_frontend" inherit_id="website.assets_frontend" name="Slides Certification">
- <xpath expr="//link[last()]" position="after">
- <link rel="stylesheet" type="text/scss" href="/website_slides_survey/static/src/scss/website_slides.scss" t-ignore="true"/>
- </xpath>
<xpath expr="//script[last()]" position="after">
<script type="text/javascript" src="/website_slides_survey/static/src/js/slides_upload.js"/>
<link rel="stylesheet" type="text/scss" href="/website_slides_survey/static/src/scss/website_profile.scss"/>
diff --git a/addons/website_slides_survey/views/website_slides_templates_lesson.xml b/addons/website_slides_survey/views/website_slides_templates_lesson.xml
index 4d1e2066a75..709528c5ab4 100644
--- a/addons/website_slides_survey/views/website_slides_templates_lesson.xml
+++ b/addons/website_slides_survey/views/website_slides_templates_lesson.xml
@@ -3,22 +3,18 @@
<data>
<template id="slide_content_detailed" inherit_id="website_slides.slide_content_detailed">
<xpath expr="//div[hasclass('o_wslides_lesson_content_type')]" position="inside">
- <t t-if="not certification_test_entry" t-set="begin_certification_label" t-value="'Begin certification'" />
- <t t-if="certification_test_entry" t-set="begin_certification_label" t-value="'Test certification'" />
- <div t-if="slide.slide_type == 'certification' and not certification_done" class="col mt32 mb8 d-flex justify-content-center">
+ <div t-if="slide.slide_type == 'certification' and not channel_progress[slide.id].get('completed')" class="col mt32 mb8 d-flex justify-content-center">
<a role="button"
class="btn btn-primary btn-lg"
- t-att-href="certification_url">
- <i class="fa fa-fw fa-graduation-cap" role="img" t-att-aria-label="begin_certification_label" t-att-title="begin_certification_label"/>
- <t t-esc="begin_certification_label" />
+ t-att-href="'/slides_survey/slide/get_certification_url?slide_id=%s' %(slide.id)">
+ <i class="fa fa-fw fa-graduation-cap" role="img"/>
+ <t t-if="slide.channel_id.is_member">Begin Certification</t>
+ <t t-else="">Test Certification</t>
</a>
</div>
- <div t-if="slide.slide_type == 'certification' and certification_done" class="col mt32 mb8 d-flex justify-content-center">
- <a role="button"
- class="btn btn-primary btn-lg"
- t-att-href="'/survey/%s/get_certification' % survey_id">
- <i class="fa fa-fw fa-trophy" role="img" aria-label="Download certification" title="Download certification"/>
- Download certification
+ <div t-if="slide.slide_type == 'certification' and channel_progress[slide.id].get('completed')" class="col mt32 mb8 d-flex justify-content-center">
+ <a role="button" class="btn btn-primary btn-lg" t-att-href="'/survey/%s/get_certification' % slide.survey_id.id">
+ <i class="fa fa-fw fa-trophy" role="img" aria-label="Download certification" title="Download certification"/> Download certification
</a>
</div>
</xpath>
diff --git a/addons/website_slides_survey/views/website_slides_templates_lesson_fullscreen.xml b/addons/website_slides_survey/views/website_slides_templates_lesson_fullscreen.xml
index 03baa27ef70..feada894efd 100644
--- a/addons/website_slides_survey/views/website_slides_templates_lesson_fullscreen.xml
+++ b/addons/website_slides_survey/views/website_slides_templates_lesson_fullscreen.xml
@@ -2,9 +2,9 @@
<odoo><data>
<template id="slide_fullscreen_sidebar_category" inherit_id="website_slides.slide_fullscreen_sidebar_category">
- <xpath expr="//li[hasclass('o_wslides_fs_sidebar_list_item')]" position="attributes">
- <attribute name="t-att-data-certification-done">channel_progress[slide.id].get('survey_quizz_passed')</attribute>
- <attribute name="t-att-data-certification-id">slide.survey_id.id</attribute>
+ <xpath expr="//li[@t-att-data-id='slide.id']" position="attributes">
+ <attribute name="t-att-data-certification-id">slide.survey_id.id</attribute>
+ <attribute name="t-att-data-is-member">slide.channel_id.is_member</attribute>
</xpath>
</template>