employee_kpi/controllers/kpi_portal.py
2026-02-05 18:45:49 +07:00

66 lines
2.6 KiB
Python

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/<int: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/<model("kpi.kpi"):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
}