all being well this patch created with quilt should apply the changes I incorporated from changeset 1826.
Index: openerp-server-5.0.3-0/bin/osv/orm.py =================================================================== --- openerp-server-5.0.3-0.orig/bin/osv/orm.py 2009-09-15 13:55:41.512239947 +0100 +++ openerp-server-5.0.3-0/bin/osv/orm.py 2009-09-15 13:56:10.847743162 +0100 @@ -50,16 +50,16 @@ import fields import tools - +from tools.translate import _ import sys -import libxml2 + try: - from xml import dom + from lxml import etree except ImportError: - sys.stderr.write("ERROR: Import xpath module\n") - sys.stderr.write("ERROR: Try to install the old python-xml package\n") - sys.stderr.write('On Ubuntu Jaunty, try this: sudo cp /usr/lib/python2.6/dist-packages/oldxml/_xmlplus/utils/boolean.so /usr/lib/python2.5/site-packages/oldxml/_xmlplus/utils\n') - raise + sys.stderr.write("ERROR: Import lxml module\n") + sys.stderr.write("ERROR: Try to install the python-lxml package\n") + sys.exit(2) + from tools.config import config @@ -944,14 +944,14 @@ fields = {} childs = True - if node.nodeType == node.ELEMENT_NODE and node.localName == 'field': - if node.hasAttribute('name'): + if node.tag == 'field': + if node.get('name'): attrs = {} try: - if node.getAttribute('name') in self._columns: - column = self._columns[node.getAttribute('name')] + if node.get('name') in self._columns: + column = self._columns[node.get('name')] else: - column = self._inherit_fields[node.getAttribute('name')][2] + column = self._inherit_fields[node.get('name')][2] except: column = False @@ -959,64 +959,63 @@ relation = column._obj childs = False views = {} - for f in node.childNodes: - if f.nodeType == f.ELEMENT_NODE and f.localName in ('form', 'tree', 'graph'): - node.removeChild(f) + for f in node: + if f.tag in ('form', 'tree', 'graph'): + node.remove(f) ctx = context.copy() ctx['base_model_name'] = self._name xarch, xfields = self.pool.get(relation).__view_look_dom_arch(cr, user, f, view_id, ctx) - views[str(f.localName)] = { + views[str(f.tag)] = { 'arch': xarch, 'fields': xfields } attrs = {'views': views} - if node.hasAttribute('widget') and node.getAttribute('widget')=='selection': + if node.get('widget') and node.get('widget') == 'selection': # We can not use the 'string' domain has it is defined according to the record ! dom = None if column._domain and not isinstance(column._domain, (str, unicode)): dom = column._domain attrs['selection'] = self.pool.get(relation).name_search(cr, user, '', dom, context=context) - if (node.hasAttribute('required') and not int(node.getAttribute('required'))) or not column.required: + if (node.get('required') and not int(node.get('required'))) or not column.required: attrs['selection'].append((False,'')) - fields[node.getAttribute('name')] = attrs + fields[node.get('name')] = attrs - elif node.nodeType==node.ELEMENT_NODE and node.localName in ('form', 'tree'): - result = self.view_header_get(cr, user, False, node.localName, context) + elif node.tag in ('form', 'tree'): + result = self.view_header_get(cr, user, False, node.tag, context) if result: - node.setAttribute('string', result) + node.set('string', result) - elif node.nodeType==node.ELEMENT_NODE and node.localName == 'calendar': + elif node.tag == 'calendar': for additional_field in ('date_start', 'date_delay', 'date_stop', 'color'): - if node.hasAttribute(additional_field) and node.getAttribute(additional_field): - fields[node.getAttribute(additional_field)] = {} + if node.get(additional_field): + fields[node.get(additional_field)] = {} - if node.nodeType == node.ELEMENT_NODE and node.hasAttribute('groups'): - if node.getAttribute('groups'): - groups = node.getAttribute('groups').split(',') + if 'groups' in node.attrib: + if node.get('groups'): + groups = node.get('groups').split(',') readonly = False access_pool = self.pool.get('ir.model.access') for group in groups: readonly = readonly or access_pool.check_groups(cr, user, group) if not readonly: - node.setAttribute('invisible', '1') - node.removeAttribute('groups') + node.set('invisible', '1') + del(node.attrib['groups']) - if node.nodeType == node.ELEMENT_NODE: - # translate view - if ('lang' in context) and not result: - if node.hasAttribute('string') and node.getAttribute('string'): - trans = self.pool.get('ir.translation')._get_source(cr, user, self._name, 'view', context['lang'], node.getAttribute('string').encode('utf8')) - if not trans and ('base_model_name' in context): - trans = self.pool.get('ir.translation')._get_source(cr, user, context['base_model_name'], 'view', context['lang'], node.getAttribute('string').encode('utf8')) - if trans: - node.setAttribute('string', trans) - if node.hasAttribute('sum') and node.getAttribute('sum'): - trans = self.pool.get('ir.translation')._get_source(cr, user, self._name, 'view', context['lang'], node.getAttribute('sum').encode('utf8')) - if trans: - node.setAttribute('sum', trans) + # translate view + if ('lang' in context) and not result: + if node.get('string'): + trans = self.pool.get('ir.translation')._get_source(cr, user, self._name, 'view', context['lang'], node.get('string').encode('utf8')) + if not trans and ('base_model_name' in context): + trans = self.pool.get('ir.translation')._get_source(cr, user, context['base_model_name'], 'view', context['lang'], node.get('string').encode('utf8')) + if trans: + node.set('string', trans) + if node.get('sum'): + trans = self.pool.get('ir.translation')._get_source(cr, user, self._name, 'view', context['lang'], node.get('sum').encode('utf8')) + if trans: + node.set('sum', trans) if childs: - for f in node.childNodes: + for f in node: fields.update(self.__view_look_dom(cr, user, f, view_id, context)) return fields @@ -1027,23 +1026,23 @@ rolesobj = self.pool.get('res.roles') usersobj = self.pool.get('res.users') - buttons = (n for n in node.getElementsByTagName('button') if n.getAttribute('type') != 'object') + buttons = (n for n in node.getiterator('button') if n.get('type') != 'object') for button in buttons: ok = True if user != 1: # admin user has all roles user_roles = usersobj.read(cr, user, [user], ['roles_id'])[0]['roles_id'] - cr.execute("select role_id from wkf_transition where signal=%s", (button.getAttribute('name'),)) + cr.execute("select role_id from wkf_transition where signal=%s", (button.get('name'),)) roles = cr.fetchall() for role in roles: if role[0]: ok = ok and rolesobj.check(cr, user, user_roles, role[0]) if not ok: - button.setAttribute('readonly', '1') + button.set('readonly', '1') else: - button.setAttribute('readonly', '0') + button.set('readonly', '0') - arch = node.toxml(encoding="utf-8").replace('\t', '') + arch = etree.tostring(node, encoding="utf-8").replace('\t', '') fields = self.fields_get(cr, user, fields_def.keys(), context) for field in fields_def: if field == 'id': @@ -1108,70 +1107,64 @@ def _inherit_apply(src, inherit): def _find(node, node2): - if node2.nodeType == node2.ELEMENT_NODE and node2.localName == 'xpath': - res = xpath.Evaluate(node2.getAttribute('expr'), node) + if node2.tag == 'xpath': + res = node.xpath(node2.get('expr')) return res and res[0] else: - if node.nodeType == node.ELEMENT_NODE and node.localName == node2.localName: + for n in node.getiterator(node2.tag): res = True - for attr in node2.attributes.keys(): + for attr in node2.attrib: if attr == 'position': continue - if node.hasAttribute(attr): - if node.getAttribute(attr)==node2.getAttribute(attr): + if n.get(attr): + if n.get(attr) == node2.get(attr): continue res = False if res: - return node - for child in node.childNodes: - res = _find(child, node2) - if res: - return res + return n return None + # End: _find(node, node2) - - doc_src = dom.minidom.parseString(encode(src)) - doc_dest = dom.minidom.parseString(encode(inherit)) - toparse = doc_dest.childNodes + doc_dest = etree.fromstring(encode(inherit)) + toparse = [ doc_dest ] while len(toparse): node2 = toparse.pop(0) - if not node2.nodeType == node2.ELEMENT_NODE: - continue - if node2.localName == 'data': - toparse += node2.childNodes + if node2.tag == 'data': + toparse += [ c for c in doc_dest ] continue - node = _find(doc_src, node2) - if node: + node = _find(src, node2) + if node is not None: pos = 'inside' - if node2.hasAttribute('position'): - pos = node2.getAttribute('position') + if node2.get('position'): + pos = node2.get('position') if pos == 'replace': - parent = node.parentNode - for child in node2.childNodes: - if child.nodeType == child.ELEMENT_NODE: - parent.insertBefore(child, node) - parent.removeChild(node) + for child in node2: + node.addprevious(child) + node.getparent().remove(node) else: - sib = node.nextSibling - for child in node2.childNodes: - if child.nodeType == child.ELEMENT_NODE: - if pos == 'inside': - node.appendChild(child) - elif pos == 'after': - node.parentNode.insertBefore(child, sib) - elif pos=='before': - node.parentNode.insertBefore(child, node) + sib = node.getnext() + for child in node2: + if pos == 'inside': + node.append(child) + elif pos == 'after': + if sib is None: + node.addnext(child) else: - raise AttributeError(_('Unknown position in inherited view %s !') % pos) + sib.addprevious(child) + elif pos == 'before': + node.addprevious(child) + else: + raise AttributeError(_('Unknown position in inherited view %s !') % pos) else: attrs = ''.join([ - ' %s="%s"' % (attr, node2.getAttribute(attr)) - for attr in node2.attributes.keys() + ' %s="%s"' % (attr, node2.get(attr)) + for attr in node2.attrib if attr != 'position' ]) - tag = "<%s%s>" % (node2.localName, attrs) + tag = "<%s%s>" % (node2.tag, attrs) raise AttributeError(_("Couldn't find tag '%s' in parent view !") % tag) - return doc_src.toxml(encoding="utf-8").replace('\t', '') + return src + # End: _inherit_apply(src, inherit) result = {'type': view_type, 'model': self._name} @@ -1214,7 +1207,8 @@ result = _inherit_apply_rec(result, id) return result - result['arch'] = _inherit_apply_rec(result['arch'], sql_res[3]) + inherit_result = etree.fromstring(encode(result['arch'])) + result['arch'] = _inherit_apply_rec(inherit_result, sql_res[3]) result['name'] = sql_res[1] result['field_parent'] = sql_res[2] or False @@ -1241,13 +1235,12 @@ xml = self.__get_default_calendar_view() else: xml = '' - result['arch'] = xml + result['arch'] = etree.fromstring(xml) result['name'] = 'default' result['field_parent'] = False result['view_id'] = 0 - doc = dom.minidom.parseString(encode(result['arch'])) - xarch, xfields = self.__view_look_dom_arch(cr, user, doc, view_id, context=context) + xarch, xfields = self.__view_look_dom_arch(cr, user, result['arch'], view_id, context=context) result['arch'] = xarch result['fields'] = xfields if toolbar: Index: openerp-server-5.0.3-0/bin/tools/convert.py =================================================================== --- openerp-server-5.0.3-0.orig/bin/tools/convert.py 2009-09-15 13:55:27.172239221 +0100 +++ openerp-server-5.0.3-0/bin/tools/convert.py 2009-09-15 13:57:54.071737924 +0100 @@ -21,7 +21,7 @@ ############################################################################## import re import cStringIO -import xml.dom.minidom +from lxml import etree import osv import ir import pooler @@ -62,16 +62,13 @@ def _eval_xml(self,node, pool, cr, uid, idref, context=None): if context is None: context = {} - if node.nodeType == node.TEXT_NODE: - return node.data.encode("utf8") - elif node.nodeType == node.ELEMENT_NODE: - if node.nodeName in ('field','value'): - t = node.getAttribute('type') or 'char' - f_model = node.getAttribute("model").encode('ascii') - if len(node.getAttribute('search')): - f_search = node.getAttribute("search").encode('utf-8') - f_use = node.getAttribute("use").encode('ascii') - f_name = node.getAttribute("name").encode('utf-8') + if node.tag in ('field','value'): + t = node.get('type','') or 'char' + f_model = node.get("model", '').encode('ascii') + if len(node.get('search','')): + f_search = node.get("search",'').encode('utf-8') + f_use = node.get("use",'').encode('ascii') + f_name = node.get("name",'').encode('utf-8') if len(f_use)==0: f_use = "id" q = eval(f_search, idref) @@ -87,7 +84,7 @@ if isinstance(f_val, tuple): f_val = f_val[0] return f_val - a_eval = node.getAttribute('eval') + a_eval = node.get('eval','') if len(a_eval): import time from mx import DateTime @@ -116,14 +113,11 @@ if not id in idref: idref[id]=self.id_get(cr, False, id) return s % idref - txt = '<?xml version="1.0"?>\n'+_process("".join([i.toxml().encode("utf8") for i in node.childNodes]), idref) -# txt = '<?xml version="1.0"?>\n'+"".join([i.toxml().encode("utf8") for i in node.childNodes]) % idref - + txt = '<?xml version="1.0"?>\n'+_process("".join([etree.tostring(i).encode("utf8") for i in node.getchildren()]), idref) return txt if t in ('char', 'int', 'float'): d = "" - for n in [i for i in node.childNodes]: - d+=str(_eval_xml(self,n,pool,cr,uid,idref)) + d = node.text if t == 'int': d = d.strip() if d=='None': @@ -135,37 +129,37 @@ return d elif t in ('list','tuple'): res=[] - for n in [i for i in node.childNodes if (i.nodeType == i.ELEMENT_NODE and i.nodeName=='value')]: + for n in [i for i in node.getchildren() if (i.tag=='value')]: res.append(_eval_xml(self,n,pool,cr,uid,idref)) if t=='tuple': return tuple(res) return res - elif node.nodeName=="getitem": - for n in [i for i in node.childNodes if (i.nodeType == i.ELEMENT_NODE)]: - res=_eval_xml(self,n,pool,cr,uid,idref) - if not res: - raise LookupError - elif node.getAttribute('type') in ("int", "list"): - return res[int(node.getAttribute('index'))] - else: - return res[node.getAttribute('index').encode("utf8")] - elif node.nodeName=="function": - args = [] - a_eval = node.getAttribute('eval') - if len(a_eval): - idref['ref'] = lambda x: self.id_get(cr, False, x) - args = eval(a_eval, idref) - for n in [i for i in node.childNodes if (i.nodeType == i.ELEMENT_NODE)]: - args.append(_eval_xml(self,n, pool, cr, uid, idref, context)) - model = pool.get(node.getAttribute('model')) - method = node.getAttribute('name') - res = getattr(model, method)(cr, uid, *args) - return res - elif node.nodeName=="test": - d = "" - for n in [i for i in node.childNodes]: - d+=str(_eval_xml(self,n,pool,cr,uid,idref, context=context)) - return d + elif node.tag == "getitem": + for n in [i for i in node.getchildren()]: + res=_eval_xml(self,n,pool,cr,uid,idref) + if not res: + raise LookupError + elif node.get('type','') in ("int", "list"): + return res[int(node.get('index',''))] + else: + return res[node.get('index','').encode("utf8")] + elif node.tag == "function": + args = [] + a_eval = node.get('eval','') + if len(a_eval): + idref['ref'] = lambda x: self.id_get(cr, False, x) + args = eval(a_eval, idref) + for n in [i for i in node.getchildren()]: + return_val = _eval_xml(self,n, pool, cr, uid, idref, context) + if return_val != None: + args.append(return_val) + model = pool.get(node.get('model','')) + method = node.get('name','') + res = getattr(model, method)(cr, uid, *args) + return res + elif node.tag == "test": + d = node.text + return d escape_re = re.compile(r'(?<!\\)/') @@ -205,9 +199,9 @@ @staticmethod def nodeattr2bool(node, attr, default=False): - if not node.hasAttribute(attr): + if not node.get(attr): return default - val = node.getAttribute(attr).strip() + val = node.get(attr).strip() if not val: return default return val.lower() not in ('0', 'false', 'off') @@ -216,20 +210,20 @@ return self.noupdate or (data_node and self.nodeattr2bool(data_node, 'noupdate', False)) def get_context(self, data_node, node, eval_dict): - data_node_context = (data_node and data_node.getAttribute('context').encode('utf8')) + data_node_context = (data_node and data_node.get('context','').encode('utf8')) if data_node_context: context = eval(data_node_context, eval_dict) else: context = {} - node_context = node.getAttribute("context").encode('utf8') + node_context = node.get("context",'').encode('utf8') if len(node_context): context.update(eval(node_context, eval_dict)) return context def get_uid(self, cr, uid, data_node, node): - node_uid = node.getAttribute('uid') or (data_node and data_node.getAttribute('uid')) + node_uid = node.get('uid','') or (data_node and data_node.get('uid','')) if len(node_uid): return self.id_get(cr, None, node_uid) return uid @@ -249,9 +243,9 @@ self.logger.notifyChannel('init', netsvc.LOG_ERROR, 'id: %s is to long (max: 64)'% (id,)) def _tag_delete(self, cr, rec, data_node=None): - d_model = rec.getAttribute("model") - d_search = rec.getAttribute("search") - d_id = rec.getAttribute("id") + d_model = rec.get("model",'') + d_search = rec.get("search",'') + d_id = rec.get("id",'') ids = [] if len(d_search): ids = self.pool.get(d_model).search(cr,self.uid,eval(d_search)) @@ -269,24 +263,24 @@ def _tag_report(self, cr, rec, data_node=None): res = {} for dest,f in (('name','string'),('model','model'),('report_name','name')): - res[dest] = rec.getAttribute(f).encode('utf8') + res[dest] = rec.get(f,'').encode('utf8') assert res[dest], "Attribute %s of report is empty !" % (f,) for field,dest in (('rml','report_rml'),('xml','report_xml'),('xsl','report_xsl'),('attachment','attachment'),('attachment_use','attachment_use')): - if rec.hasAttribute(field): - res[dest] = rec.getAttribute(field).encode('utf8') - if rec.hasAttribute('auto'): - res['auto'] = eval(rec.getAttribute('auto')) - if rec.hasAttribute('sxw'): - sxw_content = misc.file_open(rec.getAttribute('sxw')).read() + if rec.get(field): + res[dest] = rec.get(field,'').encode('utf8') + if rec.get('auto'): + res['auto'] = eval(rec.get('auto','')) + if rec.get('sxw'): + sxw_content = misc.file_open(rec.get('sxw','')).read() res['report_sxw_content'] = sxw_content - if rec.hasAttribute('header'): - res['header'] = eval(rec.getAttribute('header')) - res['multi'] = rec.hasAttribute('multi') and eval(rec.getAttribute('multi')) - xml_id = rec.getAttribute('id').encode('utf8') + if rec.get('header'): + res['header'] = eval(rec.get('header','')) + res['multi'] = rec.get('multi','') and eval(rec.get('multi','')) + xml_id = rec.get('id','').encode('utf8') self._test_xml_id(xml_id) - if rec.hasAttribute('groups'): - g_names = rec.getAttribute('groups').split(',') + if rec.get('groups'): + g_names = rec.get('groups','').split(',') groups_value = [] groups_obj = self.pool.get('res.groups') for group in g_names: @@ -302,11 +296,11 @@ self.idref[xml_id] = int(id) - if not rec.hasAttribute('menu') or eval(rec.getAttribute('menu')): - keyword = str(rec.getAttribute('keyword') or 'client_print_multi') + if not rec.get('menu') or eval(rec.get('menu','')): + keyword = str(rec.get('keyword','') or 'client_print_multi') keys = [('action',keyword),('res_model',res['model'])] value = 'ir.actions.report.xml,'+str(id) - replace = rec.hasAttribute('replace') and rec.getAttribute("replace") or True + replace = rec.get("replace",'') or True self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, res['name'], [res['model']], value, replace=replace, isobject=True, xml_id=xml_id) return False @@ -319,16 +313,16 @@ return False def _tag_wizard(self, cr, rec, data_node=None): - string = rec.getAttribute("string").encode('utf8') - model = rec.getAttribute("model").encode('utf8') - name = rec.getAttribute("name").encode('utf8') - xml_id = rec.getAttribute('id').encode('utf8') + string = rec.get("string",'').encode('utf8') + model = rec.get("model",'').encode('utf8') + name = rec.get("name",'').encode('utf8') + xml_id = rec.get('id','').encode('utf8') self._test_xml_id(xml_id) - multi = rec.hasAttribute('multi') and eval(rec.getAttribute('multi')) + multi = rec.get('multi','') and eval(rec.get('multi','')) res = {'name': string, 'wiz_name': name, 'multi': multi, 'model': model} - if rec.hasAttribute('groups'): - g_names = rec.getAttribute('groups').split(',') + if rec.get('groups'): + g_names = rec.get('groups','').split(',') groups_value = [] groups_obj = self.pool.get('res.groups') for group in g_names: @@ -343,20 +337,19 @@ id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.wizard", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) self.idref[xml_id] = int(id) # ir_set - if (not rec.hasAttribute('menu') or eval(rec.getAttribute('menu'))) and id: - keyword = str(rec.getAttribute('keyword') or 'client_action_multi') + if (not rec.get('menu') or eval(rec.get('menu',''))) and id: + keyword = str(rec.get('keyword','') or 'client_action_multi') keys = [('action',keyword),('res_model',model)] value = 'ir.actions.wizard,'+str(id) - replace = rec.hasAttribute('replace') and \ - rec.getAttribute("replace") or True + replace = rec.get("replace",'') or True self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, string, [model], value, replace=replace, isobject=True, xml_id=xml_id) return False def _tag_url(self, cr, rec, data_node=None): - url = rec.getAttribute("string").encode('utf8') - target = rec.getAttribute("target").encode('utf8') - name = rec.getAttribute("name").encode('utf8') - xml_id = rec.getAttribute('id').encode('utf8') + url = rec.get("string",'').encode('utf8') + target = rec.get("target",'').encode('utf8') + name = rec.get("name",'').encode('utf8') + xml_id = rec.get('id','').encode('utf8') self._test_xml_id(xml_id) res = {'name': name, 'url': url, 'target':target} @@ -364,34 +357,31 @@ id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.url", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) self.idref[xml_id] = int(id) # ir_set - if (not rec.hasAttribute('menu') or eval(rec.getAttribute('menu'))) and id: - keyword = str(rec.getAttribute('keyword') or 'client_action_multi') + if (not rec.get('menu') or eval(rec.get('menu',''))) and id: + keyword = str(rec.get('keyword','') or 'client_action_multi') keys = [('action',keyword)] value = 'ir.actions.url,'+str(id) - replace = rec.hasAttribute('replace') and \ - rec.getAttribute("replace") or True + replace = rec.get("replace",'') or True self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, url, ["ir.actions.url"], value, replace=replace, isobject=True, xml_id=xml_id) return False def _tag_act_window(self, cr, rec, data_node=None): - name = rec.hasAttribute('name') and rec.getAttribute('name').encode('utf-8') - xml_id = rec.getAttribute('id').encode('utf8') + name = rec.get('name','').encode('utf-8') + xml_id = rec.get('id','').encode('utf8') self._test_xml_id(xml_id) - type = rec.hasAttribute('type') and rec.getAttribute('type').encode('utf-8') or 'ir.actions.act_window' + type = rec.get('type','').encode('utf-8') or 'ir.actions.act_window' view_id = False - if rec.hasAttribute('view'): - view_id = self.id_get(cr, 'ir.actions.act_window', rec.getAttribute('view').encode('utf-8')) - domain = rec.hasAttribute('domain') and rec.getAttribute('domain').encode('utf-8') - context = rec.hasAttribute('context') and rec.getAttribute('context').encode('utf-8') or '{}' - res_model = rec.getAttribute('res_model').encode('utf-8') - src_model = rec.hasAttribute('src_model') and rec.getAttribute('src_model').encode('utf-8') - view_type = rec.hasAttribute('view_type') and rec.getAttribute('view_type').encode('utf-8') or 'form' - view_mode = rec.hasAttribute('view_mode') and rec.getAttribute('view_mode').encode('utf-8') or 'tree,form' - usage = rec.hasAttribute('usage') and rec.getAttribute('usage').encode('utf-8') - limit = rec.hasAttribute('limit') and rec.getAttribute('limit').encode('utf-8') - auto_refresh = rec.hasAttribute('auto_refresh') \ - and rec.getAttribute('auto_refresh').encode('utf-8') -# groups_id = rec.hasAttribute('groups') and rec.getAttribute('groups').encode('utf-8') + if rec.get('view'): + view_id = self.id_get(cr, 'ir.actions.act_window', rec.get('view','').encode('utf-8')) + domain = rec.get('domain','').encode('utf-8') + context = rec.get('context','').encode('utf-8') or '{}' + res_model = rec.get('res_model','').encode('utf-8') + src_model = rec.get('src_model','').encode('utf-8') + view_type = rec.get('view_type','').encode('utf-8') or 'form' + view_mode = rec.get('view_mode','').encode('utf-8') or 'tree,form' + usage = rec.get('usage','').encode('utf-8') + limit = rec.get('limit','').encode('utf-8') + auto_refresh = rec.get('auto_refresh','').encode('utf-8') # def ref() added because , if context has ref('id') eval wil use this ref @@ -417,8 +407,8 @@ # 'groups_id':groups_id, } - if rec.hasAttribute('groups'): - g_names = rec.getAttribute('groups').split(',') + if rec.get('groups'): + g_names = rec.get('groups','').split(',') groups_value = [] groups_obj = self.pool.get('res.groups') for group in g_names: @@ -430,8 +420,8 @@ groups_value.append((4, group_id)) res['groups_id'] = groups_value - if rec.hasAttribute('target'): - res['target'] = rec.getAttribute('target') + if rec.get('target'): + res['target'] = rec.get('target','') id = self.pool.get('ir.model.data')._update(cr, self.uid, 'ir.actions.act_window', self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) self.idref[xml_id] = int(id) @@ -439,7 +429,7 @@ keyword = 'client_action_relate' keys = [('action', keyword), ('res_model', res_model)] value = 'ir.actions.act_window,'+str(id) - replace = rec.hasAttribute('replace') and rec.getAttribute('replace') or True + replace = rec.get('replace','') or True self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, xml_id, [src_model], value, replace=replace, isobject=True, xml_id=xml_id) # TODO add remove ir.model.data return False @@ -448,8 +438,8 @@ if not self.mode=='init': return False res = {} - for field in [i for i in rec.childNodes if (i.nodeType == i.ELEMENT_NODE and i.nodeName=="field")]: - f_name = field.getAttribute("name").encode('utf-8') + for field in [i for i in rec.getchildren() if (i.tag=="field")]: + f_name = field.get("name",'').encode('utf-8') f_val = _eval_xml(self,field,self.pool, cr, self.uid, self.idref) res[f_name] = f_val self.pool.get('ir.model.data').ir_set(cr, self.uid, res['key'], res['key2'], res['name'], res['models'], res['value'], replace=res.get('replace',True), isobject=res.get('isobject', False), meta=res.get('meta',None)) @@ -458,21 +448,21 @@ def _tag_workflow(self, cr, rec, data_node=None): if self.isnoupdate(data_node) and self.mode != 'init': return - model = str(rec.getAttribute('model')) - w_ref = rec.getAttribute('ref') + model = str(rec.get('model','')) + w_ref = rec.get('ref','') if len(w_ref): id = self.id_get(cr, model, w_ref) else: - assert rec.childNodes, 'You must define a child node if you dont give a ref' - element_childs = [i for i in rec.childNodes if i.nodeType == i.ELEMENT_NODE] - assert len(element_childs) == 1, 'Only one child node is accepted (%d given)' % len(rec.childNodes) + assert rec.getchildren(), 'You must define a child node if you dont give a ref' + element_childs = [i for i in rec.getchildren()] + assert len(element_childs) == 1, 'Only one child node is accepted (%d given)' % len(rec.getchildren()) id = _eval_xml(self, element_childs[0], self.pool, cr, self.uid, self.idref) uid = self.get_uid(cr, self.uid, data_node, rec) wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, model, id, - str(rec.getAttribute('action')), cr) + str(rec.get('action','')), cr) return False # @@ -483,12 +473,12 @@ # parent="parent_id" # def _tag_menuitem(self, cr, rec, data_node=None): - rec_id = rec.getAttribute("id").encode('ascii') + rec_id = rec.get("id",'').encode('ascii') self._test_xml_id(rec_id) - m_l = map(escape, escape_re.split(rec.getAttribute("name").encode('utf8'))) + m_l = map(escape, escape_re.split(rec.get("name",'').encode('utf8'))) values = {'parent_id': False} - if not rec.hasAttribute('parent'): + if not rec.get('parent'): pid = False for idx, menu_elem in enumerate(m_l): if pid: @@ -500,7 +490,7 @@ values = {'parent_id': pid,'name':menu_elem} elif res: pid = res[0] - xml_id = idx==len(m_l)-1 and rec.getAttribute('id').encode('utf8') + xml_id = idx==len(m_l)-1 and rec.get('id','').encode('utf8') try: npid = self.pool.get('ir.model.data')._update_dummy(cr, self.uid, 'ir.ui.menu', self.module, xml_id, idx==len(m_l)-1) except: @@ -510,18 +500,18 @@ self.logger.notifyChannel("init", netsvc.LOG_WARNING, 'Warning no ID for submenu %s of menu %s !' % (menu_elem, str(m_l))) pid = self.pool.get('ir.ui.menu').create(cr, self.uid, {'parent_id' : pid, 'name' : menu_elem}) else: - menu_parent_id = self.id_get(cr, 'ir.ui.menu', rec.getAttribute('parent')) + menu_parent_id = self.id_get(cr, 'ir.ui.menu', rec.get('parent','')) values = {'parent_id': menu_parent_id} - if rec.hasAttribute('name'): - values['name'] = rec.getAttribute('name') + if rec.get('name'): + values['name'] = rec.get('name','') try: - res = [ self.id_get(cr, 'ir.ui.menu', rec.getAttribute('id')) ] + res = [ self.id_get(cr, 'ir.ui.menu', rec.get('id','')) ] except: res = None - if rec.hasAttribute('action'): - a_action = rec.getAttribute('action').encode('utf8') - a_type = rec.getAttribute('type').encode('utf8') or 'act_window' + if rec.get('action'): + a_action = rec.get('action','').encode('utf8') + a_type = rec.get('type','').encode('utf8') or 'act_window' icons = { "act_window": 'STOCK_NEW', "report.xml": 'STOCK_PASTE', @@ -560,13 +550,13 @@ resw = cr.fetchone() if (not values.get('name', False)) and resw: values['name'] = resw[0] - if rec.hasAttribute('sequence'): - values['sequence'] = int(rec.getAttribute('sequence')) - if rec.hasAttribute('icon'): - values['icon'] = str(rec.getAttribute('icon')) + if rec.get('sequence'): + values['sequence'] = int(rec.get('sequence','')) + if rec.get('icon'): + values['icon'] = str(rec.get('icon','')) - if rec.hasAttribute('groups'): - g_names = rec.getAttribute('groups').split(',') + if rec.get('groups'): + g_names = rec.get('groups','').split(',') groups_value = [] groups_obj = self.pool.get('res.groups') for group in g_names: @@ -578,16 +568,16 @@ groups_value.append((4, group_id)) values['groups_id'] = groups_value - xml_id = rec.getAttribute('id').encode('utf8') + xml_id = rec.get('id','').encode('utf8') self._test_xml_id(xml_id) pid = self.pool.get('ir.model.data')._update(cr, self.uid, 'ir.ui.menu', self.module, values, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode, res_id=res and res[0] or False) if rec_id and pid: self.idref[rec_id] = int(pid) - if rec.hasAttribute('action') and pid: - a_action = rec.getAttribute('action').encode('utf8') - a_type = rec.getAttribute('type').encode('utf8') or 'act_window' + if rec.get('action') and pid: + a_action = rec.get('action','').encode('utf8') + a_type = rec.get('type','').encode('utf8') or 'act_window' a_id = self.id_get(cr, 'ir.actions.%s' % a_type, a_action) action = "ir.actions.%s,%d" % (a_type, a_id) self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', 'tree_but_open', 'Menuitem', [('ir.ui.menu', int(pid))], action, True, True, xml_id=rec_id) @@ -600,17 +590,17 @@ if self.isnoupdate(data_node) and self.mode != 'init': return - rec_model = rec.getAttribute("model").encode('ascii') + rec_model = rec.get("model",'').encode('ascii') model = self.pool.get(rec_model) assert model, "The model %s does not exist !" % (rec_model,) - rec_id = rec.getAttribute("id").encode('ascii') + rec_id = rec.get("id",'').encode('ascii') self._test_xml_id(rec_id) - rec_src = rec.getAttribute("search").encode('utf8') - rec_src_count = rec.getAttribute("count") + rec_src = rec.get("search",'').encode('utf8') + rec_src_count = rec.get("count",'') - severity = rec.getAttribute("severity").encode('ascii') or netsvc.LOG_ERROR + severity = rec.get("severity",'').encode('ascii') or netsvc.LOG_ERROR - rec_string = rec.getAttribute("string").encode('utf8') or 'unknown' + rec_string = rec.get("string",'').encode('utf8') or 'unknown' ids = None eval_dict = {'ref': _ref(self, cr)} @@ -651,8 +641,8 @@ globals['floatEqual'] = self._assert_equals globals['ref'] = ref globals['_ref'] = ref - for test in [i for i in rec.childNodes if (i.nodeType == i.ELEMENT_NODE and i.nodeName=="test")]: - f_expr = test.getAttribute("expr").encode('utf-8') + for test in [i for i in rec.getchildren() if (i.tag=="test")]: + f_expr = test.get("expr",'').encode('utf-8') expected_value = _eval_xml(self, test, self.pool, cr, uid, self.idref, context=context) or True expression_value = eval(f_expr, globals) if expression_value != expected_value: # assertion failed @@ -661,7 +651,7 @@ ' xmltag: %s\n' \ ' expected value: %r\n' \ ' obtained value: %r\n' \ - % (rec_string, test.toxml(), expected_value, expression_value) + % (rec_string, etree.tostring(test), expected_value, expression_value) self.logger.notifyChannel('init', severity, msg) sevval = getattr(logging, severity.upper()) if sevval >= config['assert_exit_level']: @@ -672,12 +662,11 @@ self.assert_report.record_assertion(True, severity) def _tag_record(self, cr, rec, data_node=None): - rec_model = rec.getAttribute("model").encode('ascii') + rec_model = rec.get("model").encode('ascii') model = self.pool.get(rec_model) assert model, "The model %s does not exist !" % (rec_model,) - rec_id = rec.getAttribute("id").encode('ascii') + rec_id = rec.get("id",'').encode('ascii') self._test_xml_id(rec_id) - if self.isnoupdate(data_node) and self.mode != 'init': # check if the xml record has an id string if rec_id: @@ -703,17 +692,16 @@ else: # otherwise it is skipped return None - res = {} - for field in [i for i in rec.childNodes if (i.nodeType == i.ELEMENT_NODE and i.nodeName=="field")]: + for field in [i for i in rec.getchildren() if (i.tag == "field")]: #TODO: most of this code is duplicated above (in _eval_xml)... - f_name = field.getAttribute("name").encode('utf-8') - f_ref = field.getAttribute("ref").encode('ascii') - f_search = field.getAttribute("search").encode('utf-8') - f_model = field.getAttribute("model").encode('ascii') + f_name = field.get("name",'').encode('utf-8') + f_ref = field.get("ref",'').encode('ascii') + f_search = field.get("search",'').encode('utf-8') + f_model = field.get("model",'').encode('ascii') if not f_model and model._columns.get(f_name,False): f_model = model._columns[f_name]._obj - f_use = field.getAttribute("use").encode('ascii') or 'id' + f_use = field.get("use",'').encode('ascii') or 'id' f_val = False if len(f_search): @@ -761,24 +749,22 @@ return int(self.pool.get('ir.model.data').read(cr, self.uid, [result], ['res_id'])[0]['res_id']) def parse(self, xmlstr): - d = xml.dom.minidom.parseString(xmlstr) - de = d.documentElement + de = etree.XML(xmlstr) - if not de.nodeName in ['terp', 'openerp']: + if not de.tag in ['terp', 'openerp']: self.logger.notifyChannel("init", netsvc.LOG_ERROR, "Mismatch xml format" ) raise Exception( "Mismatch xml format: only terp or openerp as root tag" ) - if de.nodeName == 'terp': + if de.tag == 'terp': self.logger.notifyChannel("init", netsvc.LOG_WARNING, "The tag <terp/> is deprecated, use <openerp/>") - for n in [i for i in de.childNodes if (i.nodeType == i.ELEMENT_NODE and i.nodeName=="data")]: - for rec in n.childNodes: - if rec.nodeType == rec.ELEMENT_NODE: - if rec.nodeName in self._tags: + for n in [i for i in de.getchildren() if (i.tag=="data")]: + for rec in n.getchildren(): + if rec.tag in self._tags: try: - self._tags[rec.nodeName](self.cr, rec, n) + self._tags[rec.tag](self.cr, rec, n) except: - self.logger.notifyChannel("init", netsvc.LOG_ERROR, '\n'+rec.toxml()) + self.logger.notifyChannel("init", netsvc.LOG_ERROR, '\n'+etree.tostring(rec)) self.cr.rollback() raise return True @@ -891,11 +877,13 @@ pool=pooler.get_pool(cr.dbname) cr=pooler.db.cursor() idref = {} - d = xml.dom.minidom.getDOMImplementation().createDocument(None, "terp", None) - de = d.documentElement - data=d.createElement("data") - de.appendChild(data) - de.appendChild(d.createTextNode('Some textual content.')) + + page = etree.Element ( 'terp' ) + doc = etree.ElementTree ( page ) + data = etree.SubElement ( page, 'data' ) + text_node = etree.SubElement ( page, 'text' ) + text_node.text = 'Some textual content.' + cr.commit() cr.close() Index: openerp-server-5.0.3-0/bin/tools/translate.py =================================================================== --- openerp-server-5.0.3-0.orig/bin/tools/translate.py 2009-09-15 13:55:33.359742361 +0100 +++ openerp-server-5.0.3-0/bin/tools/translate.py 2009-09-15 13:56:23.807740738 +0100 @@ -23,9 +23,9 @@ import os from os.path import join import fnmatch -import csv, xml.dom, re +import csv, re +from lxml import etree import tools, pooler -from osv.orm import BrowseRecordError import ir import netsvc from tools.misc import UpdateableStr @@ -335,9 +335,9 @@ def trans_parse_xsl(de): res = [] - for n in [i for i in de.childNodes if (i.nodeType == i.ELEMENT_NODE)]: - if n.hasAttribute("t"): - for m in [j for j in n.childNodes if (j.nodeType == j.TEXT_NODE)]: + for n in [i for i in de.getchildren()]: + if n.get("t"): + for m in [j for j in n.getchildren()]: l = m.data.strip().replace('\n',' ') if len(l): res.append(l.encode("utf8")) @@ -346,8 +346,8 @@ def trans_parse_rml(de): res = [] - for n in [i for i in de.childNodes if (i.nodeType == i.ELEMENT_NODE)]: - for m in [j for j in n.childNodes if (j.nodeType == j.TEXT_NODE)]: + for n in [i for i in de.getchildren()]: + for m in [j for j in n.getchildren()]: string_list = [s.replace('\n', ' ').strip() for s in re.split('\[\[.+?\]\]', m.data)] for s in string_list: if s: @@ -357,15 +357,15 @@ def trans_parse_view(de): res = [] - if de.hasAttribute("string"): - s = de.getAttribute('string') + if de.get("string"): + s = de.get('string') if s: res.append(s.encode("utf8")) - if de.hasAttribute("sum"): - s = de.getAttribute('sum') + if de.get("sum"): + s = de.get('sum') if s: res.append(s.encode("utf8")) - for n in [i for i in de.childNodes if (i.nodeType == i.ELEMENT_NODE)]: + for n in [i for i in de.getchildren()]: res.extend(trans_parse_view(n)) return res @@ -434,8 +434,8 @@ continue if model=='ir.ui.view': - d = xml.dom.minidom.parseString(encode(obj.arch)) - for t in trans_parse_view(d.documentElement): + d = etree.XML(encode(obj.arch)) + for t in trans_parse_view(d.getroot()): push_translation(module, 'view', encode(obj.model), 0, t) elif model=='ir.actions.wizard': service_name = 'wizard.'+encode(obj.wiz_name) @@ -467,8 +467,8 @@ # export arch arch = result['arch'] if arch and not isinstance(arch, UpdateableStr): - d = xml.dom.minidom.parseString(arch) - for t in trans_parse_view(d.documentElement): + d = etree.XML(arch) + for t in trans_parse_view(d.getroot()): push_translation(module, 'wizard_view', name, 0, t) # export button labels @@ -522,10 +522,10 @@ report_type = "xsl" try: xmlstr = tools.file_open(fname).read() - d = xml.dom.minidom.parseString(xmlstr) - for t in parse_func(d.documentElement): + d = etree.XML()(xmlstr) + for t in parse_func(d.getroot()): push_translation(module, report_type, name, 0, t) - except IOError, xml.dom.expatbuilder.expat.ExpatError: + except IOError, etree.expatbuilder.expat.ExpatError: if fname: logger.notifyChannel("i18n", netsvc.LOG_ERROR, "couldn't export translation for report %s %s %s" % (name, report_type, fname)) Index: openerp-server-5.0.3-0/bin/wizard/__init__.py =================================================================== --- openerp-server-5.0.3-0.orig/bin/wizard/__init__.py 2009-09-15 13:54:56.023738725 +0100 +++ openerp-server-5.0.3-0/bin/wizard/__init__.py 2009-09-15 13:56:40.612241381 +0100 @@ -24,7 +24,7 @@ from tools import copy from tools.misc import UpdateableStr, UpdateableDict from tools.translate import translate -from xml import dom +from lxml import etree import ir import pooler @@ -50,13 +50,12 @@ self.wiz_name = name def translate_view(self, cr, node, state, lang): - if node.nodeType == node.ELEMENT_NODE: - if node.hasAttribute('string') and node.getAttribute('string'): - trans = translate(cr, self.wiz_name+','+state, 'wizard_view', lang, node.getAttribute('string').encode('utf8')) + if node.get('string'): + trans = translate(cr, self.wiz_name+','+state, 'wizard_view', lang, node.get('string').encode('utf8')) if trans: - node.setAttribute('string', trans) - for n in node.childNodes: - self.translate_view(cr, n, state, lang) + node.set('string', trans) + for n in node.getchildren(): + self.translate_view(cr, n, state, lang) def execute_cr(self, cr, uid, data, state='init', context=None): if not context: @@ -132,9 +131,9 @@ # translate arch if not isinstance(arch, UpdateableStr): - doc = dom.minidom.parseString(arch.encode('utf8')) + doc = etree.XML(arch) self.translate_view(cr, doc, state, lang) - arch = doc.toxml() + arch = etree.tostring(doc) # translate buttons button_list = list(button_list)