diff --git a/openerp/addons/base/ir/ir_attachment.py b/openerp/addons/base/ir/ir_attachment.py index dbfd1a82ced..f6bb00fed5f 100644 --- a/openerp/addons/base/ir/ir_attachment.py +++ b/openerp/addons/base/ir/ir_attachment.py @@ -242,6 +242,8 @@ class ir_attachment(osv.osv): # performed in batch as much as possible. ima = self.pool.get('ir.model.access') for model, targets in model_attachments.iteritems(): + if model not in self.pool: + continue if not ima.check(cr, uid, model, 'read', False): # remove all corresponding attachment ids for attach_id in itertools.chain(*targets.values()): diff --git a/openerp/addons/base/res/res_partner_report_address.xsl b/openerp/addons/base/res/res_partner_report_address.xsl index ca212f2d2b0..83fb709e356 100644 --- a/openerp/addons/base/res/res_partner_report_address.xsl +++ b/openerp/addons/base/res/res_partner_report_address.xsl @@ -1,13 +1,13 @@ - 20.5 - 1 - 6.5 - 10 - 5.5cm - 10cm - 2 - 8 + 24.5 + 0.5 + 3.5 + 7 + 3.7cm + 7cm + 3 + 24 diff --git a/openerp/addons/base/res/res_users_view.xml b/openerp/addons/base/res/res_users_view.xml index ed52de5eba2..9c84d4326f4 100644 --- a/openerp/addons/base/res/res_users_view.xml +++ b/openerp/addons/base/res/res_users_view.xml @@ -274,7 +274,7 @@
- +

diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 4ae57881273..d9ecaa69b64 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -601,8 +601,10 @@ class one2many(_column): else: cr.execute('update '+_table+' set '+self._fields_id+'=null where id=%s', (act[1],)) elif act[0] == 4: - # Must use write() to recompute parent_store structure if needed - obj.write(cr, user, [act[1]], {self._fields_id:id}, context=context or {}) + cr.execute("select 1 from {0} where id=%s and {1}=%s".format(_table, self._fields_id), (act[1], id)) + if not cr.fetchone(): + # Must use write() to recompute parent_store structure if needed and check access rules + obj.write(cr, user, [act[1]], {self._fields_id:id}, context=context or {}) elif act[0] == 5: reverse_rel = obj._all_columns.get(self._fields_id) assert reverse_rel, 'Trying to unlink the content of a o2m but the pointed model does not have a m2o' diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 71053a02cae..610d0a5d503 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -3681,11 +3681,6 @@ class BaseModel(object): if fields_to_read is None: fields_to_read = self._columns.keys() - # Construct a clause for the security rules. - # 'tables' hold the list of tables necessary for the SELECT including the ir.rule clauses, - # or will at least contain self._table. - rule_clause, rule_params, tables = self.pool.get('ir.rule').domain_get(cr, user, self._name, 'read', context=context) - # all inherited fields + all non inherited fields for which the attribute whose name is in load is True fields_pre = [f for f in fields_to_read if f == self.CONCURRENCY_CHECK_FIELD @@ -3706,6 +3701,11 @@ class BaseModel(object): return 'length(%s) as "%s"' % (f_qual, f) return f_qual + # Construct a clause for the security rules. + # 'tables' hold the list of tables necessary for the SELECT including the ir.rule clauses, + # or will at least contain self._table. + rule_clause, rule_params, tables = self.pool.get('ir.rule').domain_get(cr, user, self._name, 'read', context=context) + fields_pre2 = map(convert_field, fields_pre) order_by = self._parent_order or self._order select_fields = ','.join(fields_pre2 + ['%s.id' % self._table]) @@ -3720,6 +3720,7 @@ class BaseModel(object): self._check_record_rules_result_count(cr, user, sub_ids, result_ids, 'read', context=context) res.extend(results) else: + self.check_access_rule(cr, user, ids, 'read', context=context) res = map(lambda x: {'id': x}, ids) if context.get('lang'): diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 47f75e43fe8..6868b4fd897 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -952,7 +952,7 @@ def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init', result, rows, warning_msg, dummy = registry[model].import_data(cr, uid, fields, datas,mode, module, noupdate, filename=fname_partial) if result < 0: # Report failed import and abort module install - raise Exception(_('Module loading failed: file %s/%s could not be processed:\n %s') % (module, fname, warning_msg)) + raise Exception(_('Module loading %s failed: file %s could not be processed:\n %s') % (module, fname, warning_msg)) if config.get('import_partial'): data = pickle.load(file(config.get('import_partial'))) data[fname_partial] = 0