Fix field access for inherited Models
Use root user to create/write inherited records and check access fields in the base record. issue2333 review289002
This commit is contained in:
1 parent
15aadf7ceb
commit
27f8cd68db
2 files changed
+19
-6
No files matched your search
@@ -299,7 +299,8 @@ class ModelSQL(ModelStorage):
|
||||
|
||||
for inherits in tocreate:
|
||||
inherits_obj = pool.get(inherits)
|
||||
inherits_id = inherits_obj.create(tocreate[inherits])
|
||||
with Transaction().set_user(0, set_context=True):
|
||||
inherits_id = inherits_obj.create(tocreate[inherits])
|
||||
values[self._inherits[inherits]] = inherits_id
|
||||
|
||||
# Insert record
|
||||
@@ -947,7 +948,8 @@ class ModelSQL(ModelStorage):
|
||||
for val in updend:
|
||||
if self._inherit_fields[val][0] == table:
|
||||
values2[val] = values[val]
|
||||
pool.get(table).write(nids, values2)
|
||||
with Transaction().set_user(0, set_context=True):
|
||||
pool.get(table).write(nids, values2)
|
||||
|
||||
self._validate(ids)
|
||||
|
||||
|
||||
@@ -64,6 +64,17 @@ class ModelStorage(Model):
|
||||
"Default value for create_date field."
|
||||
return datetime.datetime.today()
|
||||
|
||||
def __fields_by_model(self, values):
|
||||
"Return a dictionary with list of fields from values grouped by model"
|
||||
fields_by_model = {}
|
||||
for field in values:
|
||||
if field in self._columns:
|
||||
model = self._name
|
||||
else:
|
||||
model = self._inherit_fields[field][0]
|
||||
fields_by_model.setdefault(model, []).append(field)
|
||||
return fields_by_model
|
||||
|
||||
def create(self, values):
|
||||
'''
|
||||
Create records.
|
||||
@@ -77,8 +88,8 @@ class ModelStorage(Model):
|
||||
model_field_access_obj = pool.get('ir.model.field.access')
|
||||
|
||||
model_access_obj.check(self._name, 'create')
|
||||
model_field_access_obj.check(self._name,
|
||||
[x for x in values if x in self._columns], 'write')
|
||||
for model, fields in self.__fields_by_model(values).iteritems():
|
||||
model_field_access_obj.check(model, fields, 'write')
|
||||
return False
|
||||
|
||||
def trigger_create(self, id):
|
||||
@@ -132,8 +143,8 @@ class ModelStorage(Model):
|
||||
model_field_access_obj = pool.get('ir.model.field.access')
|
||||
|
||||
model_access_obj.check(self._name, 'write')
|
||||
model_field_access_obj.check(self._name,
|
||||
[x for x in values if x in self._columns], 'write')
|
||||
for model, fields in self.__fields_by_model(values).iteritems():
|
||||
model_field_access_obj.check(model, fields, 'write')
|
||||
if not self.check_xml_record(ids, values):
|
||||
self.raise_user_error('write_xml_record',
|
||||
error_description='xml_record_desc')
|
||||
|
||||
Reference in new issue
Block a user