Browse Source

Dec 16 : [UPDT] Updated 'model_access_rights'

pull/295/head
AjmalCybro 2 years ago
parent
commit
fa26001213
  1. 31
      model_access_rights/README.rst
  2. 20
      model_access_rights/__manifest__.py
  3. 10
      model_access_rights/data/ir_sequence_data.xml
  4. 8
      model_access_rights/doc/RELEASE_NOTES.md
  5. 1
      model_access_rights/models/__init__.py
  6. 14
      model_access_rights/models/model_access_rights.py
  7. 315
      model_access_rights/models/models.py
  8. 2
      model_access_rights/security/ir.model.access.csv
  9. 3
      model_access_rights/security/security.xml
  10. BIN
      model_access_rights/static/description/assets/modules/1.png
  11. BIN
      model_access_rights/static/description/assets/modules/2.png
  12. BIN
      model_access_rights/static/description/assets/modules/3.png
  13. BIN
      model_access_rights/static/description/assets/modules/4.png
  14. BIN
      model_access_rights/static/description/assets/modules/5.gif
  15. BIN
      model_access_rights/static/description/assets/modules/6.png
  16. BIN
      model_access_rights/static/description/assets/modules/l2.png
  17. BIN
      model_access_rights/static/description/assets/modules/l3.png
  18. BIN
      model_access_rights/static/description/assets/modules/l4.png
  19. BIN
      model_access_rights/static/description/assets/modules/l5.png
  20. BIN
      model_access_rights/static/description/assets/modules/l6.png
  21. BIN
      model_access_rights/static/description/assets/screenshots/03_purchase_user_grp.png
  22. BIN
      model_access_rights/static/description/assets/screenshots/10_marcdemo_project_grp.png
  23. BIN
      model_access_rights/static/description/assets/screenshots/11_project_original.png
  24. BIN
      model_access_rights/static/description/assets/screenshots/12_export_archive_hide.png
  25. BIN
      model_access_rights/static/description/assets/screenshots/13_hidden_export_archive.png
  26. BIN
      model_access_rights/static/description/assets/screenshots/1_field_menu.png
  27. BIN
      model_access_rights/static/description/assets/screenshots/2_model_grp.png
  28. BIN
      model_access_rights/static/description/assets/screenshots/2_user_grp.png
  29. BIN
      model_access_rights/static/description/assets/screenshots/3_user_grp.png
  30. BIN
      model_access_rights/static/description/assets/screenshots/4_po_create_hide_tree.png
  31. BIN
      model_access_rights/static/description/assets/screenshots/5_Export_dlt_hide.png
  32. BIN
      model_access_rights/static/description/assets/screenshots/6_export_dlt_hide_marc.png
  33. BIN
      model_access_rights/static/description/assets/screenshots/7_delete_hide_in_form.png
  34. BIN
      model_access_rights/static/description/assets/screenshots/8_archieve_edit_hide.png
  35. BIN
      model_access_rights/static/description/assets/screenshots/9_edit_archive_hide.png
  36. BIN
      model_access_rights/static/description/assets/screenshots/hero.gif
  37. BIN
      model_access_rights/static/description/assets/screenshots/model_access_right_01.png
  38. BIN
      model_access_rights/static/description/assets/screenshots/model_access_right_02.png
  39. BIN
      model_access_rights/static/description/assets/screenshots/model_access_right_03.png
  40. BIN
      model_access_rights/static/description/assets/screenshots/model_access_right_04.png
  41. BIN
      model_access_rights/static/description/assets/screenshots/model_access_right_05.png
  42. BIN
      model_access_rights/static/description/assets/screenshots/model_access_right_06.png
  43. BIN
      model_access_rights/static/description/assets/screenshots/model_access_right_07.png
  44. BIN
      model_access_rights/static/description/assets/screenshots/model_access_right_08.png
  45. BIN
      model_access_rights/static/description/assets/screenshots/v16-hero.gif
  46. BIN
      model_access_rights/static/description/banner.jpg
  47. BIN
      model_access_rights/static/description/banner.png
  48. BIN
      model_access_rights/static/description/icon.png
  49. 135
      model_access_rights/static/description/index.html
  50. 2
      model_access_rights/static/src/js/form_controller.js
  51. 42
      model_access_rights/static/src/js/kanban_controller.js
  52. 2
      model_access_rights/static/src/js/list_controller.js
  53. 30
      model_access_rights/views/model_access_rights_views.xml

