- 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.
111 lines
5.2 KiB
Python
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
|