diff --git a/bemade_sports_clinic/controllers/team_staff_portal.py b/bemade_sports_clinic/controllers/team_staff_portal.py index 6d4de72..733de27 100644 --- a/bemade_sports_clinic/controllers/team_staff_portal.py +++ b/bemade_sports_clinic/controllers/team_staff_portal.py @@ -1,5 +1,6 @@ -from odoo.addons.portal.controllers.portal import CustomerPortal -from odoo import http +from odoo.addons.portal.controllers.portal import CustomerPortal, pager +from odoo import http, _ +from odoo.exceptions import UserError class TeamStaffPortal(CustomerPortal): @@ -8,10 +9,12 @@ class TeamStaffPortal(CustomerPortal): teams_domain = self._prepare_teams_domain() players_domain = self._prepare_players_domain(teams_domain) rtn['teams_count'] = http.request.env['res.partner'].search_count(teams_domain) - rtn['players_count'] = http.request.env['sports.patient'].search_count(players_domain) + rtn['players_count'] = http.request.env['sports.patient'].search_count( + players_domain) return rtn - def _prepare_teams_domain(self): + @classmethod + def _prepare_teams_domain(cls): user = http.request.env.user partner = http.request.env.user.partner_id return [ @@ -19,13 +22,69 @@ class TeamStaffPortal(CustomerPortal): ('type', '=', 'team'), ] - def _prepare_players_domain(self, teams_domain): + @classmethod + def _prepare_players_domain(cls, teams_domain): team_ids = http.request.env['res.partner'].search(teams_domain).ids return [ ('team_ids', 'in', team_ids), ] - # @http.route(route=['/my/teams'], type=http, auth='user', website=True) - # def view_teams(self, ): - # pass + @http.route(route=['/my/teams'], type='http', auth='user', website=True) + def view_teams(self, page=0, **kw): + """ Display the list of teams that a portal user has access to """ + Teams = http.request.env['res.partner'] + domain = self._prepare_teams_domain() + teams_count = Teams.search_count(domain) + pgr = pager(url='/my/teams', total=teams_count, + page=page, step=10, scope=10) + teams = http.request.env['res.partner'].search(self._prepare_teams_domain(), + offset=pgr['offset'], + limit=teams_count) + return http.request.render(template='bemade_sports_clinic.portal_my_teams', + qcontext={ + 'teams_count': teams_count, + 'teams': teams, + 'pager': pgr, + 'page_name': 'my_teams', + }) + @http.route(route=['/my/team/'], type='http', auth='user', website=True) + def view_team(self, team_id, page=0, **kw): + """ Display the information for a team including its list of players """ + team = http.request.env['res.partner'].browse(team_id) + if not team: + raise UserError(_('This team could not be found.')) + players_count = team.player_count + pgr = pager(url=f'/my/team/{team_id}', total=players_count, page=page, step=10, + scope=10) + players = http.request.env['sports.patient'].search([ + ('team_ids', 'in', team_id), + ], offset=pgr['offset'], limit=players_count) + return http.request.render( + template='bemade_sports_clinic.portal_my_team_players', + qcontext={ + 'team': team, + 'players_count': players_count, + 'players': players, + 'pager': pgr, + 'page_name': 'my_teams', + } + ) + + @http.route(route=['/my/players'], type='http', auth='user', website=True) + def view_players(self, page=0, **kw): + """ Display the list of players that the portal user has access to """ + teams_domain = self._prepare_teams_domain() + players_domain = self._prepare_players_domain(teams_domain) + players_count = http.request.env['sports.patient'].search_count(players_domain) + pgr = pager(url='/my/players', total=players_count, page=page, step=10, scope=10) + players = http.request.env['sports.patient'].search(players_domain, + offset=pgr['offset'], + limit=players_count) + return http.request.render(template='bemade_sports_clinic.portal_my_players', + qcontext={ + 'players_count': players_count, + 'players': players, + 'pager': pgr, + 'page_name': 'my_players', + }) diff --git a/bemade_sports_clinic/data/demo/sports_clinic_demo_data.xml b/bemade_sports_clinic/data/demo/sports_clinic_demo_data.xml index 79a20ad..cf6d42e 100644 --- a/bemade_sports_clinic/data/demo/sports_clinic_demo_data.xml +++ b/bemade_sports_clinic/data/demo/sports_clinic_demo_data.xml @@ -23,6 +23,7 @@ 2001-08-23 jean.carabin@edudiants.umontreal.ca + match Rémi @@ -30,6 +31,7 @@ 2002-05-17 remi.lafracture@edudiants.umontreal.ca + practice Carabins (Hockey féminin) @@ -43,6 +45,7 @@ 2001-08-23 jeanne.carabine@edudiants.umontreal.ca + match Rimée @@ -50,6 +53,7 @@ 2004-11-22 rimee.lafracture@edudiants.umontreal.ca + practice Université Concordia @@ -72,6 +76,7 @@ 2003-11-02 jo_stinger@encs.concordia.ca + match Jimmy @@ -79,6 +84,7 @@ 2001-01-05 jim_bee@jmsb.concordia.ca + match 2023-05-17 18:53:00 diff --git a/bemade_sports_clinic/models/patient.py b/bemade_sports_clinic/models/patient.py index d418379..8bc658e 100644 --- a/bemade_sports_clinic/models/patient.py +++ b/bemade_sports_clinic/models/patient.py @@ -34,9 +34,10 @@ class Patient(models.Model): ]) injury_ids = fields.One2many(comodel_name='sports.patient.injury', inverse_name='patient_id', - string='Injuries', - groups='bemade_sports_clinic.group_sports_clinic_treatment_professional') + string='Injuries', ) predicted_return_date = fields.Date(compute='_compute_predicted_return_date', ) + is_injured = fields.Boolean(compute='_compute_is_injured') + injured_since = fields.Date(compute='_compute_is_injured') # authorized_users = fields.One2many(compute='_compute_authorized_users', store=True) # @@ -69,11 +70,24 @@ class Patient(models.Model): else: rec.predicted_return_date = False + @api.depends('first_name', 'last_name') def _compute_name(self): for rec in self: rec.name = ((rec.first_name or "") + " " + (rec.last_name or "")).strip() + @api.depends('injury_ids.is_resolved') + def _compute_is_injured(self): + injured = self.filtered( + lambda r: r.injury_ids.filtered(lambda i: not i.is_resolved)) + for rec in injured: + rec.is_injured = True + rec.injured_since = rec.injury_ids.sorted('injury_date_time')[ + -1].injury_date_time.date() + for rec in self - injured: + rec.is_injured = False + rec.injured_since = False + class PatientContact(models.Model): _name = 'sports.patient.contact' @@ -111,6 +125,7 @@ class PatientInjury(models.Model): ('is_treatment_professional', '=', True)], ) predicted_return_date = fields.Date(tracking=True) + is_resolved = fields.Boolean(compute="_compute_is_resolved") def write(self, vals): super().write(vals) @@ -119,7 +134,6 @@ class PatientInjury(models.Model): - self.message_follower_ids.mapped('partner_id')) self.message_subscribe(to_subscribe.ids) - @api.model_create_multi def create(self, vals_list): super().write(vals_list) @@ -127,3 +141,8 @@ class PatientInjury(models.Model): to_subscribe = (rec.treatment_professional_ids - rec.message_follower_ids.mapped('partner_id')) rec.message_subscribe(to_subscribe.ids) + + @api.depends('predicted_return_date') + def _compute_is_resolved(self): + for rec in self: + rec.is_resolved = rec.predicted_return_date < date.today() diff --git a/bemade_sports_clinic/models/res_partner.py b/bemade_sports_clinic/models/res_partner.py index 09e6dea..ed96c9a 100644 --- a/bemade_sports_clinic/models/res_partner.py +++ b/bemade_sports_clinic/models/res_partner.py @@ -10,6 +10,8 @@ class Partner(models.Model): column1='team_id', column2='patient_id', string='Players') + player_count = fields.Integer(compute="_compute_player_counts") + injured_count = fields.Integer(compute="_compute_player_counts") type = fields.Selection(selection_add=[('team', 'Sports Team'), ]) staff_partner_ids = fields.Many2many(comodel_name='res.partner', relation='sports_team_staff_partner_rel', @@ -53,3 +55,8 @@ class Partner(models.Model): 'bemade_sports_clinic.group_sports_clinic_treatment_professional') for rec in user_partners: rec.is_treatment_professional = group in rec.user_ids.groups_id + + 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)) \ No newline at end of file diff --git a/bemade_sports_clinic/views/sports_clinic_portal_views.xml b/bemade_sports_clinic/views/sports_clinic_portal_views.xml index 866a679..a5627b8 100644 --- a/bemade_sports_clinic/views/sports_clinic_portal_views.xml +++ b/bemade_sports_clinic/views/sports_clinic_portal_views.xml @@ -15,5 +15,138 @@ + + + + \ No newline at end of file