66 lines
2.6 KiB
Python
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
|
|
}
|