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}, }