52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
from odoo import api, fields, models
|
|
|
|
|
|
class HrEmployee(models.Model):
|
|
_inherit = "hr.employee"
|
|
|
|
session_count = fields.Integer(
|
|
"Sessions Taught",
|
|
compute="_compute_teaching_stats",
|
|
store=True,
|
|
)
|
|
session_hours = fields.Float(
|
|
"Hours Taught",
|
|
compute="_compute_teaching_stats",
|
|
store=True,
|
|
digits=(10, 2),
|
|
)
|
|
|
|
@api.depends()
|
|
def _compute_teaching_stats(self):
|
|
# Grouped query — avoids N+1 for large employee lists
|
|
result = self.env["dance.session"].read_group(
|
|
domain=[("instructor_id", "in", self.ids), ("status", "=", "completed")],
|
|
fields=["instructor_id", "start_time:sum", "end_time:sum"],
|
|
groupby=["instructor_id"],
|
|
)
|
|
# Build lookup: emp_id → (count, hours)
|
|
stats = {}
|
|
for row in result:
|
|
emp_id = row["instructor_id"][0]
|
|
sessions = self.env["dance.session"].search([
|
|
("instructor_id", "=", emp_id),
|
|
("status", "=", "completed"),
|
|
])
|
|
hours = sum(max(0.0, s.end_time - s.start_time) for s in sessions)
|
|
stats[emp_id] = (row["instructor_id_count"], hours)
|
|
|
|
for emp in self:
|
|
count, hours = stats.get(emp.id, (0, 0.0))
|
|
emp.session_count = count
|
|
emp.session_hours = hours
|
|
|
|
def action_view_teaching_sessions(self):
|
|
return {
|
|
"type": "ir.actions.act_window",
|
|
"name": "Teaching Sessions",
|
|
"res_model": "dance.session",
|
|
"domain": [("instructor_id", "=", self.id)],
|
|
"view_mode": "tree,form,calendar",
|
|
"context": {"search_default_completed_sessions": 1},
|
|
}
|