bemade-addons/bemade_sports_clinic/controllers/team_staff_portal.py
Denis Durepos ca57ec8f16 [IMP] bemade_sports_clinic: Refactor portal views and enhance treatment notes
- Refactor portal templates to eliminate intra-module template inheritance
- Integrate emergency contacts section into player injuries template
- Add full internal admin views for treatment notes with chatter support
- Fix ORM warning in test_rights by using proper ORM commands
- Update manifest to reflect new functionality (v18.0.1.9.0)

This refactoring improves template stability by removing XPath errors and
provides treatment professionals with better access to emergency contacts
and treatment notes both in portal and backend interfaces.
2025-07-11 21:47:50 -04:00

121 lines
5.6 KiB
Python

from odoo.addons.portal.controllers.portal import CustomerPortal, pager
from odoo import http, _
from odoo.exceptions import UserError
class TeamStaffPortal(CustomerPortal):
def _prepare_home_portal_values(self, counters):
rtn = super()._prepare_home_portal_values(counters)
teams_domain = self._prepare_teams_domain()
players_domain = self._prepare_players_domain(teams_domain)
rtn['teams_count'] = http.request.env['sports.team'].search_count(teams_domain)
rtn['players_count'] = http.request.env['sports.patient'].search_count(
players_domain)
return rtn
@classmethod
def _prepare_teams_domain(cls):
user = http.request.env.user
return [
('staff_ids.user_ids', 'in', user.id),
]
@classmethod
def _prepare_players_domain(cls, teams_domain):
team_ids = http.request.env['sports.team'].search(teams_domain).ids
return [
('team_ids', 'in', team_ids),
]
@http.route(route=['/my/teams', '/my/teams/page/<int:page>'], 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['sports.team']
domain = self._prepare_teams_domain()
teams_count = Teams.search_count(domain)
pgr = pager(url='/my/teams', total=teams_count,
page=page, step=10, scope=5)
teams = http.request.env['sports.team'].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', '/my/team/page/<int:page>'], 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_id = int(team_id)
team = http.request.env['sports.team'].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', total=players_count, page=page, step=10,
scope=5, url_args={'team_id': team_id})
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', '/my/players/page/<int:page>'], 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=5)
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',
})
@http.route(route=['/my/player'], type='http',
auth='user', website=True)
def view_player(self, player_id, team_id=None,**kw):
""" Display the active injuries for a given player. """
player_id = int(player_id)
team_id = team_id and int(team_id)
player = http.request.env['sports.patient'].browse(player_id)
team = team_id and http.request.env['sports.team'].browse(team_id)
if not player:
raise UserError(_('This player could not be found.'))
# Check if user is a treatment professional
user = http.request.env.user
is_treatment_prof = user.has_group('bemade_sports_clinic.group_sports_clinic_treatment_professional')
# Show all injuries to treatment professionals, but only active ones to coaches
if is_treatment_prof:
injuries = player.injury_ids
else:
injuries = player.injury_ids.filtered(lambda r: r.stage == 'active')
return http.request.render(
template='bemade_sports_clinic.portal_my_player_injuries',
qcontext={
'player': player,
'injuries': injuries,
'team': team,
'page_name': 'my_player',
'is_treatment_prof': is_treatment_prof,
}
)