From 1a287d1452430f408e6a97b3fd942ea744ffc341 Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Sat, 28 Oct 2023 17:20:22 -0400 Subject: [PATCH] bemade_sports_clinic iteration 3 progress on fields and views. --- bemade_sports_clinic/models/patient.py | 48 +++- bemade_sports_clinic/models/sports_team.py | 9 + .../views/sports_patient_views.xml | 62 +++-- .../views/sports_team_views.xml | 248 ++++++++++-------- 4 files changed, 230 insertions(+), 137 deletions(-) diff --git a/bemade_sports_clinic/models/patient.py b/bemade_sports_clinic/models/patient.py index 0da8916..6cdc97a 100644 --- a/bemade_sports_clinic/models/patient.py +++ b/bemade_sports_clinic/models/patient.py @@ -45,8 +45,26 @@ class Patient(models.Model): inverse_name='patient_id', string='Injuries', ) injured_since = fields.Date(compute='_compute_is_injured') - predicted_return_date = fields.Date() + predicted_return_date = fields.Date(tracking=True) + return_date = fields.Date(tracking=True, + help="When the player was cleared by medical staff to " + "return to match play.") is_injured = fields.Boolean(compute="_compute_is_injured") + stage = fields.Selection( + selection=[('no_play', 'Injured'), ('practice_ok', 'Cleared for Practice'), ('healthy', 'Cleared to Play')], + compute='_compute_stage') + + last_consultation_date = fields.Date() + + @api.depends('match_status', 'practice_status') + def _compute_stage(self): + for rec in self: + if rec.match_status == 'yes' and rec.practice_status == 'yes': + rec.stage = 'healthy' + elif rec.match_status == 'no' and rec.practice_status == 'no_contact': + rec.stage = 'practice_ok' + else: + rec.stage = 'no_play' @api.depends('date_of_birth') def _compute_age(self): @@ -68,8 +86,8 @@ class Patient(models.Model): rec.is_injured = rec.practice_status != 'yes' or rec.match_status != 'yes' if rec.is_injured: rec.injured_since = \ - rec.injury_ids.filtered(lambda r: not r.is_resolved).sorted( - 'injury_date_time')[0].injury_date_time + rec.injury_ids.filtered(lambda r: not r.stage == 'resolved').sorted( + 'injury_date_time')[0].injury_date_time else: rec.injured_since = False @@ -83,6 +101,16 @@ class Patient(models.Model): 'context': self._context, } + def action_consulted_today(self): + self.ensure_one() # should just be called from form view + self.last_consultation_date = date.today() + return { + 'view_mode': 'form', + 'res_model': 'sports.patient', + 'context': self._context, + 'res_id': self.id, + } + class PatientContact(models.Model): _name = 'sports.patient.contact' @@ -114,6 +142,7 @@ class PatientInjury(models.Model): injury_date_time = fields.Datetime(string='Date and Time of Injury', required=True, default=datetime.now()) internal_notes = fields.Html(tracking=True) + external_notes = fields.Html(tracking=True) treatment_professional_ids = fields.Many2many(comodel_name='res.users', relation='patient_injury_treatment_pro_rel', column1='patient_injury_id', @@ -123,7 +152,18 @@ class PatientInjury(models.Model): ('is_treatment_professional', '=', True)], tracking=True) predicted_resolution_date = fields.Date(tracking=True) - is_resolved = fields.Boolean(tracking=True, required=True, default=False) + resolution_date = fields.Date(tracking=True, + help="The date when the injury was actually resolved.") + stage = fields.Selection(selection=[('active', 'Active'), ('resolved', 'Resolved')], tracking=True, required=True, + default='active', readonly=False) + + @api.constrains('stage') + def constrain_stage_on_resolution_date(self): + for rec in self: + if rec.stage == 'resolved' and not rec.resolution_date: + raise ValidationError(_('Cannot set an injury as resolved without setting the resolution date first.')) + + def write(self, vals): super().write(vals) diff --git a/bemade_sports_clinic/models/sports_team.py b/bemade_sports_clinic/models/sports_team.py index f2c7b4f..d6c1d3c 100644 --- a/bemade_sports_clinic/models/sports_team.py +++ b/bemade_sports_clinic/models/sports_team.py @@ -64,6 +64,10 @@ class TeamStaff(models.Model): ('trainer', 'Trainer'), ('other', 'Other') ], required=True) + phone = fields.Char(related='partner_id.phone', readonly=False) + name = fields.Char(related='partner_id.name', readonly=False) + parent_id = fields.Many2one(related='partner_id.parent_id', readonly=False, string="Organization") + email = fields.Char(related='parent_id.email', readonly=False) _sql_constraints = [('team_staff_unique', 'unique(team_id, partner_id)', 'Each partner can only be related to a given team once.')] @@ -76,3 +80,8 @@ class TeamStaff(models.Model): 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.")) + + @api.onchange('phone') + def _onchange_phone_validation(self): + if self.phone: + self.phone = self.partner_id._phone_format(self.phone, force_format='INTERNATIONAL') \ No newline at end of file diff --git a/bemade_sports_clinic/views/sports_patient_views.xml b/bemade_sports_clinic/views/sports_patient_views.xml index 164b321..794f2f7 100644 --- a/bemade_sports_clinic/views/sports_patient_views.xml +++ b/bemade_sports_clinic/views/sports_patient_views.xml @@ -12,6 +12,8 @@ + + @@ -24,7 +26,7 @@ decoration-danger="match_status == 'no' and practice_status == 'no'" decoration-warning="match_status == 'no' - and practice_status == 'no_contact'"> + and practice_status != 'no'"> @@ -33,12 +35,13 @@ + - sports.patient.view.list + sports.patient.view.list.embedded sports.patient + /> +