from odoo import api, fields, models class InternalTeams(models.Model): _name = "internal.teams" team_name = fields.Text("Team Name", required=True) team_lead = fields.Many2one("res.users", string="Team Lead") members_ids = fields.Many2many('res.users', 'internal_team_user_rel', 'team_id', 'user_id', 'Team Members', help="""Team Members are the users who are working in this particular team.""" ) active = fields.Boolean(default=True, help="Set active to false to hide the Teams without removing it.") parent_id = fields.Many2one('internal.teams', string="Parent Team", domain="[('id', '!=', id)]") child_ids = fields.One2many('internal.teams', 'parent_id', string="Child Teams") complete_name = fields.Char(string='Full Path', compute='_compute_complete_name', recursive=True) # Computed field to include members + child team members and leads all_members_ids = fields.Many2many( 'res.users', compute='_compute_all_members', string="All Members", store=False ) @api.depends('team_name', 'parent_id.complete_name') def _compute_complete_name(self): for rec in self: rec.complete_name = rec._get_full_name() def _get_full_name(self, level=6): """ Return the full name of ``self`` (up to a certain level). """ if level <= 0: return '...' if self.parent_id: return self.parent_id._get_full_name(level - 1) + " / " + (self.team_name or "") else: return self.team_name def add_internal_team_members(self): return { 'name': 'Add Team Members', 'type': 'ir.actions.act_window', 'res_model': 'internal.team.members.wizard', 'view_mode': 'form', 'target': 'new', 'context': {'default_user_ids': self.members_ids.ids} } @api.depends('members_ids', 'child_ids.members_ids', 'child_ids.team_lead') def _compute_all_members(self): for rec in self: all_members = rec.members_ids for child in rec.child_ids: all_members |= child.members_ids | child.team_lead rec.all_members_ids = all_members def _compute_display_name(self): """ Custom display_name in case a registration is nott linked to an attendee """ for registration in self: registration.display_name = registration.team_name