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:
Cédric Krier committed 2012-03-20 19:01:14 +01:00
1 parent 15aadf7ceb
commit 27f8cd68db
2 files changed
+19 -6

No files matched your search

+4 -2
View File
@@ -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)
+15 -4
View File
@@ -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')