bemade-addons/bemade_sports_clinic/models/sports_team.py
2023-10-22 15:37:47 -04:00

78 lines
3.5 KiB
Python

from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class SportsTeam(models.Model):
_name = "sports.team"
_description = "Sports Team"
name = fields.Char()
patient_ids = fields.Many2many(comodel_name='sports.patient',
relation='sports_team_patient_rel',
column1='team_id',
column2='patient_id',
string='Players')
player_count = fields.Integer(compute="_compute_player_counts")
injured_count = fields.Integer(compute="_compute_player_counts")
healthy_count = fields.Integer(compute="_compute_player_counts")
parent_id = fields.Many2one(comodel_name='res.partner', string='Parent Organization',
ondelete='restrict')
staff_ids = fields.One2many(comodel_name='sports.team.staff',
inverse_name='team_id')
head_coach_id = fields.Many2one(comodel_name='res.partner',
compute='_compute_head_coach',
store=True)
head_coach_name = fields.Char(related='head_coach_id.name')
head_trainer_id = fields.Many2one(comodel_name='res.partner',
compute='_compute_head_trainer',
store=True)
head_trainer_name = fields.Char(related='head_trainer_id.name')
website = fields.Char()
@api.depends('patient_ids.is_injured')
def _compute_player_counts(self):
for rec in self:
rec.player_count = len(rec.patient_ids)
rec.injured_count = len(rec.patient_ids.filtered(lambda p: p.is_injured))
rec.healthy_count = rec.player_count - rec.injured_count
@api.depends('staff_ids.role')
def _compute_head_coach(self):
for rec in self:
staff = rec.staff_ids.filtered(lambda r: r.role == 'head_coach')
rec.head_coach_id = staff.partner_id if staff else False
@api.depends('staff_ids.role')
def _compute_head_trainer(self):
for rec in self:
staff = rec.staff_ids.filtered(lambda r: r.role == 'head_trainer')
rec.head_trainer_id = staff.partner_id if staff else False
class TeamStaff(models.Model):
_name = "sports.team.staff"
_description = "Relationship between staff members and their teams."
sequence = fields.Integer()
team_id = fields.Many2one(comodel_name='sports.team', string='Team', required=True)
partner_id = fields.Many2one(comodel_name='res.partner', string='Staff Member',
required=True)
role = fields.Selection(selection=[
('head_coach', 'Head Coach'),
('head_trainer', 'Head Trainer'),
('coach', 'Coach'),
('trainer', 'Trainer'),
('other', 'Other')
], required=True)
_sql_constraints = [('team_staff_unique', 'unique(team_id, partner_id)',
'Each partner can only be related to a given team once.')]
@api.constrains('role')
def _constrain_role(self):
teams = self.mapped('team_id')
for team in teams:
if len(team.staff_ids.filtered(lambda r: r.role == 'head_coach')) > 1:
raise ValidationError(_("A team can have only one head coach."))
if len(team.staff_ids.filtered(lambda r: r.role == 'head_trainer')) > 1:
raise ValidationError(_("A team can have only one head trainer."))