You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
6.1 KiB
138 lines
6.1 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2025-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
|
|
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
|
|
#
|
|
# You can modify it under the terms of the GNU AFFERO
|
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
# (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class RoleManagement(models.Model):
|
|
"""Manages access roles, permissions, and system restrictions for users."""
|
|
_name = 'role.management'
|
|
_description = 'Role Management'
|
|
_inherit = ['mail.thread']
|
|
|
|
name = fields.Char(string='Name', required=True)
|
|
domain_ids = fields.Many2many('domain.model')
|
|
is_debug = fields.Boolean(
|
|
string='Disable Debug Mode',
|
|
help='Disable the option to enable debug mode for the user')
|
|
is_chatter = fields.Boolean(
|
|
string='Disable chatter',
|
|
help='Disable chatter for the role'
|
|
)
|
|
is_readonly = fields.Boolean(
|
|
string='Make System ReadOnly',
|
|
help='Make system readonly'
|
|
)
|
|
role_ids = fields.Many2many('access.role', string='Roles',
|
|
domain="[('id','not in', selected_role_ids)]")
|
|
menu_ids = fields.Many2many('ir.ui.menu', domain="[('id','not in', access_role_menu_ids)]")
|
|
access_role_menu_ids = fields.Many2many('ir.ui.menu', compute='_compute_access_role_menu_ids')
|
|
selected_role_ids = fields.Many2many('access.role',
|
|
compute='_compute_selected_role_ids')
|
|
field_access_ids = fields.One2many('field.access', 'access_field_id')
|
|
model_access_ids = fields.One2many('field.access', 'access_model_id')
|
|
button_access_ids = fields.One2many('field.access', 'button_access_id')
|
|
domain_access_ids = fields.One2many('field.access', 'domain_access_id')
|
|
filter_access_ids = fields.One2many('field.access', 'filter_access_id')
|
|
|
|
@api.depends('role_ids')
|
|
def _compute_selected_role_ids(self):
|
|
"""Compute selected roles to prevent duplicate role assignments."""
|
|
for record in self:
|
|
record.selected_role_ids = self.search([]).mapped('role_ids').ids
|
|
for role in record.role_ids:
|
|
role.role_management_id = record.id
|
|
|
|
@api.depends('menu_ids')
|
|
def _compute_access_role_menu_ids(self):
|
|
"""Compute access roles menu id to prevent the menu from hiding."""
|
|
menu_id = self.env.ref('access_roles.access_role_menu_root').id
|
|
self.access_role_menu_ids = [fields.Command.link(menu_id)]
|
|
|
|
@api.model
|
|
def get_role_restrictions(self, user_id):
|
|
user = self.env.user
|
|
role_management = user.access_role_id.role_management_id
|
|
if role_management:
|
|
return {'is_debug':role_management.is_debug, 'is_chatter': role_management.is_chatter}
|
|
|
|
@api.model
|
|
def get_export_restrictions(self, user_id):
|
|
"""Retrieve model-based restrictions for a user.
|
|
This function is used to determine which export, archive, reports,
|
|
and actions should be hidden for the user based on their assigned
|
|
access role. The data is passed to the JavaScript file for frontend
|
|
enforcement.
|
|
:param int user_id: The ID of the user for whom restrictions are being retrieved.
|
|
:return: A list of dictionaries containing model-specific restrictions.
|
|
:rtype: list of dict
|
|
"""
|
|
user = self.env.user
|
|
if not user.access_role_id or not user.access_role_id.role_management_id:
|
|
return []
|
|
return user.access_role_id.role_management_id.model_access_ids.mapped(
|
|
lambda r: {"model": r.model_id.model, "is_hide_export": r.is_hide_export,
|
|
"is_hide_archive": r.is_hide_archive,
|
|
"report_id": r.hide_report_ids.ids,
|
|
"action_id": r.hide_actions_ids.ids}
|
|
)
|
|
|
|
@api.model
|
|
def check_model_access_restrictions(self, user_id, model_name):
|
|
"""
|
|
Check if create access and readonly mode are restricted for the user on a specific model.
|
|
:param user_id: ID of the user to check
|
|
:param model_name: Technical name of the model to check
|
|
:return: Dictionary containing is_hide_create and is_model_readonly
|
|
"""
|
|
user = self.env.user
|
|
role_management = user.access_role_id.role_management_id
|
|
access_data = {}
|
|
if role_management:
|
|
model_access = role_management.model_access_ids.filtered(
|
|
lambda r: r.model_id.model == model_name
|
|
)
|
|
if model_access:
|
|
access_data['is_hide_create'] = any(model_access.mapped('is_hide_create'))
|
|
access_data['is_model_readonly'] = any(
|
|
model_access.mapped('is_model_readonly'))
|
|
return access_data
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
"""Override create to automatically link roles with role management records."""
|
|
records = super(RoleManagement, self).create(vals_list)
|
|
for record in records:
|
|
for role in record.role_ids:
|
|
if not role.role_management_id:
|
|
role.write({'role_management_id': record.id})
|
|
return records
|
|
|
|
def action_open_domain_form(self):
|
|
"""Opens the domain form when clicking on domain_id"""
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'name': 'Domain Configuration',
|
|
'res_model': 'domain.model',
|
|
'view_mode': 'form',
|
|
'res_id': self.domain_access_ids.domain_id.id,
|
|
'target': 'new'
|
|
}
|