diff --git a/openerp/addons/base/ir/ir_fields.py b/openerp/addons/base/ir/ir_fields.py index 09622dadd17..e1522123dcf 100644 --- a/openerp/addons/base/ir/ir_fields.py +++ b/openerp/addons/base/ir/ir_fields.py @@ -253,7 +253,7 @@ class ir_fields_converter(orm.Model): if not isinstance(selection, (tuple, list)): # FIXME: Don't pass context to avoid translations? # Or just copy context & remove lang? - selection = selection(model, cr, uid) + selection = selection(model, cr, uid, context=None) for item, label in selection: labels = self._get_translations( cr, uid, ('selection', 'model', 'code'), label, context=context) diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py index 345973526c5..3a0131c2a05 100644 --- a/openerp/addons/base/tests/test_base.py +++ b/openerp/addons/base/tests/test_base.py @@ -304,5 +304,47 @@ class test_partner_recursion(common.TransactionCase): cr, uid, p1, p2, p3 = self.cr, self.uid, self.p1, self.p2, self.p3 self.assertTrue(self.res_partner.write(cr, uid, [p1,p2,p3], {'phone': '123456'})) +class test_translation(common.TransactionCase): + + def setUp(self): + super(test_translation, self).setUp() + 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.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'}) + + def test_101_create_translated_record(self): + cr, uid = self.cr, self.uid + + 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'}) + 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'}) + + 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'}) + 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'}) + + 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'}) + self.assertEqual(fr_context_cat.name, 'Clients', "Did not found translation for initial value") + + if __name__ == '__main__': unittest2.main() diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 1ed1be7de6d..fa428cb7f00 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -5060,7 +5060,6 @@ class BaseModel(object): # TODO it seems fields_get can be replaced by _all_columns (no need for translation) fields = self.fields_get(cr, uid, context=context) - translation_records = [] for field_name, field_def in fields.items(): # we must recursively copy the translations for o2o and o2m if field_def['type'] == 'one2many': @@ -5074,22 +5073,31 @@ class BaseModel(object): target_obj.copy_translations(cr, uid, old_child, new_child, context=context) # and for translatable fields we keep them for copy elif field_def.get('translate'): - trans_name = '' + if field_name in self._columns: trans_name = self._name + "," + field_name + res_id = new_id + elif field_name in self._inherit_fields: trans_name = self._inherit_fields[field_name][0] + "," + field_name - if trans_name: - trans_ids = trans_obj.search(cr, uid, [ - ('name', '=', trans_name), - ('res_id', '=', old_id) - ]) - translation_records.extend(trans_obj.read(cr, uid, trans_ids, context=context)) + # get the id of the parent record to set the translation + inherit_field_name = self._inherit_fields[field_name][1] + res_id = self.read(cr, uid, [new_id], [inherit_field_name], context=context)[0][inherit_field_name][0] - for record in translation_records: - del record['id'] - record['res_id'] = new_id - trans_obj.create(cr, uid, record, context=context) + else: + continue + + trans_ids = trans_obj.search(cr, uid, [ + ('name', '=', trans_name), + ('res_id', '=', old_id) + ]) + records = trans_obj.read(cr, uid, trans_ids, context=context) + for record in records: + del record['id'] + # remove source to avoid triggering _set_src + del record['source'] + record.update({'res_id': res_id}) + trans_obj.create(cr, uid, record, context=context) def copy(self, cr, uid, id, default=None, context=None): diff --git a/openerp/report/render/rml2pdf/trml2pdf.py b/openerp/report/render/rml2pdf/trml2pdf.py index 2052b128ad9..6a35e3a3806 100644 --- a/openerp/report/render/rml2pdf/trml2pdf.py +++ b/openerp/report/render/rml2pdf/trml2pdf.py @@ -631,6 +631,18 @@ class _rml_Illustration(platypus.flowables.Flowable): drw = _rml_draw(self.localcontext ,self.node,self.styles, images=self.self2.images, path=self.self2.path, title=self.self2.title) drw.render(self.canv, None) +# Workaround for issue #15: https://bitbucket.org/rptlab/reportlab/issue/15/infinite-pages-produced-when-splitting +original_pto_split = platypus.flowables.PTOContainer.split +def split(self, availWidth, availHeight): + res = original_pto_split(self, availWidth, availHeight) + if len(res) > 2 and len(self._content) > 0: + header = self._content[0]._ptoinfo.header + trailer = self._content[0]._ptoinfo.trailer + if isinstance(res[-2], platypus.flowables.UseUpSpace) and len(header + trailer) == len(res[:-2]): + return [] + return res +platypus.flowables.PTOContainer.split = split + class _rml_flowable(object): def __init__(self, doc, localcontext, images=None, path='.', title=None, canvas=None): if images is None: @@ -1012,11 +1024,16 @@ class _rml_template(object): # Reset Page Number with new story tag fis.append(PageReset()) story_cnt += 1 - if self.localcontext and self.localcontext.get('internal_header',False): - self.doc_tmpl.afterFlowable(fis) - self.doc_tmpl.build(fis,canvasmaker=NumberedCanvas) - else: - self.doc_tmpl.build(fis) + try: + if self.localcontext and self.localcontext.get('internal_header',False): + self.doc_tmpl.afterFlowable(fis) + self.doc_tmpl.build(fis,canvasmaker=NumberedCanvas) + else: + self.doc_tmpl.build(fis) + except platypus.doctemplate.LayoutError, e: + e.name = 'Print Error' + e.value = 'The document you are trying to print contains a table row that does not fit on one page. Please try to split it in smaller rows or contact your administrator.' + raise def parseNode(rml, localcontext=None, fout=None, images=None, path='.', title=None): node = etree.XML(rml) diff --git a/openerpcommand/common.py b/openerpcommand/common.py index f306d7f4b2d..9209f8e1eb6 100644 --- a/openerpcommand/common.py +++ b/openerpcommand/common.py @@ -40,8 +40,7 @@ def get_addons_from_paths(paths, exclude): module_names = [] for p in paths: if os.path.exists(p): - names = list(set(os.listdir(p))) - names = filter(lambda a: not (a.startswith('.') or a in exclude), names) + names = [n for n in os.listdir(p) if os.path.isfile(os.path.join(p, n, '__openerp__.py')) and not n.startswith('.') and n not in exclude] names = filter(lambda a: os.path.isdir(os.path.join(p, a)), names) names = filter(lambda a: os.path.exists(os.path.join(p, a, '__openerp__.py')), names) module_names.extend(names)