31
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 <https://cybrosys.com/>`__
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
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: `<static/description/index.html>`__

20
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,

10
model_access_rights/data/ir_sequence_data.xml

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="model_access_right_sequence" model="ir.sequence">
<field name="name">Model Access Right</field>
<field name="code">access.right</field>
<field name="prefix">MAR</field>
<field name="padding">5</field>
<field name="company_id" eval="False"/>
</record>
</odoo>

8
model_access_rights/doc/RELEASE_NOTES.md

@ -1,9 +1,5 @@
## Module <model_access_rights>
#### 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

1
model_access_rights/models/__init__.py

@ -20,3 +20,4 @@
#
#############################################################################
from . import model_access_rights
from . import models

14
model_access_rights/models/model_access_rights.py

@ -21,7 +21,7 @@
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
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):

315
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(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
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

2
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

1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 access_access_right access_access_right access.access.right model_access_right model_access_rights.group_model_access_control model_access_rights.model_access_rights_groups_configure_model_access 1 1 1 1

3
model_access_rights/security/security.xml

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Add a group named Configure Model Access in res.groups-->
<odoo>
<record id="group_model_access_control" model="res.groups">
<record id="model_access_rights_groups_configure_model_access" model="res.groups">
<field name="name">Configure Model Access</field>
<field name="category_id" ref="base.module_category_usability"/>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>

BIN
model_access_rights/static/description/assets/modules/1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 228 KiB

BIN
model_access_rights/static/description/assets/modules/2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

BIN
model_access_rights/static/description/assets/modules/3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

BIN
model_access_rights/static/description/assets/modules/4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

BIN
model_access_rights/static/description/assets/modules/5.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 MiB

BIN
model_access_rights/static/description/assets/modules/6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

BIN
model_access_rights/static/description/assets/modules/l2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
model_access_rights/static/description/assets/modules/l3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
model_access_rights/static/description/assets/modules/l4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
model_access_rights/static/description/assets/modules/l5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
model_access_rights/static/description/assets/modules/l6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

BIN
model_access_rights/static/description/assets/screenshots/03_purchase_user_grp.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

BIN
model_access_rights/static/description/assets/screenshots/10_marcdemo_project_grp.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

BIN
model_access_rights/static/description/assets/screenshots/11_project_original.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

BIN
model_access_rights/static/description/assets/screenshots/12_export_archive_hide.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

BIN
model_access_rights/static/description/assets/screenshots/13_hidden_export_archive.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

BIN
model_access_rights/static/description/assets/screenshots/1_field_menu.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 KiB

BIN
model_access_rights/static/description/assets/screenshots/2_model_grp.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

BIN
model_access_rights/static/description/assets/screenshots/2_user_grp.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

BIN
model_access_rights/static/description/assets/screenshots/3_user_grp.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

BIN
model_access_rights/static/description/assets/screenshots/4_po_create_hide_tree.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 226 KiB

BIN
model_access_rights/static/description/assets/screenshots/5_Export_dlt_hide.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

BIN
model_access_rights/static/description/assets/screenshots/6_export_dlt_hide_marc.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 KiB

BIN
model_access_rights/static/description/assets/screenshots/7_delete_hide_in_form.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

BIN
model_access_rights/static/description/assets/screenshots/8_archieve_edit_hide.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

BIN
model_access_rights/static/description/assets/screenshots/9_edit_archive_hide.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

BIN
model_access_rights/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

BIN
model_access_rights/static/description/assets/screenshots/model_access_right_01.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
model_access_rights/static/description/assets/screenshots/model_access_right_02.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
model_access_rights/static/description/assets/screenshots/model_access_right_03.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
model_access_rights/static/description/assets/screenshots/model_access_right_04.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

BIN
model_access_rights/static/description/assets/screenshots/model_access_right_05.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

BIN
model_access_rights/static/description/assets/screenshots/model_access_right_06.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
model_access_rights/static/description/assets/screenshots/model_access_right_07.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
model_access_rights/static/description/assets/screenshots/model_access_right_08.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
model_access_rights/static/description/assets/screenshots/v16-hero.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

BIN
model_access_rights/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

BIN
model_access_rights/static/description/banner.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

BIN
model_access_rights/static/description/icon.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 20 KiB

135
model_access_rights/static/description/index.html

@ -27,10 +27,10 @@
<div class="col-sm-12 col-md-12 col-lg-12">
<!-- APP HERO -->
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
Model Access Rights</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Hide the Options</p>
Hide Create|Delete|Archive|Export Options - Model Wise</h1>
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Hide Create, Delete, Archive, Export Options in Models</p>
<!-- END OF APP HERO -->
<img src="assets/screenshots/v16-hero.gif" class="img-responsive"
<img src="assets/screenshots/hero.gif" class="img-responsive"
style="width: 100%; margin-left: auto; margin-right: auto;" />
</div>
</div>
@ -159,53 +159,54 @@
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> 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'</h3>
<img src="assets/screenshots/1_field_menu.png" class="img-thumbnail">
option and refresh the page, you can see a new menu named 'Restrict Access Rights'</h3>
<img src="assets/screenshots/model_access_right_01.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">To show an example, set Marc Demo as the User in the purchase module</h3>
<img src="assets/screenshots/2_user_grp.png" class="img-thumbnail">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> User in the Purchase module</h3>
<img src="assets/screenshots/model_access_right_02.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Select the model, group and the option which we want to hide</h3>
<img src="assets/screenshots/03_purchase_user_grp.png" class="img-thumbnail">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Select the Model, Groups and the options which we want to hide</h3>
<img src="assets/screenshots/model_access_right_03.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> We can see create option is hidden in purchase.order to those who are User
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> We can see Create option is hidden in purchase.order to those who are User
in purchase module</h3>
<img src="assets/screenshots/4_po_create_hide_tree.png" class="img-thumbnail">
<img src="assets/screenshots/model_access_right_04.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Set the access right of Marc Demo as User in project module</h3>
<img src="assets/screenshots/10_marcdemo_project_grp.png" class="img-thumbnail">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">User in Project module</h3>
<img src="assets/screenshots/model_access_right_05.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> By default we can see Export and Archive/UnArchive options</h3>
<img src="assets/screenshots/11_project_original.png" class="img-thumbnail">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> By default, we can see Export and Archive/UnArchive options</h3>
<img src="assets/screenshots/model_access_right_06.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Select the options which we want to hide</h3>
<img src="assets/screenshots/12_export_archive_hide.png" class="img-thumbnail">
<img src="assets/screenshots/model_access_right_07.png" class="img-thumbnail">
</div>
<div style="display: block; margin: 30px auto;">
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Export and Archive/UnArchive functionality are hidden</h3>
<img src="assets/screenshots/13_hidden_export_archive.png" class="img-thumbnail">
<img src="assets/screenshots/model_access_right_08.png" class="img-thumbnail">
</div>
</div>
</div>
<!-- END OF SCREENSHOTS SECTION -->
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png" />
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Related
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
Products
</h2>
</div>
@ -215,65 +216,89 @@
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/dynamic_accounts_report/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/openai_odoo_base/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/1.png">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/1.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/woo_commerce/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/2.png">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/l2.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/project_custom_gantt/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/shopify_odoo_connector/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/3.png">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/l3.png">
</div>
</a>
</div>
</div>
<div class="carousel-item active" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/account_reports_xlsx/" target="_blank">
<div class="carousel-item active"
style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/hr_zk_attendance/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/4.png">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/l4.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/base_accounting_kit/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/whatsapp_redirect/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/5.png">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/l5.png">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16" style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/hr_payroll_community/" target="_blank">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/16.0/openai_website_product_media/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block" style="border-radius: 0px;"
src="assets/modules/6.png">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="assets/modules/l6.png">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev" style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i class="fa fa-chevron-left" style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1" data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i class="fa fa-chevron-right"
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i
class="fa fa-chevron-left"
style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1"
data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</a>
</div>
</div>
</div>
@ -388,7 +413,7 @@
</div>
<!-- END OF END OF OUR SERVICES -->
<!-- END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
@ -515,7 +540,7 @@
</div>
</div>
<!-- END OF END OF OUR INDUSTRIES -->
<!-- END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">

2
model_access_rights/static/src/js/form_controller.js

@ -43,4 +43,4 @@ patch(FormController.prototype, 'model_access_rights/static/src/js/form_controll
}
});
}
});
});

