diff --git a/model_access_rights/README.rst b/model_access_rights/README.rst index 48f5ef657..13342848b 100644 --- a/model_access_rights/README.rst +++ b/model_access_rights/README.rst @@ -1,30 +1,37 @@ -Model Access Rights -=================== -* Model Access Rights for Odoo 16 community editions +.. 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/16.0/setup/install.html - - Install our custom addon + - www.odoo.com/documentation/16.0/setup/install.html + - Install our custom addon License ------- -General Public License, Version 3 (LGPL v3). -(https://www.odoo.com/documentation/user/16.0/legal/licenses/licenses.html) +GNU LESSER GENERAL PUBLIC LICENSE, Version 3 (LGPL v3). +(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) Company ------- -* 'Cybrosys Techno Solutions `__ +* `Cybrosys Techno Solutions `__ Credits ------- * Developer: -(v16) Anjana P V @ Cybrosys - +(v16) Anjana P V @ Cybrosys, Contact : odoo@cybrosys.com Contacts -------- * Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com Bug Tracker ----------- @@ -32,6 +39,9 @@ Bugs are tracked on GitHub Issues. In case of trouble, please check there if you 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 @@ -39,4 +49,3 @@ For support and more information, please visit https://www.cybrosys.com Further information =================== HTML Description: ``__ - diff --git a/model_access_rights/__manifest__.py b/model_access_rights/__manifest__.py index ea32f9820..5f4729d9c 100644 --- a/model_access_rights/__manifest__.py +++ b/model_access_rights/__manifest__.py @@ -20,34 +20,32 @@ # ############################################################################# { - 'name': 'Model Access Rights', + 'name': 'Hide Create|Delete|Archive|Export Options - Model Wise', 'version': '16.0.1.0.0', - 'category': 'Others', + 'category': 'Extra Tools, Productivity', 'summary': """ Can hide options from user """, - 'description': """Can hide options according to specific model - and access group """, + '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', - ], + 'depends': ['base_setup', 'mail'], 'data': [ 'security/security.xml', 'security/ir.model.access.csv', - 'data/ir_sequence_data.xml', 'views/model_access_rights_views.xml', ], 'assets': { 'web.assets_backend': [ 'model_access_rights/static/src/js/form_controller.js', 'model_access_rights/static/src/js/list_controller.js', + 'model_access_rights/static/src/js/kanban_controller.js' ] }, - - 'images': ['static/description/banner.png'], + 'images': ['static/description/banner.jpg'], 'license': 'LGPL-3', 'installable': True, 'auto_install': False, diff --git a/model_access_rights/data/ir_sequence_data.xml b/model_access_rights/data/ir_sequence_data.xml deleted file mode 100644 index 0cb302588..000000000 --- a/model_access_rights/data/ir_sequence_data.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Model Access Right - access.right - MAR - 5 - - - \ No newline at end of file diff --git a/model_access_rights/doc/RELEASE_NOTES.md b/model_access_rights/doc/RELEASE_NOTES.md index 82b87eeac..28c2ff2aa 100644 --- a/model_access_rights/doc/RELEASE_NOTES.md +++ b/model_access_rights/doc/RELEASE_NOTES.md @@ -1,9 +1,5 @@ ## Module - -#### 20.02.2023 +#### 8.11.2023 #### Version 16.0.1.0.0 ##### ADD - -- Initial Commit for model_access_rights - - +- 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 index 58bafa3bb..1ba0c1cd1 100644 --- a/model_access_rights/models/__init__.py +++ b/model_access_rights/models/__init__.py @@ -20,3 +20,4 @@ # ############################################################################# from . import model_access_rights +from . import models diff --git a/model_access_rights/models/model_access_rights.py b/model_access_rights/models/model_access_rights.py index e8d1b99a1..57924f7b6 100644 --- a/model_access_rights/models/model_access_rights.py +++ b/model_access_rights/models/model_access_rights.py @@ -21,7 +21,7 @@ # If not, see . # ############################################################################# -from odoo import models, fields, api, _ +from odoo import api, fields, models, _ class ModelAccessRights(models.Model): @@ -30,6 +30,7 @@ class ModelAccessRights(models.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") @@ -44,17 +45,6 @@ class ModelAccessRights(models.Model): " as well as form view") is_archive = fields.Boolean(string="Archive/UnArchive", help="hide the archive option") - name = fields.Char(string='Order Reference', readonly=True, - default=lambda self: _('New')) - - @api.model - def create(self, vals): - """This function is used to create the sequence number for this model""" - if vals.get('name', _('New')) == _('New'): - vals['name'] = self.env['ir.sequence'].next_by_code( - 'access.right') or _('New') - res = super(ModelAccessRights, self).create(vals) - return res @api.model def hide_buttons(self): diff --git a/model_access_rights/models/models.py b/model_access_rights/models/models.py new file mode 100644 index 000000000..e2de02967 --- /dev/null +++ b/model_access_rights/models/models.py @@ -0,0 +1,315 @@ +# -*- 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) 2023-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, attrgetter, clean_context + + +@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) + + header = ", ".join(f'"{column}"' for column in columns) + template = ", ".join("%s" for _ in rows) + cr.execute( + f'INSERT INTO "{self._table}" ({header}) VALUES {template} RETURNING "id"', + [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 + [self.CONCURRENCY_CHECK_FIELD, '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.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] + if Property.search( + [('res_id', '=', False), ('value_reference', 'in', refs)], + limit=1): + raise UserError( + _('Unable to delete this document because it is used as a default property')) + + # Delete the records' properties. + ir_property_unlink |= Property.search([('res_id', 'in', refs)]) + + query = f'DELETE FROM "{self._table}" WHERE id IN %s' + cr.execute(query, (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) + query = 'SELECT id FROM ir_attachment WHERE res_model=%s AND res_id IN %s' + cr.execute(query, (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() + # DLE P93: flush after the unlink, for recompute fields depending on + # the modified of the unlink + self.env.flush_all() + # 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 index a9c391316..78f0cfbc4 100644 --- a/model_access_rights/security/ir.model.access.csv +++ b/model_access_rights/security/ir.model.access.csv @@ -1,2 +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.group_model_access_control,1,1,1,1 +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 index b23564939..824cdd797 100644 --- a/model_access_rights/security/security.xml +++ b/model_access_rights/security/security.xml @@ -1,6 +1,7 @@ + - + Configure Model Access diff --git a/model_access_rights/static/description/assets/modules/1.png b/model_access_rights/static/description/assets/modules/1.png index 5238bdeab..d0f36b007 100644 Binary files a/model_access_rights/static/description/assets/modules/1.png 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 deleted file mode 100644 index 1ae7cfe3b..000000000 Binary files a/model_access_rights/static/description/assets/modules/2.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/modules/3.png b/model_access_rights/static/description/assets/modules/3.png deleted file mode 100644 index 3c3ff1afb..000000000 Binary files a/model_access_rights/static/description/assets/modules/3.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/modules/4.png b/model_access_rights/static/description/assets/modules/4.png deleted file mode 100644 index 3fae4631e..000000000 Binary files a/model_access_rights/static/description/assets/modules/4.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/modules/5.gif b/model_access_rights/static/description/assets/modules/5.gif deleted file mode 100644 index 2a5f8e659..000000000 Binary files a/model_access_rights/static/description/assets/modules/5.gif and /dev/null differ diff --git a/model_access_rights/static/description/assets/modules/6.png b/model_access_rights/static/description/assets/modules/6.png deleted file mode 100644 index 7f2815273..000000000 Binary files a/model_access_rights/static/description/assets/modules/6.png and /dev/null 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..a3194264c 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..e894393ef 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..ed11bd818 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/03_purchase_user_grp.png b/model_access_rights/static/description/assets/screenshots/03_purchase_user_grp.png deleted file mode 100644 index 2b200cba3..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/03_purchase_user_grp.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/10_marcdemo_project_grp.png b/model_access_rights/static/description/assets/screenshots/10_marcdemo_project_grp.png deleted file mode 100644 index 4ef3c2e61..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/10_marcdemo_project_grp.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/11_project_original.png b/model_access_rights/static/description/assets/screenshots/11_project_original.png deleted file mode 100644 index 00ef7b30e..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/11_project_original.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/12_export_archive_hide.png b/model_access_rights/static/description/assets/screenshots/12_export_archive_hide.png deleted file mode 100644 index 4316a5ec5..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/12_export_archive_hide.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/13_hidden_export_archive.png b/model_access_rights/static/description/assets/screenshots/13_hidden_export_archive.png deleted file mode 100644 index e95d997e7..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/13_hidden_export_archive.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/1_field_menu.png b/model_access_rights/static/description/assets/screenshots/1_field_menu.png deleted file mode 100644 index 4f6c20f52..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/1_field_menu.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/2_model_grp.png b/model_access_rights/static/description/assets/screenshots/2_model_grp.png deleted file mode 100644 index c1e979977..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/2_model_grp.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/2_user_grp.png b/model_access_rights/static/description/assets/screenshots/2_user_grp.png deleted file mode 100644 index 4e71fc6c4..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/2_user_grp.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/3_user_grp.png b/model_access_rights/static/description/assets/screenshots/3_user_grp.png deleted file mode 100644 index 4e71fc6c4..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/3_user_grp.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/4_po_create_hide_tree.png b/model_access_rights/static/description/assets/screenshots/4_po_create_hide_tree.png deleted file mode 100644 index e5b0c3ee4..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/4_po_create_hide_tree.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/5_Export_dlt_hide.png b/model_access_rights/static/description/assets/screenshots/5_Export_dlt_hide.png deleted file mode 100644 index 383587406..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/5_Export_dlt_hide.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/6_export_dlt_hide_marc.png b/model_access_rights/static/description/assets/screenshots/6_export_dlt_hide_marc.png deleted file mode 100644 index 9c9c26544..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/6_export_dlt_hide_marc.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/7_delete_hide_in_form.png b/model_access_rights/static/description/assets/screenshots/7_delete_hide_in_form.png deleted file mode 100644 index fa8d52b75..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/7_delete_hide_in_form.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/8_archieve_edit_hide.png b/model_access_rights/static/description/assets/screenshots/8_archieve_edit_hide.png deleted file mode 100644 index e5bd20dd3..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/8_archieve_edit_hide.png and /dev/null differ diff --git a/model_access_rights/static/description/assets/screenshots/9_edit_archive_hide.png b/model_access_rights/static/description/assets/screenshots/9_edit_archive_hide.png deleted file mode 100644 index 6510ffd58..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/9_edit_archive_hide.png and /dev/null 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..cb2f6b523 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..2ca6bf0b7 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..4d800214e 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..ee165e8f7 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..d3760944e 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..7418fda68 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..738a4160a 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..3bd2812d6 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..fa3b03877 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/screenshots/v16-hero.gif b/model_access_rights/static/description/assets/screenshots/v16-hero.gif deleted file mode 100644 index f9205387b..000000000 Binary files a/model_access_rights/static/description/assets/screenshots/v16-hero.gif and /dev/null 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..cc970a2b9 Binary files /dev/null and b/model_access_rights/static/description/banner.jpg differ diff --git a/model_access_rights/static/description/banner.png b/model_access_rights/static/description/banner.png deleted file mode 100644 index 1b57f61b3..000000000 Binary files a/model_access_rights/static/description/banner.png and /dev/null differ diff --git a/model_access_rights/static/description/icon.png b/model_access_rights/static/description/icon.png index 51e28ec44..7b22e2b91 100644 Binary files a/model_access_rights/static/description/icon.png 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 index d6c1e3d5b..3d68168a1 100644 --- a/model_access_rights/static/description/index.html +++ b/model_access_rights/static/description/index.html @@ -27,10 +27,10 @@

- Model Access Rights

-

Hide the Options

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

Hide Create, Delete, Archive, Export Options in Models

-
@@ -159,53 +159,54 @@

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 'Model Access Config'

- + option and refresh the page, you can see a new menu named 'Restrict Access Rights' +
-

To show an example, set Marc Demo as the User in the purchase module

- +

User in the Purchase module

+
-

Select the model, group and the option which we want to hide

- +

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 +

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

- +
-

Set the access right of Marc Demo as User in project module

- +

User in Project module

+
-

By default we can see Export and Archive/UnArchive options

- +

By default, we can see Export and Archive/UnArchive options

+

Select the options which we want to hide

- +

Export and Archive/UnArchive functionality are hidden

- +
- - -
+
- + style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;"> +
-

Related +

+ Related Products

@@ -215,65 +216,89 @@