diff --git a/openerp/addons/base/currency_data.xml b/openerp/addons/base/currency_data.xml index 9265c897f8f..3bf2c1b4473 100644 --- a/openerp/addons/base/currency_data.xml +++ b/openerp/addons/base/currency_data.xml @@ -1540,7 +1540,7 @@ - VUB + VEB Bs 0.01 4 diff --git a/openerp/addons/base/ir/ir_attachment.py b/openerp/addons/base/ir/ir_attachment.py index 6b7b4cecc4b..dbfd1a82ced 100644 --- a/openerp/addons/base/ir/ir_attachment.py +++ b/openerp/addons/base/ir/ir_attachment.py @@ -198,7 +198,7 @@ class ir_attachment(osv.osv): continue res_ids.setdefault(rmod,set()).add(rid) if values: - if values.get('res_model') and 'res_id' in values: + if values.get('res_model') and values.get('res_id'): res_ids.setdefault(values['res_model'],set()).add(values['res_id']) ima = self.pool.get('ir.model.access') diff --git a/openerp/addons/base/ir/ir_translation.py b/openerp/addons/base/ir/ir_translation.py index 6cbd90c3072..2ab93e2b11b 100644 --- a/openerp/addons/base/ir/ir_translation.py +++ b/openerp/addons/base/ir/ir_translation.py @@ -182,7 +182,7 @@ class ir_translation(osv.osv): if context is None: context = {} record = self.browse(cr, uid, id, context=context) - if value and record.type == 'model': + if record.type == 'model': model_name, field = record.name.split(',') model = self.pool.get(model_name) #We need to take the context without the language information, because we want to write on the diff --git a/openerp/addons/base/res/res_country_data.xml b/openerp/addons/base/res/res_country_data.xml index 55818cb5c39..13c1025cf6b 100644 --- a/openerp/addons/base/res/res_country_data.xml +++ b/openerp/addons/base/res/res_country_data.xml @@ -1212,7 +1212,7 @@ Venezuela ve - + Virgin Islands (British) diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py index 3a0131c2a05..a7df2a5bb27 100644 --- a/openerp/addons/base/tests/test_base.py +++ b/openerp/addons/base/tests/test_base.py @@ -311,10 +311,10 @@ class test_translation(common.TransactionCase): self.res_category = self.registry('res.partner.category') self.ir_translation = self.registry('ir.translation') cr, uid = self.cr, self.uid - self.registry('ir.translation').load(cr, ['base'], ['fr_BE']) + self.registry('ir.translation').load(cr, ['base'], ['fr_FR']) self.cat_id = self.res_category.create(cr, uid, {'name': 'Customers'}) self.ir_translation.create(cr, uid, {'name': 'res.partner.category,name', 'module':'base', - 'value': 'Clients', 'res_id': self.cat_id, 'lang':'fr_BE', 'state':'translated', 'type': 'model'}) + 'value': 'Clients', 'res_id': self.cat_id, 'lang':'fr_FR', 'state':'translated', 'type': 'model'}) def test_101_create_translated_record(self): cr, uid = self.cr, self.uid @@ -322,27 +322,27 @@ class test_translation(common.TransactionCase): no_context_cat = self.res_category.browse(cr, uid, self.cat_id) self.assertEqual(no_context_cat.name, 'Customers', "Error in basic name_get") - fr_context_cat = self.res_category.browse(cr, uid, self.cat_id, context={'lang':'fr_BE'}) + fr_context_cat = self.res_category.browse(cr, uid, self.cat_id, context={'lang':'fr_FR'}) self.assertEqual(fr_context_cat.name, 'Clients', "Translation not found") def test_102_duplicate_record(self): cr, uid = self.cr, self.uid - self.new_cat_id = self.res_category.copy(cr, uid, self.cat_id, context={'lang':'fr_BE'}) + self.new_cat_id = self.res_category.copy(cr, uid, self.cat_id, context={'lang':'fr_FR'}) no_context_cat = self.res_category.browse(cr, uid, self.new_cat_id) self.assertEqual(no_context_cat.name, 'Customers', "Duplication did not set untranslated value") - fr_context_cat = self.res_category.browse(cr, uid, self.new_cat_id, context={'lang':'fr_BE'}) + fr_context_cat = self.res_category.browse(cr, uid, self.new_cat_id, context={'lang':'fr_FR'}) self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value") def test_103_duplicate_record_fr(self): cr, uid = self.cr, self.uid - self.new_fr_cat_id = self.res_category.copy(cr, uid, self.cat_id, default={'name': 'Clients (copie)'}, context={'lang':'fr_BE'}) + self.new_fr_cat_id = self.res_category.copy(cr, uid, self.cat_id, default={'name': 'Clients (copie)'}, context={'lang':'fr_FR'}) no_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id) self.assertEqual(no_context_cat.name, 'Clients (copie)', "Duplication with default value not applied") - fr_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id, context={'lang':'fr_BE'}) + fr_context_cat = self.res_category.browse(cr, uid, self.new_fr_cat_id, context={'lang':'fr_FR'}) self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value") diff --git a/openerp/modules/loading.py b/openerp/modules/loading.py index 390ac77b2ed..e4b9a04b221 100644 --- a/openerp/modules/loading.py +++ b/openerp/modules/loading.py @@ -340,7 +340,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False): if processed_modules: cr.execute("""select model,name from ir_model where id NOT IN (select distinct model_id from ir_model_access)""") for (model, name) in cr.fetchall(): - if model in registry and not registry[model].is_transient(): + if model in registry and not registry[model].is_transient() and isinstance(registry[model], openerp.osv.orm.AbstractModel): _logger.warning('The model %s has no access rules, consider adding one. E.g. access_%s,access_%s,model_%s,,1,1,1,1', model, model.replace('.', '_'), model.replace('.', '_'), model.replace('.', '_')) diff --git a/openerp/modules/registry.py b/openerp/modules/registry.py index d58f4b3186b..5929924b118 100644 --- a/openerp/modules/registry.py +++ b/openerp/modules/registry.py @@ -199,15 +199,16 @@ class RegistryManager(object): @classmethod def get(cls, db_name, force_demo=False, status=None, update_module=False): """ Return a registry for a given database name.""" - try: - return cls.registries[db_name] - except KeyError: - return cls.new(db_name, force_demo, status, - update_module) - finally: - # set db tracker - cleaned up at the WSGI - # dispatching phase in openerp.service.wsgi_server.application - threading.current_thread().dbname = db_name + with cls.registries_lock: + try: + return cls.registries[db_name] + except KeyError: + return cls.new(db_name, force_demo, status, + update_module) + finally: + # set db tracker - cleaned up at the WSGI + # dispatching phase in openerp.service.wsgi_server.application + threading.current_thread().dbname = db_name @classmethod def new(cls, db_name, force_demo=False, status=None, diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index fa428cb7f00..212eb033f84 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -399,7 +399,15 @@ class browse_record(object): ids = filter(lambda id: name not in self._data[id], self._data.keys()) # read the results field_names = map(lambda x: x[0], fields_to_fetch) - field_values = self._table.read(self._cr, self._uid, ids, field_names, context=self._context, load="_classic_write") + try: + field_values = self._table.read(self._cr, self._uid, ids, field_names, context=self._context, load="_classic_write") + except (openerp.exceptions.AccessError, except_orm): + if len(ids) == 1: + raise + # prefetching attempt failed, perhaps we're violating ACL restrictions involuntarily + _logger.info('Prefetching attempt for fields %s on %s failed for ids %s, re-trying just for id %s', field_names, self._model._name, ids, self._id) + ids = [self._id] + field_values = self._table.read(self._cr, self._uid, ids, field_names, context=self._context, load="_classic_write") # TODO: improve this, very slow for reports if self._fields_process: diff --git a/openerp/report/render/rml2pdf/trml2pdf.py b/openerp/report/render/rml2pdf/trml2pdf.py index 6a35e3a3806..b075b0f53ea 100644 --- a/openerp/report/render/rml2pdf/trml2pdf.py +++ b/openerp/report/render/rml2pdf/trml2pdf.py @@ -242,7 +242,7 @@ class _rml_styles(object,): if sname in self.styles_obj: style = self.styles_obj[sname] else: - _logger.warning('Warning: style not found, %s - setting default!\n' % (node.get('style'),) ) + _logger.debug('Warning: style not found, %s - setting default!', node.get('style')) if not style: style = self.default_style['Normal'] para_update = self._para_style_update(node) diff --git a/openerp/tests/test_acl.py b/openerp/tests/test_acl.py index e80390cd5a2..44ec677ff6f 100644 --- a/openerp/tests/test_acl.py +++ b/openerp/tests/test_acl.py @@ -95,9 +95,10 @@ class TestACL(common.TransactionCase): part = P.browse(self.cr, self.demo_uid, pid) # accessing fields must no raise exceptions... part.name - # ... except they are restricted + # ... except if they are restricted with self.assertRaises(openerp.osv.orm.except_orm) as cm: - part.email + with mute_logger('openerp.osv.orm'): + part.email self.assertEqual(cm.exception.args[0], 'Access Denied') finally: diff --git a/openerp/tools/mail.py b/openerp/tools/mail.py index ff73a3e0c72..97af2745cd8 100644 --- a/openerp/tools/mail.py +++ b/openerp/tools/mail.py @@ -87,7 +87,9 @@ def html_sanitize(src, silent=True): # some corner cases make the parser crash (such as in test_mail) cleaner = clean.Cleaner(**kwargs) cleaned = cleaner.clean_html(src) - except etree.ParserError: + except etree.ParserError, e: + if 'empty' in str(e): + return "" if not silent: raise logger.warning('ParserError obtained when sanitizing %r', src, exc_info=True)