from odoo import http from odoo.addons.portal.controllers.portal import CustomerPortal from odoo.http import request SOFT_DETECTED_MODULES = ( 'community_membership', 'event_qr_ticketing', 'community_school', 'community_benefits', 'community_classifieds', ) class CommunityPortalDashboard(CustomerPortal): def _get_installed_community_modules(self): """Soft-detect which Community OS product modules are installed.""" installed = request.env['ir.module.module'].sudo().search([ ('name', 'in', list(SOFT_DETECTED_MODULES)), ('state', '=', 'installed'), ]) return set(installed.mapped('name')) def _prepare_home_portal_values(self, counters): values = super()._prepare_home_portal_values(counters) partner = request.env.user.partner_id installed = self._get_installed_community_modules() if 'event_registration_count' in counters and 'event_qr_ticketing' in installed: values['event_registration_count'] = request.env['event.registration'].sudo().search_count([ ('partner_id', '=', partner.id), ]) if 'school_enrollment_count' in counters and 'community_school' in installed: values['school_enrollment_count'] = request.env['community.school.student'].sudo().search_count([ ('parent_partner_id', '=', partner.id), ]) if 'benefits_count' in counters and 'community_benefits' in installed: Benefit = request.env['community.benefit'].sudo() entitled = Benefit.search(Benefit._entitled_domain_for_partner(partner)) values['benefits_count'] = len(entitled.filtered(lambda b: b.is_entitled(partner))) if 'classifieds_count' in counters and 'community_classifieds' in installed: values['classifieds_count'] = request.env['community.classified'].sudo().search_count([ ('poster_partner_id', '=', partner.id), ]) return values @http.route(['/my/school'], type='http', auth='public', website=True) def portal_my_school(self, **kwargs): if request.env.user._is_public(): return request.redirect('/web/login?redirect=/my/school') partner = request.env.user.partner_id students = request.env['community.school.student'].sudo().search([ ('parent_partner_id', '=', partner.id), ]) return request.render('community_portal.portal_my_school', {'students': students})