From 5ac64d6e02bc8bc0fbdddd73cfc561023b58e566 Mon Sep 17 00:00:00 2001 From: David Beguin Date: Fri, 29 Mar 2019 12:06:25 +0000 Subject: [PATCH] [IMP] website_slides_survey: add certification badges section to ranks badge page This commit adds a section to distinguish the certification badges from the other badges users may obtain in eLearning. Certification badges are available on the ranks page, linked to a running survey. Clicking on them directly redirects into the linked course. Task ID : 1961053 PR #32594 --- addons/gamification/views/badge.xml | 2 +- addons/website_profile/controllers/main.py | 10 +++- .../static/src/scss/website_profile.scss | 4 ++ .../website_profile/views/website_profile.xml | 55 +++++++++++-------- .../controllers/slides.py | 37 +++++++++++++ .../views/website_profile.xml | 30 ++++++++++ 6 files changed, 110 insertions(+), 28 deletions(-) diff --git a/addons/gamification/views/badge.xml b/addons/gamification/views/badge.xml index 1115729191f..80d9130181a 100644 --- a/addons/gamification/views/badge.xml +++ b/addons/gamification/views/badge.xml @@ -91,7 +91,7 @@ - + diff --git a/addons/website_profile/controllers/main.py b/addons/website_profile/controllers/main.py index cfe1f5a96a4..3d14024d1a0 100644 --- a/addons/website_profile/controllers/main.py +++ b/addons/website_profile/controllers/main.py @@ -171,8 +171,7 @@ class WebsiteProfile(http.Controller): domain = expression.AND([[('challenge_ids.challenge_category', '=', kwargs.get('badge_category'))], domain]) return domain - @http.route('/profile/ranks_badges', type='http', auth="public", website=True, sitemap=True) - def view_ranks_badges(self, **kwargs): + def _prepare_ranks_badges_values(self, **kwargs): ranks = [] if 'badge_category' not in kwargs: Rank = request.env['gamification.karma.rank'] @@ -180,7 +179,7 @@ class WebsiteProfile(http.Controller): Badge = request.env['gamification.badge'] badges = Badge.sudo().search(self._prepare_badges_domain(**kwargs)) - badges = sorted(badges, key=lambda b: b.granted_users_count, reverse=True) + badges = badges.sorted("granted_users_count", reverse=True) values = self._prepare_user_values(searches={'badges': True}) values.update({ @@ -188,6 +187,11 @@ class WebsiteProfile(http.Controller): 'badges': badges, 'user': request.env.user, }) + return values + + @http.route('/profile/ranks_badges', type='http', auth="public", website=True, sitemap=True) + def view_ranks_badges(self, **kwargs): + values = self._prepare_ranks_badges_values(**kwargs) return request.render("website_profile.rank_badge_main", values) # All Users Page diff --git a/addons/website_profile/static/src/scss/website_profile.scss b/addons/website_profile/static/src/scss/website_profile.scss index 07ac29b67fa..60a47bc7bc8 100644 --- a/addons/website_profile/static/src/scss/website_profile.scss +++ b/addons/website_profile/static/src/scss/website_profile.scss @@ -228,6 +228,10 @@ $owprofile-color-bg: mix($body-bg, #efeff4); } } +.wprofile_badge_img { + height: 2.5em; +} + // Other stuffs .country_flag { diff --git a/addons/website_profile/views/website_profile.xml b/addons/website_profile/views/website_profile.xml index 1b3c85ea599..50694cbcbfe 100644 --- a/addons/website_profile/views/website_profile.xml +++ b/addons/website_profile/views/website_profile.xml @@ -423,33 +423,40 @@ + + diff --git a/addons/website_slides_survey/controllers/slides.py b/addons/website_slides_survey/controllers/slides.py index 53d280d5b88..3c8f7bdc4ec 100644 --- a/addons/website_slides_survey/controllers/slides.py +++ b/addons/website_slides_survey/controllers/slides.py @@ -8,6 +8,7 @@ import werkzeug.exceptions from odoo import _ from odoo import http from odoo.http import request +from odoo.osv import expression from odoo.addons.website_slides.controllers.main import WebsiteSlides from collections import defaultdict @@ -74,3 +75,39 @@ class WebsiteSlides(WebsiteSlides): ] for user in users } return users_certificates + + # Badges & Ranks Page + # --------------------------------------------------- + def _prepare_ranks_badges_values(self, **kwargs): + """ Extract certification badges, to render them in ranks/badges page in another section. + Order them by number of granted users desc and show only badges linked to opened certifications.""" + values = super(WebsiteSlides, self)._prepare_ranks_badges_values(**kwargs) + + # 1. Getting all certification badges, sorted by granted user desc + domain = expression.AND([[('survey_id', '!=', False)], self._prepare_badges_domain(**kwargs)]) + certification_badges = request.env['gamification.badge'].sudo().search(domain) + # keep only the badge with challenge category = slides (the rest will be displayed under 'normal badges' section + certification_badges = certification_badges.filtered( + lambda b: 'slides' in b.challenge_ids.mapped('challenge_category')) + + if not certification_badges: + return values + + # 2. sort by granted users (done here, and not in search directly, because non stored field) + certification_badges = certification_badges.sorted("granted_users_count", reverse=True) + + # 3. Remove certification badge from badges and keep only certification badge linked to opened survey + badges = values['badges'] - certification_badges + certification_badges = certification_badges.filtered(lambda b: b.survey_id.state == 'open') + + # 4. Getting all course url for each badge + certification_slides = request.env['slide.slide'].sudo().search([('survey_id', 'in', certification_badges.mapped('survey_id').ids)]) + certification_badge_urls = {slide.survey_id.certification_badge_id.id: slide.channel_id.website_url for slide in certification_slides} + + # 5. Applying changes + values.update({ + 'badges': badges, + 'certification_badges': certification_badges, + 'certification_badge_urls': certification_badge_urls + }) + return values diff --git a/addons/website_slides_survey/views/website_profile.xml b/addons/website_slides_survey/views/website_profile.xml index a3090c5b136..8a76d0867e3 100644 --- a/addons/website_slides_survey/views/website_profile.xml +++ b/addons/website_slides_survey/views/website_profile.xml @@ -62,4 +62,34 @@ + +