bemade-addons/bemade_sports_clinic/models/res_users.py
Denis Durepos 53a027c87c feat: Production readiness sanitization and access control refactoring
- Remove all debug logging and statements for production deployment
- Convert operational logging from info to debug level where appropriate
- Clean up debug test files and commented code
- Refactor access control helpers into centralized AccessControlMixin
- Consolidate duplicated access control methods across controllers
- Enforce team-based access control for all portal users
- Fix access control logic to match expected security behavior
- Move TODO.md to notes/ directory for better organization
- All 76 tests passing with proper security enforcement

Production ready: Clean codebase with centralized access control and no debug noise
2025-07-31 14:55:18 -04:00

103 lines
4.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."""
# Process user updates for portal access changes
# Check if groups_id is being modified (portal access being granted/revoked)
if 'groups_id' in vals:
# Get the portal group reference
portal_group = self.env.ref('base.group_portal')
# Store old group memberships before making changes
old_groups_by_user = {user.id: user.groups_id.ids for user in self}
# Store old group memberships for comparison
# 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
# Check if portal access was granted
if portal_group.id in new_groups and portal_group.id not in old_groups:
# Portal access was just granted - trigger treatment professional 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)
])
if staff_records:
staff_records._update_treatment_professional_group(user)
return result
else:
# No group changes, use normal write
pass
# 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."""
# Process user creation for portal access
# Create the users first
users = super().create(vals_list)
# Get the portal group reference
portal_group = self.env.ref('base.group_portal')
# Check for portal access in created users
# Check each created user to see if they were created with portal access
for user in users:
# Check if user was created with portal access
if portal_group.id in user.groups_id.ids:
# User was created with portal access - trigger treatment professional 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)
])
if staff_records:
staff_records._update_treatment_professional_group(user)
return users