diff --git a/model_access_rights/README.rst b/model_access_rights/README.rst new file mode 100644 index 000000000..579fb871a --- /dev/null +++ b/model_access_rights/README.rst @@ -0,0 +1,51 @@ +.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg + :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +Hide Create|Delete|Archive|Export Options - Model Wise +====================================================== +* By using this module we can hide the options like create,delete,export,and +archive/un archive in the model which we want. Here we are also able to select +the user groups except Administrator which we want to apply the above hiding +functionality + +Installation +============ + - www.odoo.com/documentation/17.0/setup/install.html + - Install our custom addon + +License +------- +GNU LESSER GENERAL PUBLIC LICENSE, Version 3 (LGPL v3). +(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) + +Company +------- +* `Cybrosys Techno Solutions `__ + +Credits +------- +* Developer: +(v17) Rosmy John, Contact : odoo@cybrosys.com + +Contacts +-------- +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com + +Bug Tracker +----------- +Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. + +Maintainer +========== +.. image:: https://cybrosys.com/images/logo.png + :target: https://cybrosys.com + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit https://www.cybrosys.com + +Further information +=================== +HTML Description: ``__ diff --git a/model_access_rights/__init__.py b/model_access_rights/__init__.py new file mode 100644 index 000000000..097bdb395 --- /dev/null +++ b/model_access_rights/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from . import models diff --git a/model_access_rights/__manifest__.py b/model_access_rights/__manifest__.py new file mode 100644 index 000000000..339615461 --- /dev/null +++ b/model_access_rights/__manifest__.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +{ + 'name': 'Hide Create|Delete|Archive|Export Options - Model Wise', + 'version': '17.0.1.0.0', + 'category': 'Extra Tools, Productivity', + 'summary': """ Can hide options from user """, + 'description': """ By using this module we can hide the options like create, + delete,export,and archive/un archive in the model which we want. Here we + are also able to select the user groups except Administrator which we want + to apply the above hiding functionality """, + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'maintainer': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", + 'depends': ['base_setup', 'mail','web'], + 'data': [ + 'security/security.xml', + 'security/ir.model.access.csv', + 'views/access_right_views.xml', + ], + 'assets': { + 'web.assets_backend': [ + 'model_access_rights//static/src/**/*', + ] + }, + 'images': ['static/description/banner.jpg'], + 'license': 'LGPL-3', + 'installable': True, + 'auto_install': False, + 'application': False, +} diff --git a/model_access_rights/doc/RELEASE_NOTES.md b/model_access_rights/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..f615a83b4 --- /dev/null +++ b/model_access_rights/doc/RELEASE_NOTES.md @@ -0,0 +1,5 @@ +## Module +#### 17.01.2024 +#### Version 17.0.1.0.0 +##### ADD +- Initial Commit for Hide Create|Delete|Archive|Export Options - Model Wise diff --git a/model_access_rights/models/__init__.py b/model_access_rights/models/__init__.py new file mode 100644 index 000000000..1658a4aaa --- /dev/null +++ b/model_access_rights/models/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from . import access_right +from . import models diff --git a/model_access_rights/models/access_right.py b/model_access_rights/models/access_right.py new file mode 100644 index 000000000..062400fbb --- /dev/null +++ b/model_access_rights/models/access_right.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +"""This model is used to detect, which all options want to hide from the + specified group and model""" +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import api, fields, models + + +class ModelAccessRights(models.Model): + """This class is used to detect, which all options want to hide from the + specified group and model""" + _name = 'access.right' + _inherit = 'mail.thread' + _description = 'Manage Modules Access Control' + _rec_name = 'model_id' + + model_id = fields.Many2one('ir.model', ondelete='cascade', required=True, + help="select the model") + groups_id = fields.Many2one('res.groups', required=True, + help="select the group") + is_delete = fields.Boolean(string="Delete", help="hide the delete option") + is_export = fields.Boolean(string="Export", + help="hide the 'Export All'" + " option from list view") + is_create_or_update = fields.Boolean(string="Create/Update", + help="hide the create option from list" + " as well as form view") + is_archive = fields.Boolean(string="Archive/UnArchive", + help="hide the archive option") + + @api.model + def hide_buttons(self): + """This function contains a query that detects which all options want + to hide, in which model,and to which user groups""" + access_right_rec = self.sudo().search_read([], ['model_id', 'is_delete', + 'is_export', + 'is_create_or_update', + 'is_archive', + 'groups_id']) + for dic in access_right_rec: + model = self.env['ir.model'].sudo().browse(dic['model_id'][0]).model + group_name = self.env['ir.model.data'].sudo().search([ + ('model', '=', 'res.groups'), + ('res_id', '=', dic['groups_id'][0]) + ]).name + + module_name = self.env['ir.model.data'].sudo().search([ + ('model', '=', 'res.groups'), + ('res_id', '=', dic['groups_id'][0]) + ]).module + dic.update({ + 'model': model, + 'group_name': group_name, + 'module': module_name + }) + return access_right_rec diff --git a/model_access_rights/models/models.py b/model_access_rights/models/models.py new file mode 100644 index 000000000..9cc2247ac --- /dev/null +++ b/model_access_rights/models/models.py @@ -0,0 +1,307 @@ +# -*- coding: utf-8 -*- +"""This model is used to detect, which all options want to hide from the + specified group and model""" +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2024-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions() +# +# You can modify it under the terms of the GNU LESSER +# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. +# +# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE +# (LGPL v3) along with this program. +# If not, see . +# +############################################################################# +from collections import defaultdict +from operator import attrgetter +from odoo import api, _ +from odoo.exceptions import UserError +from odoo.models import BaseModel, _unlink, LOG_ACCESS_COLUMNS, \ + INSERT_BATCH_SIZE, SQL_DEFAULT +from odoo.tools import OrderedSet, split_every, clean_context, SQL + + +@api.model +def _create(self, data_list): + """ Create records from the stored field values in ``data_list``. """ + assert data_list + cr = self.env.cr + + # insert rows in batches of maximum INSERT_BATCH_SIZE + ids = [] # ids of created records + other_fields = OrderedSet() # non-column fields + + for data_sublist in split_every(INSERT_BATCH_SIZE, data_list): + stored_list = [data['stored'] for data in data_sublist] + fnames = sorted({name for stored in stored_list for name in stored}) + + columns = [] + rows = [[] for _ in stored_list] + for fname in fnames: + field = self._fields[fname] + if field.column_type: + columns.append(fname) + for stored, row in zip(stored_list, rows): + if fname in stored: + colval = field.convert_to_column(stored[fname], self, stored) + if field.translate is True and colval: + if 'en_US' not in colval.adapted: + colval.adapted['en_US'] = next(iter(colval.adapted.values())) + row.append(colval) + else: + row.append(SQL_DEFAULT) + else: + other_fields.add(field) + + if field.type == 'properties': + # force calling fields.create for properties field because + # we might want to update the parent definition + other_fields.add(field) + + if not columns: + # manage the case where we create empty records + columns = ['id'] + for row in rows: + row.append(SQL_DEFAULT) + + cr.execute(SQL( + 'INSERT INTO %s (%s) VALUES %s RETURNING "id"', + SQL.identifier(self._table), + SQL(', ').join(map(SQL.identifier, columns)), + SQL(', ').join(tuple(row) for row in rows), + )) + ids.extend(id_ for id_, in cr.fetchall()) + + # put the new records in cache, and update inverse fields, for many2one + # + # cachetoclear is an optimization to avoid modified()'s cost until other_fields are processed + cachetoclear = [] + records = self.browse(ids) + inverses_update = defaultdict(list) # {(field, value): ids} + common_set_vals = set(LOG_ACCESS_COLUMNS + ['id', 'parent_path']) + for data, record in zip(data_list, records): + data['record'] = record + # DLE P104: test_inherit.py, test_50_search_one2many + vals = dict({k: v for d in data['inherited'].values() for k, v in d.items()}, **data['stored']) + set_vals = common_set_vals.union(vals) + for field in self._fields.values(): + if field.type in ('one2many', 'many2many'): + self.env.cache.set(record, field, ()) + elif field.related and not field.column_type: + self.env.cache.set(record, field, field.convert_to_cache(None, record)) + # DLE P123: `test_adv_activity`, `test_message_assignation_inbox`, `test_message_log`, `test_create_mail_simple`, ... + # Set `mail.message.parent_id` to False in cache so it doesn't do the useless SELECT when computing the modified of `child_ids` + # in other words, if `parent_id` is not set, no other message `child_ids` are impacted. + # + avoid the fetch of fields which are False. e.g. if a boolean field is not passed in vals and as no default set in the field attributes, + # then we know it can be set to False in the cache in the case of a create. + elif field.store and field.name not in set_vals and not field.compute: + self.env.cache.set(record, field, field.convert_to_cache(None, record)) + for fname, value in vals.items(): + field = self._fields[fname] + if field.type in ('one2many', 'many2many'): + cachetoclear.append((record, field)) + else: + cache_value = field.convert_to_cache(value, record) + self.env.cache.set(record, field, cache_value) + if field.type in ('many2one', 'many2one_reference') and self.pool.field_inverses[field]: + inverses_update[(field, cache_value)].append(record.id) + + for (field, value), record_ids in inverses_update.items(): + field._update_inverses(self.browse(record_ids), value) + + # update parent_path + records._parent_store_create() + + # protect fields being written against recomputation + protected = [(data['protected'], data['record']) for data in data_list] + with self.env.protecting(protected): + # mark computed fields as todo + records.modified(self._fields, create=True) + + if other_fields: + # discard default values from context for other fields + others = records.with_context(clean_context(self._context)) + for field in sorted(other_fields, key=attrgetter('_sequence')): + field.create([ + (other, data['stored'][field.name]) + for other, data in zip(others, data_list) + if field.name in data['stored'] + ]) + + # mark fields to recompute + records.modified([field.name for field in other_fields], create=True) + + # if value in cache has not been updated by other_fields, remove it + for record, field in cachetoclear: + if self.env.cache.contains(record, field) and not self.env.cache.get(record, field): + self.env.cache.remove(record, field) + + # check Python constraints for stored fields + records._validate_fields(name for data in data_list for name in data['stored']) + records.check_access_rule('create') + # This is used to restrict the access right to create a record + current_model_id = self.env['ir.model'].sudo().search( + [('model', '=', self._name)]).id + access_right_rec = self.env['access.right'].sudo().search_read( + [('model_id', '=', current_model_id)], + ['model_id', 'is_create_or_update', + 'groups_id']) + if access_right_rec and not self.env.is_admin(): + for rec in access_right_rec: + group_name = self.env['ir.model.data'].sudo().search([ + ('model', '=', 'res.groups'), + ('res_id', '=', rec['groups_id'][0]) + ]).name + module_name = self.env['ir.model.data'].sudo().search([ + ('model', '=', 'res.groups'), + ('res_id', '=', rec['groups_id'][0]) + ]).module + group = module_name + "." + group_name + if self.env.user.has_group(group): + if rec['is_create_or_update']: + raise UserError('You are restricted from performing this' + ' operation. Please contact the' + ' administrator.') + return records + + +@api.model +def unlink(self): + """ unlink() + + Deletes the records in ``self``. + + :raise AccessError: if the user is not allowed to delete all the given records + :raise UserError: if the record is default property for other records + """ + if not self: + return True + + self.check_access_rights('unlink') + self.check_access_rule('unlink') + + from odoo.addons.base.models.ir_model import MODULE_UNINSTALL_FLAG + for func in self._ondelete_methods: + # func._ondelete is True if it should be called during uninstallation + if func._ondelete or not self._context.get(MODULE_UNINSTALL_FLAG): + func(self) + + # TOFIX: this avoids an infinite loop when trying to recompute a + # field, which triggers the recomputation of another field using the + # same compute function, which then triggers again the computation + # of those two fields + for field in self._fields.values(): + self.env.remove_to_compute(field, self) + + self.env.flush_all() + + cr = self._cr + Data = self.env['ir.model.data'].sudo().with_context({}) + Defaults = self.env['ir.default'].sudo() + Property = self.env['ir.property'].sudo() + Attachment = self.env['ir.attachment'].sudo() + ir_property_unlink = Property + ir_model_data_unlink = Data + ir_attachment_unlink = Attachment + + # mark fields that depend on 'self' to recompute them after 'self' has + # been deleted (like updating a sum of lines after deleting one line) + with self.env.protecting(self._fields.values(), self): + self.modified(self._fields, before=True) + + for sub_ids in cr.split_for_in_conditions(self.ids): + records = self.browse(sub_ids) + + # Check if the records are used as default properties. + refs = [f'{self._name},{id_}' for id_ in sub_ids] + default_properties = Property.search( + [('res_id', '=', False), ('value_reference', 'in', refs)]) + if not self._context.get(MODULE_UNINSTALL_FLAG) and default_properties: + raise UserError( + _('Unable to delete this document because it is used as a default property')) + else: + ir_property_unlink |= default_properties + + # Delete the records' properties. + ir_property_unlink |= Property.search([('res_id', 'in', refs)]) + + cr.execute(SQL( + "DELETE FROM %s WHERE id IN %s", + SQL.identifier(self._table), sub_ids, + )) + + # Removing the ir_model_data reference if the record being deleted + # is a record created by xml/csv file, as these are not connected + # with real database foreign keys, and would be dangling references. + # + # Note: the following steps are performed as superuser to avoid + # access rights restrictions, and with no context to avoid possible + # side-effects during admin calls. + data = Data.search( + [('model', '=', self._name), ('res_id', 'in', sub_ids)]) + ir_model_data_unlink |= data + + # For the same reason, remove the defaults having some of the + # records as value + Defaults.discard_records(records) + + # For the same reason, remove the relevant records in ir_attachment + # (the search is performed with sql as the search method of + # ir_attachment is overridden to hide attachments of deleted + # records) + cr.execute(SQL( + "SELECT id FROM ir_attachment WHERE res_model=%s AND res_id IN %s", + self._name, sub_ids, + )) + ir_attachment_unlink |= Attachment.browse( + row[0] for row in cr.fetchall()) + + # invalidate the *whole* cache, since the orm does not handle all + # changes made in the database, like cascading delete! + self.env.invalidate_all(flush=False) + if ir_property_unlink: + ir_property_unlink.unlink() + if ir_model_data_unlink: + ir_model_data_unlink.unlink() + if ir_attachment_unlink: + ir_attachment_unlink.unlink() + + # auditing: deletions are infrequent and leave no trace in the database + _unlink.info('User #%s deleted %s records with IDs: %r', self._uid, + self._name, self.ids) + # This is used to restrict the access right to unlink a record + current_model_id = self.env['ir.model'].sudo().search( + [('model', '=', self._name)]).id + access_right_rec = self.env['access.right'].sudo().search_read( + [('model_id', '=', current_model_id)], ['model_id', 'is_delete', + 'groups_id']) + if access_right_rec and not self.env.is_admin(): + for rec in access_right_rec: + group_name = self.env['ir.model.data'].sudo().search([ + ('model', '=', 'res.groups'), + ('res_id', '=', rec['groups_id'][0]) + ]).name + module_name = self.env['ir.model.data'].sudo().search([ + ('model', '=', 'res.groups'), + ('res_id', '=', rec['groups_id'][0]) + ]).module + group = module_name + "." + group_name + if self.env.user.has_group(group): + if rec['is_delete']: + raise UserError(_('You are restricted from performing this' + ' operation. Please contact the' + ' administrator.')) + return True + + +BaseModel._create = _create +BaseModel.unlink = unlink diff --git a/model_access_rights/security/ir.model.access.csv b/model_access_rights/security/ir.model.access.csv new file mode 100644 index 000000000..78f0cfbc4 --- /dev/null +++ b/model_access_rights/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_access_right,access.access.right,model_access_right,model_access_rights.model_access_rights_groups_configure_model_access,1,1,1,1 diff --git a/model_access_rights/security/security.xml b/model_access_rights/security/security.xml new file mode 100644 index 000000000..824cdd797 --- /dev/null +++ b/model_access_rights/security/security.xml @@ -0,0 +1,9 @@ + + + + + Configure Model Access + + + + diff --git a/model_access_rights/static/description/assets/icons/check.png b/model_access_rights/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/model_access_rights/static/description/assets/icons/check.png differ diff --git a/model_access_rights/static/description/assets/icons/chevron.png b/model_access_rights/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/model_access_rights/static/description/assets/icons/chevron.png differ diff --git a/model_access_rights/static/description/assets/icons/cogs.png b/model_access_rights/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/model_access_rights/static/description/assets/icons/cogs.png differ diff --git a/model_access_rights/static/description/assets/icons/consultation.png b/model_access_rights/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/model_access_rights/static/description/assets/icons/consultation.png differ diff --git a/model_access_rights/static/description/assets/icons/ecom-black.png b/model_access_rights/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/model_access_rights/static/description/assets/icons/ecom-black.png differ diff --git a/model_access_rights/static/description/assets/icons/education-black.png b/model_access_rights/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/model_access_rights/static/description/assets/icons/education-black.png differ diff --git a/model_access_rights/static/description/assets/icons/hotel-black.png b/model_access_rights/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/model_access_rights/static/description/assets/icons/hotel-black.png differ diff --git a/model_access_rights/static/description/assets/icons/license.png b/model_access_rights/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/model_access_rights/static/description/assets/icons/license.png differ diff --git a/model_access_rights/static/description/assets/icons/lifebuoy.png b/model_access_rights/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/model_access_rights/static/description/assets/icons/lifebuoy.png differ diff --git a/model_access_rights/static/description/assets/icons/manufacturing-black.png b/model_access_rights/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/model_access_rights/static/description/assets/icons/manufacturing-black.png differ diff --git a/model_access_rights/static/description/assets/icons/pos-black.png b/model_access_rights/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/model_access_rights/static/description/assets/icons/pos-black.png differ diff --git a/model_access_rights/static/description/assets/icons/puzzle.png b/model_access_rights/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/model_access_rights/static/description/assets/icons/puzzle.png differ diff --git a/model_access_rights/static/description/assets/icons/restaurant-black.png b/model_access_rights/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/model_access_rights/static/description/assets/icons/restaurant-black.png differ diff --git a/model_access_rights/static/description/assets/icons/service-black.png b/model_access_rights/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/model_access_rights/static/description/assets/icons/service-black.png differ diff --git a/model_access_rights/static/description/assets/icons/trading-black.png b/model_access_rights/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/model_access_rights/static/description/assets/icons/trading-black.png differ diff --git a/model_access_rights/static/description/assets/icons/training.png b/model_access_rights/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/model_access_rights/static/description/assets/icons/training.png differ diff --git a/model_access_rights/static/description/assets/icons/update.png b/model_access_rights/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/model_access_rights/static/description/assets/icons/update.png differ diff --git a/model_access_rights/static/description/assets/icons/user.png b/model_access_rights/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/model_access_rights/static/description/assets/icons/user.png differ diff --git a/model_access_rights/static/description/assets/icons/wrench.png b/model_access_rights/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/model_access_rights/static/description/assets/icons/wrench.png differ diff --git a/model_access_rights/static/description/assets/misc/Cybrosys R.png b/model_access_rights/static/description/assets/misc/Cybrosys R.png new file mode 100644 index 000000000..da4058087 Binary files /dev/null and b/model_access_rights/static/description/assets/misc/Cybrosys R.png differ diff --git a/model_access_rights/static/description/assets/misc/categories.png b/model_access_rights/static/description/assets/misc/categories.png new file mode 100644 index 000000000..bedf1e0b1 Binary files /dev/null and b/model_access_rights/static/description/assets/misc/categories.png differ diff --git a/model_access_rights/static/description/assets/misc/check-box.png b/model_access_rights/static/description/assets/misc/check-box.png new file mode 100644 index 000000000..42caf24b9 Binary files /dev/null and b/model_access_rights/static/description/assets/misc/check-box.png differ diff --git a/model_access_rights/static/description/assets/misc/compass.png b/model_access_rights/static/description/assets/misc/compass.png new file mode 100644 index 000000000..d5fed8faa Binary files /dev/null and b/model_access_rights/static/description/assets/misc/compass.png differ diff --git a/model_access_rights/static/description/assets/misc/corporate.png b/model_access_rights/static/description/assets/misc/corporate.png new file mode 100644 index 000000000..2eb13edbf Binary files /dev/null and b/model_access_rights/static/description/assets/misc/corporate.png differ diff --git a/model_access_rights/static/description/assets/misc/customer-support.png b/model_access_rights/static/description/assets/misc/customer-support.png new file mode 100644 index 000000000..79efc72ed Binary files /dev/null and b/model_access_rights/static/description/assets/misc/customer-support.png differ diff --git a/model_access_rights/static/description/assets/misc/cybrosys-logo.png b/model_access_rights/static/description/assets/misc/cybrosys-logo.png new file mode 100644 index 000000000..cc3cc0ccf Binary files /dev/null and b/model_access_rights/static/description/assets/misc/cybrosys-logo.png differ diff --git a/model_access_rights/static/description/assets/misc/email.svg b/model_access_rights/static/description/assets/misc/email.svg new file mode 100644 index 000000000..15291cdc3 --- /dev/null +++ b/model_access_rights/static/description/assets/misc/email.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/model_access_rights/static/description/assets/misc/features.png b/model_access_rights/static/description/assets/misc/features.png new file mode 100644 index 000000000..b41769f77 Binary files /dev/null and b/model_access_rights/static/description/assets/misc/features.png differ diff --git a/model_access_rights/static/description/assets/misc/logo.png b/model_access_rights/static/description/assets/misc/logo.png new file mode 100644 index 000000000..478462d3e Binary files /dev/null and b/model_access_rights/static/description/assets/misc/logo.png differ diff --git a/model_access_rights/static/description/assets/misc/phone.svg b/model_access_rights/static/description/assets/misc/phone.svg new file mode 100644 index 000000000..b7bd7f251 --- /dev/null +++ b/model_access_rights/static/description/assets/misc/phone.svg @@ -0,0 +1,3 @@ + + + diff --git a/model_access_rights/static/description/assets/misc/pictures.png b/model_access_rights/static/description/assets/misc/pictures.png new file mode 100644 index 000000000..56d255fe9 Binary files /dev/null and b/model_access_rights/static/description/assets/misc/pictures.png differ diff --git a/model_access_rights/static/description/assets/misc/pie-chart.png b/model_access_rights/static/description/assets/misc/pie-chart.png new file mode 100644 index 000000000..426e05244 Binary files /dev/null and b/model_access_rights/static/description/assets/misc/pie-chart.png differ diff --git a/model_access_rights/static/description/assets/misc/right-arrow.png b/model_access_rights/static/description/assets/misc/right-arrow.png new file mode 100644 index 000000000..730984a06 Binary files /dev/null and b/model_access_rights/static/description/assets/misc/right-arrow.png differ diff --git a/model_access_rights/static/description/assets/misc/star (1) 2.svg b/model_access_rights/static/description/assets/misc/star (1) 2.svg new file mode 100644 index 000000000..5ae9f507a --- /dev/null +++ b/model_access_rights/static/description/assets/misc/star (1) 2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/model_access_rights/static/description/assets/misc/star.png b/model_access_rights/static/description/assets/misc/star.png new file mode 100644 index 000000000..2eb9ab29f Binary files /dev/null and b/model_access_rights/static/description/assets/misc/star.png differ diff --git a/model_access_rights/static/description/assets/misc/support (1) 1.svg b/model_access_rights/static/description/assets/misc/support (1) 1.svg new file mode 100644 index 000000000..7d37a8f30 --- /dev/null +++ b/model_access_rights/static/description/assets/misc/support (1) 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/model_access_rights/static/description/assets/misc/support-email.svg b/model_access_rights/static/description/assets/misc/support-email.svg new file mode 100644 index 000000000..eb70370d6 --- /dev/null +++ b/model_access_rights/static/description/assets/misc/support-email.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/model_access_rights/static/description/assets/misc/support.png b/model_access_rights/static/description/assets/misc/support.png new file mode 100644 index 000000000..4f18b8b82 Binary files /dev/null and b/model_access_rights/static/description/assets/misc/support.png differ diff --git a/model_access_rights/static/description/assets/misc/tick-mark.svg b/model_access_rights/static/description/assets/misc/tick-mark.svg new file mode 100644 index 000000000..2dbb40187 --- /dev/null +++ b/model_access_rights/static/description/assets/misc/tick-mark.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/model_access_rights/static/description/assets/misc/whatsapp 1.svg b/model_access_rights/static/description/assets/misc/whatsapp 1.svg new file mode 100644 index 000000000..0bfaf8fc6 --- /dev/null +++ b/model_access_rights/static/description/assets/misc/whatsapp 1.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/model_access_rights/static/description/assets/misc/whatsapp.png b/model_access_rights/static/description/assets/misc/whatsapp.png new file mode 100644 index 000000000..d513a5356 Binary files /dev/null and b/model_access_rights/static/description/assets/misc/whatsapp.png differ diff --git a/model_access_rights/static/description/assets/misc/whatsapp.svg b/model_access_rights/static/description/assets/misc/whatsapp.svg new file mode 100644 index 000000000..b618aea1d --- /dev/null +++ b/model_access_rights/static/description/assets/misc/whatsapp.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/model_access_rights/static/description/assets/modules/1.png b/model_access_rights/static/description/assets/modules/1.png new file mode 100644 index 000000000..ba1058c42 Binary files /dev/null and b/model_access_rights/static/description/assets/modules/1.png differ diff --git a/model_access_rights/static/description/assets/modules/2.png b/model_access_rights/static/description/assets/modules/2.png new file mode 100644 index 000000000..6949185dd Binary files /dev/null and b/model_access_rights/static/description/assets/modules/2.png differ diff --git a/model_access_rights/static/description/assets/modules/3.png b/model_access_rights/static/description/assets/modules/3.png new file mode 100644 index 000000000..4e506f79b Binary files /dev/null and b/model_access_rights/static/description/assets/modules/3.png differ diff --git a/model_access_rights/static/description/assets/modules/4.png b/model_access_rights/static/description/assets/modules/4.png new file mode 100644 index 000000000..e78427938 Binary files /dev/null and b/model_access_rights/static/description/assets/modules/4.png differ diff --git a/model_access_rights/static/description/assets/modules/5.gif b/model_access_rights/static/description/assets/modules/5.gif new file mode 100644 index 000000000..2a5f8e659 Binary files /dev/null and b/model_access_rights/static/description/assets/modules/5.gif differ diff --git a/model_access_rights/static/description/assets/modules/5.png b/model_access_rights/static/description/assets/modules/5.png new file mode 100755 index 000000000..272ec20f9 Binary files /dev/null and b/model_access_rights/static/description/assets/modules/5.png differ diff --git a/model_access_rights/static/description/assets/modules/6.png b/model_access_rights/static/description/assets/modules/6.png new file mode 100644 index 000000000..7d5c3154f Binary files /dev/null and b/model_access_rights/static/description/assets/modules/6.png differ diff --git a/model_access_rights/static/description/assets/modules/l2.png b/model_access_rights/static/description/assets/modules/l2.png new file mode 100644 index 000000000..f40a0756d Binary files /dev/null and b/model_access_rights/static/description/assets/modules/l2.png differ diff --git a/model_access_rights/static/description/assets/modules/l3.png b/model_access_rights/static/description/assets/modules/l3.png new file mode 100644 index 000000000..5738a486e Binary files /dev/null and b/model_access_rights/static/description/assets/modules/l3.png differ diff --git a/model_access_rights/static/description/assets/modules/l4.png b/model_access_rights/static/description/assets/modules/l4.png new file mode 100644 index 000000000..8d99e8c68 Binary files /dev/null and b/model_access_rights/static/description/assets/modules/l4.png differ diff --git a/model_access_rights/static/description/assets/modules/l5.png b/model_access_rights/static/description/assets/modules/l5.png new file mode 100644 index 000000000..3415917c2 Binary files /dev/null and b/model_access_rights/static/description/assets/modules/l5.png differ diff --git a/model_access_rights/static/description/assets/modules/l6.png b/model_access_rights/static/description/assets/modules/l6.png new file mode 100644 index 000000000..c7ea331ee Binary files /dev/null and b/model_access_rights/static/description/assets/modules/l6.png differ diff --git a/model_access_rights/static/description/assets/screenshots/hero.gif b/model_access_rights/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..77b2aeb9a Binary files /dev/null and b/model_access_rights/static/description/assets/screenshots/hero.gif differ diff --git a/model_access_rights/static/description/assets/screenshots/model_access_right_01.png b/model_access_rights/static/description/assets/screenshots/model_access_right_01.png new file mode 100644 index 000000000..ad7d11567 Binary files /dev/null and b/model_access_rights/static/description/assets/screenshots/model_access_right_01.png differ diff --git a/model_access_rights/static/description/assets/screenshots/model_access_right_02.png b/model_access_rights/static/description/assets/screenshots/model_access_right_02.png new file mode 100644 index 000000000..9586c219d Binary files /dev/null and b/model_access_rights/static/description/assets/screenshots/model_access_right_02.png differ diff --git a/model_access_rights/static/description/assets/screenshots/model_access_right_03.png b/model_access_rights/static/description/assets/screenshots/model_access_right_03.png new file mode 100644 index 000000000..c7f1ba115 Binary files /dev/null and b/model_access_rights/static/description/assets/screenshots/model_access_right_03.png differ diff --git a/model_access_rights/static/description/assets/screenshots/model_access_right_04.png b/model_access_rights/static/description/assets/screenshots/model_access_right_04.png new file mode 100644 index 000000000..a8f864a23 Binary files /dev/null and b/model_access_rights/static/description/assets/screenshots/model_access_right_04.png differ diff --git a/model_access_rights/static/description/assets/screenshots/model_access_right_05.png b/model_access_rights/static/description/assets/screenshots/model_access_right_05.png new file mode 100644 index 000000000..26d4d4afc Binary files /dev/null and b/model_access_rights/static/description/assets/screenshots/model_access_right_05.png differ diff --git a/model_access_rights/static/description/assets/screenshots/model_access_right_06.png b/model_access_rights/static/description/assets/screenshots/model_access_right_06.png new file mode 100644 index 000000000..47fdd9883 Binary files /dev/null and b/model_access_rights/static/description/assets/screenshots/model_access_right_06.png differ diff --git a/model_access_rights/static/description/assets/screenshots/model_access_right_07.png b/model_access_rights/static/description/assets/screenshots/model_access_right_07.png new file mode 100644 index 000000000..1c1ae9635 Binary files /dev/null and b/model_access_rights/static/description/assets/screenshots/model_access_right_07.png differ diff --git a/model_access_rights/static/description/assets/screenshots/model_access_right_08.png b/model_access_rights/static/description/assets/screenshots/model_access_right_08.png new file mode 100644 index 000000000..292a22f73 Binary files /dev/null and b/model_access_rights/static/description/assets/screenshots/model_access_right_08.png differ diff --git a/model_access_rights/static/description/assets/video/master_search.mp4 b/model_access_rights/static/description/assets/video/master_search.mp4 new file mode 100644 index 000000000..0e29d26e1 Binary files /dev/null and b/model_access_rights/static/description/assets/video/master_search.mp4 differ diff --git a/model_access_rights/static/description/assets/video/master_search.webm b/model_access_rights/static/description/assets/video/master_search.webm new file mode 100644 index 000000000..357c7d058 Binary files /dev/null and b/model_access_rights/static/description/assets/video/master_search.webm differ diff --git a/model_access_rights/static/description/banner.jpg b/model_access_rights/static/description/banner.jpg new file mode 100644 index 000000000..b54c849a1 Binary files /dev/null and b/model_access_rights/static/description/banner.jpg differ diff --git a/model_access_rights/static/description/icon.png b/model_access_rights/static/description/icon.png new file mode 100644 index 000000000..c4fa84cc4 Binary files /dev/null and b/model_access_rights/static/description/icon.png differ diff --git a/model_access_rights/static/description/index.html b/model_access_rights/static/description/index.html new file mode 100644 index 000000000..c6ead4157 --- /dev/null +++ b/model_access_rights/static/description/index.html @@ -0,0 +1,774 @@ + + + + + + Odoo App 3 Index + + + + + + + + +
+
+
+
+
+ +
+
+
+ Community +
+
+ Enterprise +
+
+ Odoo.sh +
+
+
+
+
+
+

