from odoo import http, _ from odoo.http import request from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager class ExamPortal(CustomerPortal): def _prepare_home_portal_values(self, counters): values = super()._prepare_home_portal_values(counters) student = request.env['education.student'].sudo().search([('portal_user_id', '=', request.env.user.id)], limit=1) if student: if 'exam_count' in counters: exam_count = request.env['education.exam'].sudo().search_count([ ('program_id', '=', student.program_id.id), ('term_id', '=', student.academic_term_id.id), ('state', 'in', ['scheduled', 'ongoing']) ]) values['exam_count'] = exam_count if 'result_count' in counters: result_count = request.env['education.exam.result'].sudo().search_count([ ('student_id', '=', student.id), ('published', '=', True) ]) values['result_count'] = result_count return values @http.route(['/my/exams', '/my/exams/page/'], type='http', auth="user", website=True) def portal_my_exams(self, page=1, **kw): student = request.env['education.student'].sudo().search([('portal_user_id', '=', request.env.user.id)], limit=1) if not student: return request.redirect('/my') domain = [ ('program_id', '=', student.program_id.id), ('term_id', '=', student.academic_term_id.id), ('state', 'in', ['scheduled', 'ongoing']) ] exam_count = request.env['education.exam'].sudo().search_count(domain) pager = portal_pager( url="/my/exams", total=exam_count, page=page, step=10 ) exams = request.env['education.exam'].sudo().search(domain, limit=10, offset=pager['offset'], order='start_date desc') values = { 'exams': exams, 'page_name': 'exams', 'pager': pager, 'default_url': '/my/exams', 'student': student, } return request.render("education_exam.portal_my_exams", values) @http.route(['/my/results', '/my/results/page/'], type='http', auth="user", website=True) def portal_my_results(self, page=1, **kw): student = request.env['education.student'].sudo().search([('portal_user_id', '=', request.env.user.id)], limit=1) if not student: return request.redirect('/my') domain = [ ('student_id', '=', student.id), ('published', '=', True) ] result_count = request.env['education.exam.result'].sudo().search_count(domain) pager = portal_pager( url="/my/results", total=result_count, page=page, step=10 ) results = request.env['education.exam.result'].sudo().search(domain, limit=10, offset=pager['offset']) values = { 'results': results, 'page_name': 'results', 'pager': pager, 'default_url': '/my/results', 'student': student, } return request.render("education_exam.portal_my_results", values) @http.route(['/my/results/'], type='http', auth="user", website=True) def portal_my_result_detail(self, result_id, **kw): student = request.env['education.student'].sudo().search([('portal_user_id', '=', request.env.user.id)], limit=1) if not student: return request.redirect('/my') # Ensure the result belongs to the logged in student and is published result = request.env['education.exam.result'].sudo().search([ ('id', '=', result_id), ('student_id', '=', student.id), ('published', '=', True) ], limit=1) if not result: return request.redirect('/my/results') values = { 'result': result, 'page_name': 'result_detail', 'student': student, } return request.render("education_exam.portal_result_detail", values)