[IMP] website_slides: Improve methods to get user certificates
This commit improves a few methods related to the user profiles: - Change _prepare_all_users_values so that it works with a batch of users - Change the _get_user_certificates and rename it to _get_users_certificates so that it works with a batch of users to avoid doing a search in a list comprehension. This method will also be used to get the number of certificates per users TaskID: 1952064 PR: #32229 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
This commit is contained in:
@@ -16,7 +16,7 @@ from odoo.osv import expression
|
||||
class WebsiteProfile(http.Controller):
|
||||
_users_per_page = 30
|
||||
_pager_max_pages = 5
|
||||
|
||||
|
||||
# Profile
|
||||
# ---------------------------------------------------
|
||||
|
||||
@@ -189,16 +189,19 @@ class WebsiteProfile(http.Controller):
|
||||
|
||||
# All Users Page
|
||||
# ---------------------------------------------------
|
||||
def _prepare_all_users_values(self, user):
|
||||
return {
|
||||
'id': user.id,
|
||||
'name': user.name,
|
||||
'company_name': user.partner_id.company_name,
|
||||
'rank': user.rank_id.name,
|
||||
'karma': user.karma,
|
||||
'badge_count': len(user.badge_ids),
|
||||
'website_published': user.website_published
|
||||
}
|
||||
def _prepare_all_users_values(self, users):
|
||||
user_values = []
|
||||
for user in users:
|
||||
user_values.append({
|
||||
'id': user.id,
|
||||
'name': user.name,
|
||||
'company_name': user.company_id.name,
|
||||
'rank': user.rank_id.name,
|
||||
'karma': user.karma,
|
||||
'badge_count': len(user.badge_ids),
|
||||
'website_published': user.website_published
|
||||
})
|
||||
return user_values
|
||||
|
||||
@http.route(['/profile/users',
|
||||
'/profile/users/page/<int:page>'], type='http', auth="public", website=True)
|
||||
@@ -219,7 +222,7 @@ class WebsiteProfile(http.Controller):
|
||||
scope=page_count if page_count < self._pager_max_pages else self._pager_max_pages)
|
||||
|
||||
users = User.sudo().search(dom, limit=self._users_per_page, offset=pager['offset'], order='karma DESC')
|
||||
user_values = [self._prepare_all_users_values(user) for user in users]
|
||||
user_values = self._prepare_all_users_values(users)
|
||||
|
||||
# Get karma position for users (only website_published)
|
||||
position_domain = [('karma', '>', 1), ('website_published', '=', True)]
|
||||
|
||||
@@ -10,6 +10,7 @@ from odoo import http
|
||||
from odoo.http import request
|
||||
|
||||
from odoo.addons.website_slides.controllers.main import WebsiteSlides
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
class WebsiteSlides(WebsiteSlides):
|
||||
@@ -44,24 +45,32 @@ class WebsiteSlides(WebsiteSlides):
|
||||
def _prepare_user_slides_profile(self, user):
|
||||
values = super(WebsiteSlides, self)._prepare_user_slides_profile(user)
|
||||
values.update({
|
||||
'certificates': self._get_user_certificates(user),
|
||||
'certificates': self._get_users_certificates(user)[user.id]
|
||||
})
|
||||
return values
|
||||
|
||||
# All Users Page
|
||||
# ---------------------------------------------------
|
||||
def _prepare_all_users_values(self, user):
|
||||
result = super(WebsiteSlides, self)._prepare_all_users_values(user)
|
||||
result.update({
|
||||
'certification_count': len(self._get_user_certificates(user))
|
||||
})
|
||||
def _prepare_all_users_values(self, users):
|
||||
result = super(WebsiteSlides, self)._prepare_all_users_values(users)
|
||||
certificates_per_user = self._get_users_certificates(users)
|
||||
for index, user in enumerate(users):
|
||||
result[index].update({
|
||||
'certification_count': len(certificates_per_user.get(user.id, []))
|
||||
})
|
||||
return result
|
||||
|
||||
def _get_user_certificates(self, user):
|
||||
def _get_users_certificates(self, users):
|
||||
partner_ids = [user.partner_id.id for user in users]
|
||||
domain = [
|
||||
('partner_id', '=', user.partner_id.id),
|
||||
('slide_partner_id.partner_id', 'in', partner_ids),
|
||||
('quizz_passed', '=', True),
|
||||
('slide_partner_id.survey_quizz_passed', '=', True)
|
||||
]
|
||||
certifications = request.env['survey.user_input'].sudo().search(domain)
|
||||
return certifications
|
||||
certificates = request.env['survey.user_input'].sudo().search(domain)
|
||||
users_certificates = {
|
||||
user.id: [
|
||||
certificate for certificate in certificates if certificate.partner_id == user.partner_id
|
||||
] for user in users
|
||||
}
|
||||
return users_certificates
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
<div class="card-body o_wprofile_slides_course_card_body p-0 d-flex">
|
||||
<div class="pl-5 pr-4 rounded-left" t-attf-style="background-image:url(/web/image/slide.slide/#{certificate.slide_id.id}/image_medium); background-position: center"/>
|
||||
<div class="p-2 w-100">
|
||||
<h5 class="mt-0 mb-1" t-field="certificate.survey_id.title"/>
|
||||
<h5 class="mt-0 mb-1" t-esc="certificate.survey_id.title"/>
|
||||
<div t-if="user.id == uid">
|
||||
<small class="font-weight-bold">Score : <span t-field="certificate.quizz_score"/> %</small>
|
||||
<small class="font-weight-bold">Score : <span t-esc="certificate.quizz_score"/> %</small>
|
||||
<a role="button" class="float-right" t-att-href="'/survey/%s/get_certification' % certificate.survey_id.id">
|
||||
<i class="fa fa-download"/>
|
||||
</a>
|
||||
|
||||
Reference in New Issue
Block a user