Read, write, create, delete permission on record rules

This commit is contained in:
Cédric Krier
2009-06-15 14:02:11 +02:00
parent e3b47f22c5
commit 0e0d72140a
4 changed files with 49 additions and 5 deletions
+1
View File
@@ -1,3 +1,4 @@
* Read, write, create, delete permission on record rules
* Add reset_default method to ir.default
* Doesn't append '%' to "like", "ilike" clauses
* Handle database dump and restore with password
+20 -1
View File
@@ -23,6 +23,10 @@ class RuleGroup(ModelSQL, ModelView):
'rule_group_id', 'group_id', 'Groups')
users = fields.Many2Many('ir.rule.group-res.user',
'rule_group_id', 'user_id', 'Users')
perm_read = fields.Boolean('Read Access')
perm_write = fields.Boolean('Write Access')
perm_create = fields.Boolean('Create Access')
perm_delete = fields.Boolean('Delete Access')
def __init__(self):
super(RuleGroup, self).__init__()
@@ -40,6 +44,18 @@ class RuleGroup(ModelSQL, ModelView):
def default_default_p(self, cursor, user, context=None):
return False
def default_perm_read(self, cursor, user, context=None):
return True
def default_perm_write(self, cursor, user, context=None):
return True
def default_perm_create(self, cursor, user, context=None):
return True
def default_perm_delete(self, cursor, user, context=None):
return True
def delete(self, cursor, user, ids, context=None):
res = super(RuleGroup, self).delete(cursor, user, ids,
context=context)
@@ -123,9 +139,11 @@ class Rule(ModelSQL, ModelView):
res.append((i, i))
return res
def domain_get(self, cursor, user, model_name, context=None):
def domain_get(self, cursor, user, model_name, mode='read', context=None):
if context is None:
context = {}
assert mode in ['read', 'write', 'create', 'delete'], \
'Invalid domain mode for security'
# root user above constraint
if user == 0:
@@ -147,6 +165,7 @@ class Rule(ModelSQL, ModelView):
'JOIN "' + model_obj._table + '" m ON (g.model = m.id)) ' \
"ON (g.id = r.rule_group) " \
"WHERE m.model = %s "
"AND g.perm_" + mode + " "
"AND (g.id IN (" \
'SELECT rule_group_id ' \
'FROM "' + rule_group_user_obj._table + '" ' \
+14
View File
@@ -15,6 +15,16 @@ this repository contains the full copyright notices and license terms. -->
<field name="global_p"/>
<label name="default_p"/>
<field name="default_p"/>
<group col="4" colspan="6" id="perm">
<label name="perm_read"/>
<field name="perm_read"/>
<label name="perm_write"/>
<field name="perm_write"/>
<label name="perm_create"/>
<field name="perm_create"/>
<label name="perm_delete"/>
<field name="perm_delete"/>
</group>
<label name="name"/>
<field name="name" colspan="5"/>
<field name="rules" colspan="6"/>
@@ -32,6 +42,10 @@ this repository contains the full copyright notices and license terms. -->
<field name="arch" type="xml">
<![CDATA[
<tree string="Record rules">
<field name="perm_read" select="2"/>
<field name="perm_write" select="2"/>
<field name="perm_create" select="2"/>
<field name="perm_delete" select="2"/>
<field name="model" select="1"/>
<field name="name" select="2"/>
<field name="global_p" select="1"/>
+14 -4
View File
@@ -362,6 +362,16 @@ class ModelSQL(ModelStorage):
cursor2.close()
raise
domain1, domain2 = self.pool.get('ir.rule').domain_get(cursor, user,
self._name, mode='create', context=context)
if domain1:
cursor.execute('SELECT id FROM "' + self._table + '" ' \
'WHERE id = %s AND (' + domain1 + ')',
[id_new] + domain2)
if not cursor.rowcount:
self.raise_user_error(cursor, 'access_error',
self._description, context=context)
upd_todo.sort(lambda x, y: self._columns[x].priority - \
self._columns[y].priority)
for field in upd_todo:
@@ -413,7 +423,7 @@ class ModelSQL(ModelStorage):
# construct a clause for the rules :
domain1, domain2 = rule_obj.domain_get(cursor, user, self._name,
context=context)
mode='read', context=context)
fields_related = {}
datetime_fields = []
@@ -773,7 +783,7 @@ class ModelSQL(ModelStorage):
upd1.append(user)
domain1, domain2 = self.pool.get('ir.rule').domain_get(cursor,
user, self._name, context=context)
user, self._name, mode='write', context=context)
if domain1:
domain1 = ' AND (' + domain1 + ') '
for i in range(0, len(ids), cursor.IN_MAX):
@@ -994,7 +1004,7 @@ class ModelSQL(ModelStorage):
delete_ctx['_delete'][self._name].update(ids)
domain1, domain2 = self.pool.get('ir.rule').domain_get(cursor, user,
self._name, context=context)
self._name, mode='delete', context=context)
if domain1:
domain1 = ' AND (' + domain1 + ') '
@@ -1121,7 +1131,7 @@ class ModelSQL(ModelStorage):
# construct a clause for the rules :
domain1, domain2 = rule_obj.domain_get(cursor, user, self._name,
context=context)
mode='read', context=context)
if domain1:
if qu1:
qu1 += ' AND ' + domain1