diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml
index f98b888399b..9c94c8179f9 100644
--- a/bin/addons/base/ir/ir.xml
+++ b/bin/addons/base/ir/ir.xml
@@ -1040,8 +1040,8 @@
-
-
+
+
diff --git a/bin/addons/base/report/corporate_defaults.xsl b/bin/addons/base/report/corporate_defaults.xsl
index de2ef8ee2e1..414071466af 100644
--- a/bin/addons/base/report/corporate_defaults.xsl
+++ b/bin/addons/base/report/corporate_defaults.xsl
@@ -17,11 +17,11 @@
- 1cm 25.4cm 20cm 25.4cm
-
+ 1cm 28.4cm 20cm 28.4cm
+ 1cm 25.4cm 7cm 25.4cm
-
+
@@ -34,17 +34,17 @@
Mail:
-
+
-
- 1.5cm 1.2cm 19.9cm 1.2cm
+
+ 1.5cm 2.2cm 19.9cm 2.2cm
Your contact :
-
+
-
+
@@ -71,7 +71,7 @@
-
+
1.5cm 1.2cm 19.9cm 1.2cm
diff --git a/bin/osv/fields.py b/bin/osv/fields.py
index ee235e95eca..dbd37ec8a76 100644
--- a/bin/osv/fields.py
+++ b/bin/osv/fields.py
@@ -641,6 +641,17 @@ class function(_column):
else:
res = self._fnct(cr, obj._table, ids, name, self._arg, context)
+ if self._type == "many2one" :
+ # Filtering only integer/long values if passed
+ res_ids = [x for x in res.values() if x and isinstance(x, (int,long))]
+
+ if res_ids:
+ obj_model = obj.pool.get(self._obj)
+ dict_names = dict(obj_model.name_get(cr, user, res_ids, context))
+ for r in res.keys():
+ if res[r] and res[r] in dict_names:
+ res[r] = (res[r], dict_names[res[r]])
+
if self._type == 'binary' and context.get('bin_size', False):
# convert the data returned by the function with the size of that data...
res = dict(map(lambda (x, y): (x, tools.human_size(len(y or ''))), res.items()))
diff --git a/bin/osv/orm.py b/bin/osv/orm.py
index 9ed0087415f..05b899a5eff 100644
--- a/bin/osv/orm.py
+++ b/bin/osv/orm.py
@@ -524,7 +524,7 @@ class orm_template(object):
warning = ''
warning_fields = []
for field in fields_export:
- if imp_comp and len(field)>1:
+ if imp_comp and len(field)>1:
warning_fields.append('/'.join(map(lambda x:x in cols and cols[x].string or x,field)))
elif len (field) <=1:
if imp_comp and cols.get(field and field[0],False):
@@ -547,12 +547,20 @@ class orm_template(object):
fields = map(lambda x: x.split('/'), fields)
logger = netsvc.Logger()
ir_model_data_obj = self.pool.get('ir.model.data')
+
+ def _check_db_id(self, model_name, db_id):
+ obj_model = self.pool.get(model_name)
+ ids = obj_model.search(cr, uid, [('id','=',int(db_id))])
+ if not len(ids):
+ raise Exception(_("Database ID doesn't exist: %s : %s") %(model_name, db_id))
+ return True
+
def process_liness(self, datas, prefix, current_module, model_name, fields_def, position=0):
line = datas[position]
row = {}
translate = {}
todo = []
- warning = ''
+ warning = []
data_id = False
data_res_id = False
is_xml_id = False
@@ -566,7 +574,37 @@ class orm_template(object):
raise Exception(_('Please check that all your lines have %d columns.') % (len(fields),))
if not line[i]:
continue
- field = fields[i]
+ field = fields[i]
+ if (len(field)==len(prefix)+1) and field[len(prefix)].endswith(':db_id'):
+ # Database ID
+ res = False
+ if line[i]:
+ field_name = field[0].split(':')[0]
+ model_rel = fields_def[field_name]['relation']
+
+ if fields_def[field[len(prefix)][:-6]]['type']=='many2many':
+ res_id = []
+ for db_id in line[i].split(config.get('csv_internal_sep')):
+ try:
+ _check_db_id(self, model_rel, db_id)
+ res_id.append(db_id)
+ except Exception,e:
+ warning += [tools.exception_to_unicode(e)]
+ logger.notifyChannel("import", netsvc.LOG_ERROR,
+ tools.exception_to_unicode(e))
+ if len(res_id):
+ res = [(6, 0, res_id)]
+ else:
+ try:
+ _check_db_id(self, model_rel, line[i])
+ res = line[i]
+ except Exception,e:
+ warning += [tools.exception_to_unicode(e)]
+ logger.notifyChannel("import", netsvc.LOG_ERROR,
+ tools.exception_to_unicode(e))
+ row[field_name] = res or False
+ continue
+
if (len(field)==len(prefix)+1) and field[len(prefix)].endswith(':id'):
res_id = False
if line[i]:
@@ -619,30 +657,21 @@ class orm_template(object):
ir_model_data_obj.create(cr, uid, {'module':module, 'model':model_name, 'name':name, 'res_id':is_db_id})
db_id = is_db_id
if is_db_id and int(db_id) != int(is_db_id):
- warning += ("Id is not the same than existing one: " + str(is_db_id) + " !\n")
+ warning += [_("Id is not the same than existing one: %s")%(is_db_id)]
logger.notifyChannel("import", netsvc.LOG_ERROR,
- "Id is not the same than existing one: " + str(is_db_id) + ' !\n')
+ _("Id is not the same than existing one: %s")%(is_db_id))
continue
if field[len(prefix)] == "db_id":
# Database ID
- try:
- line[i]= int(line[i])
- except Exception, e:
- warning += (str(e) + "!\n")
+ try:
+ _check_db_id(self, model_name, line[i])
+ data_res_id = is_db_id = int(line[i])
+ except Exception,e:
+ warning += [tools.exception_to_unicode(e)]
logger.notifyChannel("import", netsvc.LOG_ERROR,
- str(e) + '!\n')
+ tools.exception_to_unicode(e))
continue
- is_db_id = line[i]
- obj_model = self.pool.get(model_name)
- ids = obj_model.search(cr, uid, [('id','=',line[i])])
- if not len(ids):
- warning += ("Database ID doesn't exist: " + model_name + ": " + str(line[i]) + " !\n")
- logger.notifyChannel("import", netsvc.LOG_ERROR,
- "Database ID doesn't exist: " + model_name + ": " + str(line[i]) + ' !\n')
- continue
- else:
- data_res_id = ids[0]
data_ids = ir_model_data_obj.search(cr, uid, [('model','=',model_name),('res_id','=',line[i])])
if len(data_ids):
d = ir_model_data_obj.read(cr, uid, data_ids, ['name','module'])[0]
@@ -654,9 +683,9 @@ class orm_template(object):
if is_xml_id and not data_id:
data_id = is_xml_id
if is_xml_id and is_xml_id!=data_id:
- warning += ("Id is not the same than existing one: " + str(line[i]) + " !\n")
+ warning += [_("Id is not the same than existing one: %s")%(line[i])]
logger.notifyChannel("import", netsvc.LOG_ERROR,
- "Id is not the same than existing one: " + str(line[i]) + ' !\n')
+ _("Id is not the same than existing one: %s")%(line[i]))
continue
if fields_def[field[len(prefix)]]['type'] == 'integer':
@@ -679,10 +708,10 @@ class orm_template(object):
break
if line[i] and not res:
logger.notifyChannel("import", netsvc.LOG_WARNING,
- "key '%s' not found in selection field '%s'" % \
+ _("key '%s' not found in selection field '%s'") % \
(line[i], field[len(prefix)]))
- warning += "Key/value '"+ str(line[i]) +"' not found in selection field '"+str(field[len(prefix)])+"'"
+ warning += [_("Key/value '%s' not found in selection field '%s'")%(line[i],field[len(prefix)])]
elif fields_def[field[len(prefix)]]['type']=='many2one':
res = False
@@ -692,11 +721,9 @@ class orm_template(object):
line[i], [], operator='=', context=context)
res = (res2 and res2[0][0]) or False
if not res:
- warning += ('Relation not found: ' + line[i] + \
- ' on ' + relation + ' !\n')
+ warning += [_("Relation not found: %s on '%s'")%(line[i],relation)]
logger.notifyChannel("import", netsvc.LOG_WARNING,
- 'Relation not found: ' + line[i] + \
- ' on ' + relation + ' !\n')
+ _("Relation not found: %s on '%s'")%(line[i],relation))
elif fields_def[field[len(prefix)]]['type']=='many2many':
res = []
if line[i]:
@@ -706,12 +733,10 @@ class orm_template(object):
uid, word, [], operator='=', context=context)
res3 = (res2 and res2[0][0]) or False
if not res3:
- warning += ('Relation not found: ' + \
- line[i] + ' on '+relation + ' !\n')
+ warning += [_("Relation not found: %s on '%s'")%(line[i],relation)]
logger.notifyChannel("import",
netsvc.LOG_WARNING,
- 'Relation not found: ' + line[i] + \
- ' on '+relation + ' !\n')
+ _("Relation not found: %s on '%s'")%(line[i],relation))
else:
res.append(res3)
if len(res):
@@ -776,9 +801,9 @@ class orm_template(object):
#try:
(res, other, warning, translate, data_id, res_id) = \
process_liness(self, datas, [], current_module, self._name, fields_def)
- if warning:
+ if len(warning):
cr.rollback()
- return (-1, res, 'Line ' + str(counter) +' : ' + warning, '')
+ return (-1, res, 'Line ' + str(counter) +' : ' + '!\n'.join(warning), '')
try:
id = ir_model_data_obj._update(cr, uid, self._name,
@@ -787,7 +812,7 @@ class orm_template(object):
except Exception, e:
import psycopg2
if isinstance(e,psycopg2.IntegrityError):
- msg= 'Insertion Failed!'
+ msg= _('Insertion Failed!')
for key in self.pool._sql_error.keys():
if key in e[0]:
msg = self.pool._sql_error[key]
diff --git a/bin/report/print_xml.py b/bin/report/print_xml.py
index 63b342457bd..912fdad00a3 100644
--- a/bin/report/print_xml.py
+++ b/bin/report/print_xml.py
@@ -209,7 +209,6 @@ class document(object):
args = [self.eval(browser, arg) for arg in attrs['args'].split(',')]
else:
args = []
-
# get the object
if attrs.has_key('model'):
obj = self.pool.get(attrs['model'])
@@ -232,6 +231,7 @@ class document(object):
newdatas = getattr(obj, attrs['name'])(self.cr, self.uid, ids, *args)
def parse_result_tree(node, parent, datas):
+ if not node.tag == etree.Comment:
el = etree.Element(node.tag)
parent.append(el)
atr = self.node_attrs_get(node)
@@ -251,7 +251,6 @@ class document(object):
elif attrs['type']=='zoom':
value = self.get_value(browser, attrs['name'])
-
if value:
if not isinstance(value, list):
v_list = [value]
@@ -264,12 +263,16 @@ class document(object):
self.parse_node(el_cld, el, v)
else:
# if there is no "type" attribute in the node, copy it to the xml data and parse its childs
- for el_cld in node:
- self.parse_node(el_cld, parent, browser)
-
+ if not node.tag == etree.Comment:
+ if node.tag == parent.tag:
+ el = parent
+ else:
+ el = etree.Element(node.tag)
+ parent.append(el)
+ for el_cld in node:
+ self.parse_node(el_cld,el, browser)
def xml_get(self):
- #return self.doc.toxml('utf-8')
- return etree.tostring(self.doc,encoding="utf-8",xml_declaration=True)
+ return etree.tostring(self.doc,encoding="utf-8",xml_declaration=True,pretty_print=True)
def parse_tree(self, ids, model, context=None):
if not context:
@@ -282,7 +285,6 @@ class document(object):
context={}
# parses the xml template to memory
self.dom = etree.XML(xml)
-
# create the xml data from the xml template
self.parse_tree(ids, model, context)
diff --git a/bin/report/render/rml2pdf/trml2pdf.py b/bin/report/render/rml2pdf/trml2pdf.py
index d73b5068ce0..f4b70a2da27 100644
--- a/bin/report/render/rml2pdf/trml2pdf.py
+++ b/bin/report/render/rml2pdf/trml2pdf.py
@@ -765,12 +765,12 @@ class _rml_template(object):
r = _rml_flowable(self.doc,self.localcontext, images=self.images, path=self.path, title=self.title)
story_cnt = 0
for node_story in node_stories:
+ if story_cnt > 0:
+ fis.append(platypus.PageBreak())
fis += r.render(node_story)
- if self.localcontext:
- story_cnt += 1
- if story_cnt == len(self.localcontext['objects']):
- fis.append(PageCount())
- fis.append(platypus.PageBreak())
+ story_cnt += 1
+ if self.localcontext:
+ fis.append(PageCount())
self.doc_tmpl.build(fis)
def parseNode(rml, localcontext = {},fout=None, images={}, path='.',title=None):
diff --git a/bin/report/render/rml2pdf/utils.py b/bin/report/render/rml2pdf/utils.py
index cb44ee6d5f2..59724d7d1b4 100644
--- a/bin/report/render/rml2pdf/utils.py
+++ b/bin/report/render/rml2pdf/utils.py
@@ -97,7 +97,7 @@ def _child_get(node, self=None, tagname=None):
def _process_text(self, txt):
if not self.localcontext:
- return txt
+ return str2xml(txt)
if not txt:
return ''
result = ''