from odoo import http, _ from odoo.http import request from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager class KPIPortal(CustomerPortal): def _prepare_home_portal_values(self, counters): values = super()._prepare_home_portal_values(counters) if 'kpi_count' in counters: values['kpi_count'] = request.env['kpi.kpi'].search_count([ ('employee_id.user_id', '=', request.env.user.id) ]) return values @http.route(['/my/kpi', '/my/kpi/page/'], type='http', auth="user", website=True) def portal_my_kpis(self, page=1, date_begin=None, date_end=None, sortby=None, **kw): values = self._prepare_portal_layout_values() Kpi = request.env['kpi.kpi'] domain = [('employee_id.user_id', '=', request.env.user.id)] kpi_count = Kpi.search_count(domain) pager = portal_pager( url="/my/kpi", url_args={'date_begin': date_begin, 'date_end': date_end, 'sortby': sortby}, total=kpi_count, page=page, step=self._items_per_page ) kpis = Kpi.search(domain, limit=self._items_per_page, offset=pager['offset']) values.update({ 'kpis': kpis, 'page_name': 'kpi', 'default_url': '/my/kpi', 'pager': pager, }) return request.render("employee_kpi.portal_my_kpis", values) @http.route(['/my/kpi/'], type='http', auth="user", website=True) def portal_my_kpi_detail(self, kpi, **kw): # Explicit check in case record rules are bypassed or misconfigured if kpi.employee_id.user_id != request.env.user: return request.redirect('/my/kpi') return request.render("employee_kpi.portal_my_kpi", { 'kpi': kpi, 'page_name': 'kpi', }) @http.route(['/my/kpi/save_line'], type='json', auth="user") def portal_kpi_save_line(self, line_id, realization): line = request.env['kpi.kpi.line'].browse(line_id) if line.kpi_id.employee_id.user_id != request.env.user: return {'error': 'Access Denied'} # Only allow edit if KPI is running? Or always? # Assuming always allow for now, or based on state logic if added later. line.write({'realization': float(realization)}) return { 'success': True, 'new_score': line.score, 'new_final_score': line.final_score, 'kpi_total_score': line.kpi_id.total_score }