bemade_sports_clinic: limit access rights

This commit is contained in:
Marc Durepos 2024-04-17 16:43:01 -04:00
parent b80dc8a465
commit b0060ad56b
8 changed files with 202 additions and 9 deletions

View file

@ -18,7 +18,7 @@
#
{
'name': 'Sports Clinic Management',
'version': '16.0.1.5.7',
'version': '16.0.1.5.8',
'summary': 'Manage the patients of a sports medicine clinic.',
'description': """
Adds the notion of sports teams, players (patients), coaches and treatment
@ -49,6 +49,7 @@
'views/sports_patient_views.xml',
'views/sports_clinic_portal_views.xml',
'views/res_partner_views.xml',
'views/res_users_views.xml',
],
'demo': ['data/demo/sports_clinic_demo_data.xml'],
'installable': True,

View file

@ -0,0 +1,7 @@
from odoo import api, SUPERUSER_ID
def migrate(cr, version):
env = api.Environment(cr, SUPERUSER_ID, {})
env['sports.team'].search([])._allow_access_for_staff_internal_users()
cr.execute('CREATE EXTENSION IF NOT EXISTS "unaccent"')

View file

@ -7,13 +7,13 @@ class PatientContact(models.Model):
_description = "Emergency or other contacts for a patient."
sequence = fields.Integer(required=True, default=0)
name = fields.Char(unaccent=False)
name = fields.Char(unaccent=True)
contact_type = fields.Selection(selection=[
('mother', 'Mother'),
('father', 'Father'),
('other', 'Other'),
], required=True)
mobile = fields.Char(unaccent=False, required=True)
mobile = fields.Char(unaccent=False)
# TODO: add email here and on views
patient_id = fields.Many2one(comodel_name='sports.patient', string='Patient')

View file

@ -7,6 +7,14 @@ class User(models.Model):
is_treatment_professional = fields.Boolean(
compute="_compute_is_treatment_professional", store=True)
accessible_team_ids = fields.Many2many(
comodel_name="sports.team",
relation="sports_team_res_users_rel",
column1="user_id",
column2="team_id",
string="Accessible Sports Teams",
)
@api.depends('groups_id')
def _compute_is_treatment_professional(self):
for rec in self:

View file

@ -28,6 +28,28 @@ class SportsTeam(models.Model):
store=True)
head_therapist_name = fields.Char(related='head_therapist_id.name')
website = fields.Char()
allowed_user_ids = fields.Many2many(
comodel_name='res.users',
relation='sports_team_res_users_rel',
column1='team_id',
column2='user_id',
string='Allowed Users',
domain=lambda self: [['groups_id', 'in', self.env.ref("base.group_user").ids ]]
)
def write(self, vals):
res = super().write(vals)
if 'staff_ids' in vals:
self._allow_access_for_staff_internal_users()
return res
@api.model_create_multi
def create(self, vals_list):
res = super().create(vals_list)
for index, rec in enumerate(res):
if 'staff_ids' in vals_list[index]:
rec._allow_access_for_staff_internal_users()
return res
@api.depends('patient_ids.is_injured')
def _compute_player_counts(self):
@ -48,6 +70,10 @@ class SportsTeam(models.Model):
staff = rec.staff_ids.filtered(lambda r: r.role == 'head_therapist')
rec.head_therapist_id = staff.partner_id if staff else False
def _allow_access_for_staff_internal_users(self):
for rec in self:
rec.allowed_user_ids |= rec.staff_ids.user_ids.filtered(lambda user: user.has_group("base.group_user"))
class TeamStaff(models.Model):
_name = "sports.team.staff"

View file

@ -2,13 +2,140 @@
<odoo>
<data noupdate="1">
<!-- Refuse access to patient records that are not part of staff user's teams -->
<record id="restrict_team_access_to_team_players" model="ir.rule">
<record id="restrict_staff_access_to_team_players" model="ir.rule">
<field name="name">Restrict Team Staff Access to Their Players Only</field>
<field name="model_id" ref="model_sports_patient"/>
<field name="groups" eval="[(6, 0, [ref('base.group_portal')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[('id', 'in',
user.partner_id.team_staff_rel_ids.team_id.patient_ids.ids)]
[('team_ids.staff_ids.user_ids', 'in', user.id)]
</field>
</record>
<record id="restrict_staff_access_to_teams" model="ir.rule">
<field name="name">Restrict Team Staff Access to Their Teams Only</field>
<field name="model_id" ref="model_sports_team"/>
<field name="groups" eval="[(6, 0, [ref('base.group_portal')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[('staff_ids.user_ids', 'in', user.id)]
</field>
</record>
<record id="restrict_staff_access_to_team_injuries" model="ir.rule">
<field name="name">Restrict Team Staff Access to Their Teams Only</field>
<field name="model_id" ref="model_sports_patient_injury"/>
<field name="groups" eval="[(6, 0, [ref('base.group_portal')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[('patient_id.team_ids.staff_ids.user_ids', 'in', user.id)]
</field>
</record>
<record id="restrict_team_access_to_allowed_internal_users" model="ir.rule">
<field name="name">Restrict Team Access to Allowed Internal Users</field>
<field name="model_id" ref="model_sports_team"/>
<field name="groups" eval="[(6, 0, [ref('base.group_user')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[('allowed_user_ids', 'in', user.id)]
</field>
</record>
<record id="restrict_patient_access_to_allowed_internal_users" model="ir.rule">
<field name="name">Restrict Patient Access to Allowed Internal Users</field>
<field name="model_id" ref="model_sports_patient"/>
<field name="groups" eval="[(6, 0, [ref('base.group_user')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[('team_ids.allowed_user_ids', 'in', user.id)]
</field>
</record>
<record id="restrict_injury_access_to_allowed_internal_users" model="ir.rule">
<field name="name">Restrict Team Access to Allowed Internal Users</field>
<field name="model_id" ref="model_sports_patient_injury"/>
<field name="groups" eval="[(6, 0, [ref('base.group_user')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[('patient_id.team_ids.allowed_user_ids', 'in', user.id)]
</field>
</record>
<record id="restrict_patient_contact_access_to_allowed_internal_users" model="ir.rule">
<field name="name">Restrict Patient Contact Access to Allowed Internal Users</field>
<field name="model_id" ref="model_sports_patient_contact"/>
<field name="groups" eval="[(6, 0, [ref('base.group_user')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[('patient_id.team_ids.allowed_user_ids', 'in', user.id)]
</field>
</record>
<record id="allow_team_access_to_admins" model="ir.rule">
<field name="name">Allow Team Access to Administrators</field>
<field name="model_id" ref="model_sports_team"/>
<field name="groups"
eval="[(6, 0, [ref('base.group_system'), ref('bemade_sports_clinic.group_sports_clinic_admin')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[(1, '=', 1)]
</field>
</record>
<record id="allow_patient_access_to_admins" model="ir.rule">
<field name="name">Allow Patient Access to Administrators</field>
<field name="model_id" ref="model_sports_patient"/>
<field name="groups"
eval="[(6, 0, [ref('base.group_system'), ref('bemade_sports_clinic.group_sports_clinic_admin')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[(1, '=', 1)]
</field>
</record>
<record id="allow_injury_access_to_admins" model="ir.rule">
<field name="name">Allow Injury Access to Administrators</field>
<field name="model_id" ref="model_sports_patient_injury"/>
<field name="groups"
eval="[(6, 0, [ref('base.group_system'), ref('bemade_sports_clinic.group_sports_clinic_admin')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[(1, '=', 1)]
</field>
</record>
<record id="allow_patient_contact_access_to_admins" model="ir.rule">
<field name="name">Allow Sports Patient Contact Access to Administrators</field>
<field name="model_id" ref="model_sports_patient_contact"/>
<field name="groups"
eval="[(6, 0, [ref('base.group_system'), ref('bemade_sports_clinic.group_sports_clinic_admin')])]"/>
<field name="perm_create" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_read" eval="True"/>
<field name="perm_unlink" eval="True"/>
<field name="domain_force">
[(1, '=', 1)]
</field>
</record>
</data>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_users_form_inherit" model="ir.ui.view">
<field name="name">view.users.form.inherit</field>
<field name="inherit_id" ref="base.view_users_form"/>
<field name="model">res.users</field>
<field name="arch" type="xml">
<page name="preferences" position="before">
<page name="Sports Team Access"
groups="base.group_system,bemade_sports_clinic.group_sports_clinic_admin">
<field name="accessible_team_ids" widget="many2many_checkboxes"/>
</page>
</page>
</field>
</record>
</odoo>

View file

@ -125,9 +125,17 @@
</field>
</group>
</group>
<separator string="Players"/>
<field name="patient_ids" nolabel="1"
context="{'tree_view_ref': 'bemade_sports_clinic.sports_patient_view_list_embedded'}"/>
<notebook>
<page name="players" string="Players">
<field name="patient_ids" nolabel="1"
context="{'tree_view_ref': 'bemade_sports_clinic.sports_patient_view_list_embedded'}"/>
</page>
<page name="user_access"
string="User Access"
groups="bemade_sports_clinic.group_sports_clinic_admin,base.group_system">
<field name="allowed_user_ids"/>
</page>
</notebook>
</sheet>
</form>
</field>