42
model_access_rights/static/src/js/kanban_controller.js

@ -0,0 +1,42 @@
/** @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";
var rpc = require('web.rpc');
const {onWillStart} = owl;
patch(KanbanController.prototype, 'model_access_rights/static/src/js/list_controller.js.KanbanController', {
/**
* This function will used to hide the selected options from the Kanban view
*/
setup() {
this._super();
onWillStart(async () => {
var self = this
var result;
await rpc.query({
model: 'access.right',
method: 'hide_buttons',
}).then(function(data) {
result = data;
});
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
}
}
}
}
}
});
}
});

2
model_access_rights/static/src/js/list_controller.js

@ -47,4 +47,4 @@ patch(ListController.prototype, 'model_access_rights/static/src/js/list_controll
}
});
}
});
});

30
model_access_rights/views/model_access_rights_views.xml

@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_model_access_config" model="ir.actions.act_window">
<field name="name">Model Access Right</field>
<!-- Action for the menu Restrict Model Access-->
<record id="access_right_action" model="ir.actions.act_window">
<field name="name">Restrict Access Rights</field>
<field name="res_model">access.right</field>
<field name='view_mode'>tree,form</field>
</record>
<data>
<record id="module_access_rights_views_tree" model="ir.ui.view">
<field name="name">module.access.rights.tree</field>
<!-- Tree view for the model access.right-->
<record id="access_right_view_tree" model="ir.ui.view">
<field name="name">access.right.view.tree</field>
<field name="model">access.right</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="model_id"/>
<field name="groups_id"/>
<field name="is_delete"/>
@ -21,15 +21,13 @@
</tree>
</field>
</record>
<record id="module_access_rights_views_form" model="ir.ui.view">
<field name="name">module.access.rights.views</field>
<!-- Form view for the model access.right-->
<record id="access_right_view_form" model="ir.ui.view">
<field name="name">access.right.view.form</field>
<field name="model">access.right</field>
<field name="arch" type="xml">
<form>
<sheet>
<h1>
<field name="name"/>
</h1>
<group>
<group>
<field name="model_id"/>
@ -50,11 +48,11 @@
</form>
</field>
</record>
</data>
<menuitem id="menu_model_access_config"
name="Model Access Config"
<!-- Creating a menu named Restrict Model Access-->
<menuitem id="access_right_menu"
name="Restrict Access Rights"
parent="base.menu_administration"
action="action_model_access_config"
action="access_right_action"
sequence="6"
groups="model_access_rights.group_model_access_control"/>
groups="model_access_rights.model_access_rights_groups_configure_model_access"/>
</odoo>

Loading…
Cancel
Save