[MERGE] Forward-port of latest 7.0 bugfixes, up to rev. 5139 rev-id: dle@openerp.com-20131121132305-qjlclgz5v9tze1fr
bzr revid: odo@openerp.com-20131120102545-2tlp031yib6viz35 bzr revid: chs@openerp.com-20131120161708-c8sbom592moukwxw bzr revid: dle@openerp.com-20131121155457-lh7fzouk2upeiu16
This commit is contained in:
commit
6fd552c3ce
|
@ -1540,7 +1540,7 @@
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="VUB" model="res.currency">
|
<record id="VUB" model="res.currency">
|
||||||
<field name="name">VUB</field>
|
<field name="name">VEB</field>
|
||||||
<field name="symbol">Bs</field>
|
<field name="symbol">Bs</field>
|
||||||
<field name="rounding">0.01</field>
|
<field name="rounding">0.01</field>
|
||||||
<field name="accuracy">4</field>
|
<field name="accuracy">4</field>
|
||||||
|
|
|
@ -198,7 +198,7 @@ class ir_attachment(osv.osv):
|
||||||
continue
|
continue
|
||||||
res_ids.setdefault(rmod,set()).add(rid)
|
res_ids.setdefault(rmod,set()).add(rid)
|
||||||
if values:
|
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'])
|
res_ids.setdefault(values['res_model'],set()).add(values['res_id'])
|
||||||
|
|
||||||
ima = self.pool.get('ir.model.access')
|
ima = self.pool.get('ir.model.access')
|
||||||
|
|
|
@ -182,7 +182,7 @@ class ir_translation(osv.osv):
|
||||||
if context is None:
|
if context is None:
|
||||||
context = {}
|
context = {}
|
||||||
record = self.browse(cr, uid, id, context=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_name, field = record.name.split(',')
|
||||||
model = self.pool.get(model_name)
|
model = self.pool.get(model_name)
|
||||||
#We need to take the context without the language information, because we want to write on the
|
#We need to take the context without the language information, because we want to write on the
|
||||||
|
|
|
@ -1212,7 +1212,7 @@
|
||||||
<record id="ve" model="res.country">
|
<record id="ve" model="res.country">
|
||||||
<field name="name">Venezuela</field>
|
<field name="name">Venezuela</field>
|
||||||
<field name="code">ve</field>
|
<field name="code">ve</field>
|
||||||
<field name="currency_id" ref="VUB"/>
|
<field name="currency_id" ref="VEF"/>
|
||||||
</record>
|
</record>
|
||||||
<record id="vg" model="res.country">
|
<record id="vg" model="res.country">
|
||||||
<field name="name">Virgin Islands (British)</field>
|
<field name="name">Virgin Islands (British)</field>
|
||||||
|
|
|
@ -311,10 +311,10 @@ class test_translation(common.TransactionCase):
|
||||||
self.res_category = self.registry('res.partner.category')
|
self.res_category = self.registry('res.partner.category')
|
||||||
self.ir_translation = self.registry('ir.translation')
|
self.ir_translation = self.registry('ir.translation')
|
||||||
cr, uid = self.cr, self.uid
|
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.cat_id = self.res_category.create(cr, uid, {'name': 'Customers'})
|
||||||
self.ir_translation.create(cr, uid, {'name': 'res.partner.category,name', 'module':'base',
|
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):
|
def test_101_create_translated_record(self):
|
||||||
cr, uid = self.cr, self.uid
|
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)
|
no_context_cat = self.res_category.browse(cr, uid, self.cat_id)
|
||||||
self.assertEqual(no_context_cat.name, 'Customers', "Error in basic name_get")
|
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")
|
self.assertEqual(fr_context_cat.name, 'Clients', "Translation not found")
|
||||||
|
|
||||||
def test_102_duplicate_record(self):
|
def test_102_duplicate_record(self):
|
||||||
cr, uid = self.cr, self.uid
|
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)
|
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")
|
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")
|
self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value")
|
||||||
|
|
||||||
def test_103_duplicate_record_fr(self):
|
def test_103_duplicate_record_fr(self):
|
||||||
cr, uid = self.cr, self.uid
|
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)
|
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")
|
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")
|
self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -340,7 +340,7 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
|
||||||
if processed_modules:
|
if processed_modules:
|
||||||
cr.execute("""select model,name from ir_model where id NOT IN (select distinct model_id from ir_model_access)""")
|
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():
|
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',
|
_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('.', '_'))
|
model, model.replace('.', '_'), model.replace('.', '_'), model.replace('.', '_'))
|
||||||
|
|
||||||
|
|
|
@ -199,15 +199,16 @@ class RegistryManager(object):
|
||||||
@classmethod
|
@classmethod
|
||||||
def get(cls, db_name, force_demo=False, status=None, update_module=False):
|
def get(cls, db_name, force_demo=False, status=None, update_module=False):
|
||||||
""" Return a registry for a given database name."""
|
""" Return a registry for a given database name."""
|
||||||
try:
|
with cls.registries_lock:
|
||||||
return cls.registries[db_name]
|
try:
|
||||||
except KeyError:
|
return cls.registries[db_name]
|
||||||
return cls.new(db_name, force_demo, status,
|
except KeyError:
|
||||||
update_module)
|
return cls.new(db_name, force_demo, status,
|
||||||
finally:
|
update_module)
|
||||||
# set db tracker - cleaned up at the WSGI
|
finally:
|
||||||
# dispatching phase in openerp.service.wsgi_server.application
|
# set db tracker - cleaned up at the WSGI
|
||||||
threading.current_thread().dbname = db_name
|
# dispatching phase in openerp.service.wsgi_server.application
|
||||||
|
threading.current_thread().dbname = db_name
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def new(cls, db_name, force_demo=False, status=None,
|
def new(cls, db_name, force_demo=False, status=None,
|
||||||
|
|
|
@ -399,7 +399,15 @@ class browse_record(object):
|
||||||
ids = filter(lambda id: name not in self._data[id], self._data.keys())
|
ids = filter(lambda id: name not in self._data[id], self._data.keys())
|
||||||
# read the results
|
# read the results
|
||||||
field_names = map(lambda x: x[0], fields_to_fetch)
|
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
|
# TODO: improve this, very slow for reports
|
||||||
if self._fields_process:
|
if self._fields_process:
|
||||||
|
|
|
@ -242,7 +242,7 @@ class _rml_styles(object,):
|
||||||
if sname in self.styles_obj:
|
if sname in self.styles_obj:
|
||||||
style = self.styles_obj[sname]
|
style = self.styles_obj[sname]
|
||||||
else:
|
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:
|
if not style:
|
||||||
style = self.default_style['Normal']
|
style = self.default_style['Normal']
|
||||||
para_update = self._para_style_update(node)
|
para_update = self._para_style_update(node)
|
||||||
|
|
|
@ -95,9 +95,10 @@ class TestACL(common.TransactionCase):
|
||||||
part = P.browse(self.cr, self.demo_uid, pid)
|
part = P.browse(self.cr, self.demo_uid, pid)
|
||||||
# accessing fields must no raise exceptions...
|
# accessing fields must no raise exceptions...
|
||||||
part.name
|
part.name
|
||||||
# ... except they are restricted
|
# ... except if they are restricted
|
||||||
with self.assertRaises(openerp.osv.orm.except_orm) as cm:
|
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')
|
self.assertEqual(cm.exception.args[0], 'Access Denied')
|
||||||
finally:
|
finally:
|
||||||
|
|
|
@ -87,7 +87,9 @@ def html_sanitize(src, silent=True):
|
||||||
# some corner cases make the parser crash (such as <SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT> in test_mail)
|
# some corner cases make the parser crash (such as <SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT> in test_mail)
|
||||||
cleaner = clean.Cleaner(**kwargs)
|
cleaner = clean.Cleaner(**kwargs)
|
||||||
cleaned = cleaner.clean_html(src)
|
cleaned = cleaner.clean_html(src)
|
||||||
except etree.ParserError:
|
except etree.ParserError, e:
|
||||||
|
if 'empty' in str(e):
|
||||||
|
return ""
|
||||||
if not silent:
|
if not silent:
|
||||||
raise
|
raise
|
||||||
logger.warning('ParserError obtained when sanitizing %r', src, exc_info=True)
|
logger.warning('ParserError obtained when sanitizing %r', src, exc_info=True)
|
||||||
|
|
Loading…
Reference in New Issue