bemade-addons/bemade_sports_clinic/models/res_users.py
Denis Durepos fae0d98637 Fix treatment professional portal access and group assignment
- Add patient address management in portal UI for therapists/coaches
- Fix treatment professional selection dropdown in injury detail forms
- Implement automatic group assignment when portal access is granted
- Add create() and write() overrides in res.users to detect portal access
- Expand treatment professional roles to include doctors
- Add comprehensive debugging for portal access workflow
- Update portal UI buttons to use Odoo company colors
- Add ACLs for snailmail.letter and res.users access for portal groups

Resolves issues with treatment professionals not appearing in portal
dropdowns after being granted portal access. Now works for all roles:
doctors, therapists, and head therapists.
2025-07-27 20:20:23 -04:00

111 lines
5.2 KiB
Python

from odoo import models, fields, api, _, Command
import logging
_logger = logging.getLogger(__name__)
class User(models.Model):
_inherit = "res.users"
accessible_team_ids = fields.Many2many(
comodel_name="sports.team",
compute="_compute_accessible_team_ids",
inverse="_inverse_accessible_team_ids",
)
def _compute_accessible_team_ids(self):
for rec in self:
rec.accessible_team_ids = rec.partner_id.teams_served_ids
def _inverse_accessible_team_ids(self):
for rec in self:
removed_teams = rec.partner_id.teams_served_ids - rec.accessible_team_ids
added_teams = rec.accessible_team_ids - rec.partner_id.teams_served_ids
removed_teams = rec.partner_id.teams_served_ids.filtered(
lambda team: team in removed_teams
)
removed_teams.remove_access(self)
self.env["sports.team.staff"].create(
[
{
"team_id": team.id,
"partner_id": rec.partner_id.id,
"role": "other",
}
for team in added_teams
]
)
def write(self, vals):
"""Override write to trigger treatment professional group assignment when portal access is granted."""
_logger.info(f"DEBUG: res.users.write() called with vals: {vals}")
_logger.info(f"DEBUG: Processing {len(self)} users: {[u.login for u in self]}")
# Check if groups_id is being modified (portal access being granted/revoked)
if 'groups_id' in vals:
_logger.info(f"DEBUG: groups_id is being modified: {vals['groups_id']}")
# Get the portal group reference
portal_group = self.env.ref('base.group_portal')
_logger.info(f"DEBUG: Portal group ID: {portal_group.id}")
# Store old group memberships before making changes
old_groups_by_user = {user.id: user.groups_id.ids for user in self}
_logger.info(f"DEBUG: Old groups by user: {old_groups_by_user}")
# Apply the changes first
result = super().write(vals)
# Check each user to see if portal access was granted
for user in self:
old_groups = old_groups_by_user[user.id]
new_groups = user.groups_id.ids
_logger.info(f"DEBUG: User {user.login} - Old groups: {old_groups}, New groups: {new_groups}")
if portal_group.id in new_groups and portal_group.id not in old_groups:
_logger.info(f"DEBUG: Portal access granted to {user.login} - triggering group assignment")
# Portal access was just granted - trigger treatment professional group assignment
staff_records = self.env['sports.team.staff'].search([
('partner_id', '=', user.partner_id.id)
])
_logger.info(f"DEBUG: Found {len(staff_records)} staff records for user {user.login}")
if staff_records:
_logger.info(f"DEBUG: Staff roles: {[(s.team_id.name, s.role) for s in staff_records]}")
staff_records._update_treatment_professional_group(user)
_logger.info(f"DEBUG: Group assignment completed for {user.login}")
return result
else:
_logger.info(f"DEBUG: groups_id not in vals, using normal write")
# If groups_id is not being modified, use normal write
return super().write(vals)
@api.model_create_multi
def create(self, vals_list):
"""Override create to trigger treatment professional group assignment when portal users are created."""
_logger.info(f"DEBUG: res.users.create() called with vals_list: {vals_list}")
# Create the users first
users = super().create(vals_list)
# Get the portal group reference
portal_group = self.env.ref('base.group_portal')
_logger.info(f"DEBUG: Portal group ID: {portal_group.id}")
# Check each created user to see if they were created with portal access
for user in users:
_logger.info(f"DEBUG: Created user {user.login} with groups: {user.groups_id.ids}")
if portal_group.id in user.groups_id.ids:
_logger.info(f"DEBUG: User {user.login} created with portal access - triggering group assignment")
# User was created with portal access - trigger treatment professional group assignment
staff_records = self.env['sports.team.staff'].search([
('partner_id', '=', user.partner_id.id)
])
_logger.info(f"DEBUG: Found {len(staff_records)} staff records for user {user.login}")
if staff_records:
_logger.info(f"DEBUG: Staff roles: {[(s.team_id.name, s.role) for s in staff_records]}")
staff_records._update_treatment_professional_group(user)
_logger.info(f"DEBUG: Group assignment completed for {user.login}")
return users