+ Hide Create|Delete|Archive|Export Options - Model Wise

+

+ Hide Create, Delete, Archive, Export Options in Models. +

+
+ +
+
+
+
+
+

+ Key Highlights +

+
+
+
+
+
+ +
+
+

+ Easily hide the options like Create,Delete,Export and Archive/UnArchive

+
+
+
+
+
+
+ +
+
+

+ Can hide the options for specific model.

+
+
+
+
+
+
+ +
+
+

+ Can hide the options for specific user group.

+
+
+
+
+
+
+ +
+
+

+ No additional configuration needed.

+
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+

+ Go to Settings > Users and there you can see the Configure Model Access, by enabling that + option and refresh the page, you can see a new menu named 'Restrict Access Rights'.

+
+
+
+
+
+
+ +
+
+

+ User in the Purchase module.

+
+
+
+
+
+
+ +
+
+

+ Select the Model, Groups and the options which we want to hide.

+
+
+
+
+
+
+ + +
+
+

+ We can see Create option is hidden in purchase.order to those who are User + in purchase module.

+
+
+
+
+
+
+ +
+
+

+ Select the delete option which we want to hide.

+
+
+
+
+
+
+ +
+
+

+ Delete functionality are hidden.

+
+
+
+
+
+
+ +
+
+

