diff --git a/CHANGELOG b/CHANGELOG
index 2df5ab9b90..d2a9d15b1d 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,4 @@
+* Add create/delete field access
* Add dynamic size limit on the One2Many, Many2Many and Char
* Replace __tryton__.py by tryton.cfg
* Allow to use Reference field in One2Many & Many2Many
diff --git a/trytond/ir/model.py b/trytond/ir/model.py
index 99000a9940..cfff099a6c 100644
--- a/trytond/ir/model.py
+++ b/trytond/ir/model.py
@@ -391,6 +391,8 @@ class ModelFieldAccess(ModelSQL, ModelView):
group = fields.Many2One('res.group', 'Group', ondelete='CASCADE')
perm_read = fields.Boolean('Read Access')
perm_write = fields.Boolean('Write Access')
+ perm_create = fields.Boolean('Create Access')
+ perm_delete = fields.Boolean('Delete Access')
description = fields.Text('Description')
def __init__(self):
@@ -413,6 +415,12 @@ class ModelFieldAccess(ModelSQL, ModelView):
def default_perm_write(self):
return False
+ def default_perm_create(self):
+ return True
+
+ def default_perm_delete(self):
+ return True
+
@Cache('ir_model_field_access.check')
def check(self, model_name, fields, mode='read', raise_exception=True,
access=False):
@@ -421,13 +429,14 @@ class ModelFieldAccess(ModelSQL, ModelView):
:param model_name: the model name
:param fields: a list of fields
- :param mode: 'read' or 'write'
+ :param mode: 'read', 'write', 'create' or 'delete'
:param raise_exception: raise an exception if the test failed
:param access: return a dictionary with access right instead of boolean
:return: a boolean
'''
- assert mode in ('read', 'write'), 'Invalid access mode'
+ assert mode in ('read', 'write', 'create', 'delete'), \
+ 'Invalid access mode'
if Transaction().user == 0:
if access:
return dict((x, True) for x in fields)
diff --git a/trytond/ir/model.xml b/trytond/ir/model.xml
index 06fd61cdad..ae170d68c7 100644
--- a/trytond/ir/model.xml
+++ b/trytond/ir/model.xml
@@ -181,6 +181,8 @@ this repository contains the full copyright notices and license terms. -->
+
+
@@ -203,6 +205,10 @@ this repository contains the full copyright notices and license terms. -->
+
+
+
+
diff --git a/trytond/model/model.py b/trytond/model/model.py
index 1253bc4745..f5d245299a 100644
--- a/trytond/model/model.py
+++ b/trytond/model/model.py
@@ -450,6 +450,10 @@ class Model(WarningErrorMixin, URLMixin):
fwrite_accesses = field_access_obj.check(self._name, fields_names or
self._columns.keys(), 'write', access=True)
+ fcreate_accesses = field_access_obj.check(self._name, fields_names or
+ self._columns.keys(), 'create', access=True)
+ fdelete_accesses = field_access_obj.check(self._name, fields_names or
+ self._columns.keys(), 'delete', access=True)
for field in (x for x in self._columns.keys()
if ((not fields_names) or x in fields_names)):
res[field] = {
@@ -547,6 +551,8 @@ class Model(WarningErrorMixin, URLMixin):
res[field]['relation'] = relation
res[field]['domain'] = copy.copy(self._columns[field].domain)
res[field]['context'] = copy.copy(self._columns[field].context)
+ res[field]['create'] = fcreate_accesses.get(field, True)
+ res[field]['delete'] = fdelete_accesses.get(field, True)
if res[field]['type'] == 'one2many' \
and hasattr(self._columns[field], 'field'):
res[field]['relation_field'] = copy.copy(