On-call Scheduling Security ModelDescription On-call Scheduling Security Model Overview Have you ever tried delegating the rota_manager for the same user from multiple groups? sys_user_has_role only has 1 entry for the first group. This works as designed. Those designated with the rota_manager role can edit Rotas and the associated rosters for the Rota in situations where they are the manager of the Rota group. The rota_admin role needs granted to update Rotas without being a manager of the group. Here is how the security model for Rotas works: ADMIN - Access to everything in the system including Rota rota_admin - Basic CRUD operation for Rota records rota_manager + group manager/ delegate - Ability to CRUD only to that groups' records Delegate Roles To delegate roles, the manager in this case, must be a role_delegator. This is completed by visiting the following module in the navigator: User Administration > Role Delegation > Delegate Roles In Group To delegate roles as a role_delegator, visit the following module in the navigator: User Administration > Role Delegation > Designate Role Delegation The manager can then give a member the rota_manager role, and this generates a sys_user_has_role record specifying the role has been granted by the group. This user is now able to maintain the rotations for that group only, because it has been granted by that group only. To modify the above behavior, investigate the OnCallSecurityNG script include, specifically the rotaMgrAccess function as this determines whether a groups Rotas should be editable in the calendar. The helper function uses the platform (gs.hasRoleInGroup) to check whether the user has been granted the role by the current group. <!-- div.margin{ padding: 10px 40px 5px 30px; } table.tocTable{ border: 1px solid; border-color:#E0E0E0; background-color: rgb(245, 245, 245); padding-top: .6em; padding-bottom: .6em; padding-left: .9em; padding-right: .6em; } table.noteTable{ border:1px solid; border-color:#E0E0E0; background-color: rgb(245, 245, 245); width: 100%; border-spacing:2; } table.internalTable{ border:1px solid; border-color:#E0E0E0; background-color: rgb(245, 245, 245); width: 100%; border-spacing:0; } .sp td{ border-bottom: 1px solid; border-right: 1px solid; border-color:#E0E0E0; background-color: #ffffff; height: 20px; padding-top: .5em; padding-bottom: .5em; padding-left: .5em; padding-right: .5em; } .sphr td{ border-right: 1px solid; border-bottom: 1px solid; border-color:#E0E0E0; background-color: rgb(245, 245, 245); padding-top: .5em; padding-bottom: .5em; padding-left: .5em; padding-right: .5em; height: 20px; } .title { color: #D1232B; font-weight:; font-size:25px; } .hd1{ color: #D1232B; font-weight:; font-size:18px; } .hd2{ color: #646464; font-weight:bold; font-size:16px; } .hd3{ color: #7a7a7a; font-weight:; font-size:16 px; text-decoration:; } .hd4{ color: #000000; font-weight:bold; font-size:14 px; text-decoration:; } -->