+ Select the options which we want to hide.

+
+
+
+
+
+
+ +
+
+

+ Export functionality are hidden.

+
+
+
+
+ +
+
+
    +
  • + Easily hide the options like Create,Delete,Export +
  • +
+
+
+
+
+
+
Version + 17.0.1.0.0|Released on:15th January 2024 +
+

+ + Initial Commit for Hide Create|Delete|Archive|Export Options - Model Wise.

+
+
+
+
+
+
+
+

+ Related Products

+
+
+ +
+
+

+ Our Services

+ +
+
+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Customization

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Support

+
+
+
+
+
+
+ service-icon +
+
+

Hire + Odoo Developer

+
+
+
+
+ +
+
+ service-icon +
+
+

Odoo + Integration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Migration

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Consultancy

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Implementation

+
+
+
+
+
+
+ service-icon +
+
+

Odoo + Licensing Consultancy

+
+
+
+
+
+
+

+ Our Industries

+ +
+
+
+
+
+
+ +

Trading

+

Easily procure and sell your products

+
+
+
+
+ +

POS

+

Easy configuration and convivial experience

+
+
+
+
+ +

+ Education

+

A platform for educational management

+
+
+
+
+ +

+ Manufacturing

+

Plan, track and schedule your operations

+
+
+
+
+ +

