From 35ee83a233b8787ea9e9ca423ca4bad8b6e984ed Mon Sep 17 00:00:00 2001 From: Naresh Choksy Date: Tue, 25 Aug 2009 12:59:34 +0530 Subject: [PATCH 1/5] [Fix,IMP]:xsl:sml reports for comment node and when there is no type attribute in the node also improved the header for the xsl:xml reports bzr revid: nch@tinyerp.com-20090825072934-ugwcxnl30gx0sdzs --- bin/addons/base/report/corporate_defaults.xsl | 18 +++++++++--------- bin/report/print_xml.py | 18 ++++++++++-------- 2 files changed, 19 insertions(+), 17 deletions(-) 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/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) From 771fdd192ba07f7fb5d3034c8f62034266355534 Mon Sep 17 00:00:00 2001 From: "Jay (Open ERP)" Date: Wed, 26 Aug 2009 15:25:41 +0530 Subject: [PATCH 2/5] [FIX] ir_cron :function and its arguements are now editable lp bug: https://launchpad.net/bugs/415334 fixed bzr revid: jvo@tinyerp.com-20090826095541-a6i4advqo4ywdkpa --- bin/addons/base/ir/ir.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 @@ - - + + From 30b2fc5bd2ddbaf44cd90f006b166de084029bfc Mon Sep 17 00:00:00 2001 From: "Harry (Open ERP)" Date: Wed, 26 Aug 2009 19:10:49 +0530 Subject: [PATCH 3/5] [FIX] import: support ":db_id" , better warning message lp bug: https://launchpad.net/bugs/415973 fixed bzr revid: hmo@tinyerp.com-20090826134049-0wf8td729mgv32g9 --- bin/osv/orm.py | 95 +++++++++++++++++++++++++++++++------------------- 1 file changed, 60 insertions(+), 35 deletions(-) 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] From 20a0acd6cfaba4317a4c5051f7f79d3667acfc67 Mon Sep 17 00:00:00 2001 From: NCH-OpenERP <> Date: Thu, 27 Aug 2009 15:34:54 +0530 Subject: [PATCH 4/5] [FIX] Pagecount probelm while all objects print on same page and printing special character on xsl report bzr revid: hda@tinyerp.com-20090827100454-ph1ffi4ulanykb7s --- bin/report/render/rml2pdf/trml2pdf.py | 10 +++++----- bin/report/render/rml2pdf/utils.py | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) 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 = '' From ce0c60e15212e595354e35cb0b1ae9ce652b46db Mon Sep 17 00:00:00 2001 From: "Jay (Open ERP)" Date: Thu, 27 Aug 2009 19:49:22 +0530 Subject: [PATCH 5/5] [FIX] Functional fields with M2O relation can be printed on print screen now lp bug: https://launchpad.net/bugs/415391 fixed bzr revid: jvo@tinyerp.com-20090827141922-aapmtmc50y168jun --- bin/osv/fields.py | 11 +++++++++++ 1 file changed, 11 insertions(+) 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()))