E-commerce & + Website

+

Mobile friendly, awe-inspiring product pages

+
+
+
+
+ +

Service + Management

+

Keep track of services and invoice

+
+
+
+
+ +

+ Restaurant

+

Run your bar or restaurant methodically

+
+
+
+
+ +

Hotel + Management

+

An all-inclusive hotel management application

+
+
+
+
+
+
+

+ Support

+
+
+
+
+
+
+
+ +
+ Need + Help? +

Got + questions or need help? Get in touch.

+
odoo@cybrosys.com +
+
+
+
+
+
+
+
+ +
+ WhatsApp +

Say hi to + us on WhatsApp!

+
+91 + 99456767686 +
+
+
+
+
+
+
+
+
+ + + + + + diff --git a/model_access_rights/static/src/views/form_controller.js b/model_access_rights/static/src/views/form_controller.js new file mode 100644 index 000000000..3156c362b --- /dev/null +++ b/model_access_rights/static/src/views/form_controller.js @@ -0,0 +1,39 @@ +/** @odoo-module */ +/** + * This file will used to hide the selected options from the form view + */ +import { FormController} from "@web/views/form/form_controller"; +import { patch} from "@web/core/utils/patch"; +const { onWillStart} = owl; +patch(FormController.prototype,{ +/** + * This function will used to hide the selected options from the form view + */ + setup() { + super.setup(...arguments); + this.rpc = this.env.services.rpc + onWillStart(async () => { + var self = this + var result; + result = await this.env.services.orm.silent.call( + "access.right", + "hide_buttons", + ); + for (var i = 0; i < result.length; i++) { + var group = result[i].module + "." + result[i].group_name + if (self.props.resModel == result[i].model) { + if (await self.user.hasGroup(group)) { + if (!this.user.isAdmin) { + if (result[i].is_create_or_update) { + self.canCreate = false + } + if (result[i].is_delete) { + this.archInfo.activeActions.delete = false + } + } + } + } + } + }); + } +}); diff --git a/model_access_rights/static/src/views/kanban_controller.js b/model_access_rights/static/src/views/kanban_controller.js new file mode 100644 index 000000000..de65ac2a8 --- /dev/null +++ b/model_access_rights/static/src/views/kanban_controller.js @@ -0,0 +1,40 @@ +/** @odoo-module */ +/** + * This file will used to hide the selected options from the list view + */ +import { KanbanController } from '@web/views/kanban/kanban_controller'; +import { patch} from "@web/core/utils/patch"; +const {onWillStart} = owl; +patch(KanbanController.prototype,{ +/** + * This function will used to hide the selected options from the Kanban view + */ + setup() { + super.setup(...arguments); + this.rpc = this.env.services.rpc + onWillStart(async () => { + var self = this + var result; + result = await this.env.services.orm.silent.call( + "access.right", + "hide_buttons", + ); + for (var i = 0; i < result.length; i++) { + var group = result[i].module + "." + result[i].group_name + if (self.props.resModel == result[i].model) { + if (await self.model.user.hasGroup(group)) { + if (!self.model.user.isAdmin) { + if (result[i].is_create_or_update) { + self.props.archInfo.activeActions.create=false + self.props.archInfo.activeActions.edit=false + } + if (result[i].is_delete) { + self.props.archInfo.activeActions.delete=false + } + } + } + } + } + }); + } +}); diff --git a/model_access_rights/static/src/views/list_controller.js b/model_access_rights/static/src/views/list_controller.js new file mode 100644 index 000000000..095f27f15 --- /dev/null +++ b/model_access_rights/static/src/views/list_controller.js @@ -0,0 +1,43 @@ +/** @odoo-module */ +/** + * This file will used to hide the selected options from the list view + */ +import { ListController} from '@web/views/list/list_controller'; +import { patch} from "@web/core/utils/patch"; +const {onWillStart} = owl; +patch(ListController.prototype, { +/** + * This function will used to hide the selected options from the list view + */ + setup() { + super.setup(...arguments); + this.rpc = this.env.services.rpc + onWillStart(async () => { + var self = this + var result; + result = await this.env.services.orm.silent.call( + "access.right", + "hide_buttons", + ); + for (var i = 0; i < result.length; i++) { + var group = result[i].module + "." + result[i].group_name + if (self.props.resModel == result[i].model) { + if (await self.userService.hasGroup(group)) { + if (!this.userService.isAdmin) { + if (result[i].is_create_or_update) { + self.activeActions.create = false; + } + if (result[i].is_export) { + self.isExportEnable = false + self.isExportEnable = false + } + if (result[i].is_delete) { + self.activeActions.delete = false; + } + } + } + } + } + }); + } +}); diff --git a/model_access_rights/views/access_right_views.xml b/model_access_rights/views/access_right_views.xml new file mode 100644 index 000000000..945acf1af --- /dev/null +++ b/model_access_rights/views/access_right_views.xml @@ -0,0 +1,58 @@ + + + + + Restrict Access Rights + access.right + tree,form + + + + access.right.view.tree + access.right + + + + + + + + + + + + + + access.right.view.form + access.right + +
+ + + + + + + + + + + + + + +
+ + +
+
+
+
+ + +