[MERGE] lxml+etree instead of deprecated XML libs which prevent install on Ubuntu. Merged from old_trunk branch because on ne trunk, commits were not atomics anymore (after pig merge + bzr unability to track partial merge origins).
merge directive used was: bzr merge -r 1825..1826 lp:~openerp/openobject-server/old_trunk tested main flows on manufacturing database + French -> no bug found; still will commit a few more commits related to trunk + etree lp bug: https://launchpad.net/bugs/429519 fixed bzr revid: rvalyi@gmail.com-20091028200443-2ciyhqaz7rczdusy
This commit is contained in:
parent
db8f833229
commit
c9d35c7012
183
bin/osv/orm.py
183
bin/osv/orm.py
|
@ -50,16 +50,15 @@ import pickle
|
|||
|
||||
import fields
|
||||
import tools
|
||||
from tools.translate import _
|
||||
|
||||
import sys
|
||||
|
||||
try:
|
||||
from xml import dom, xpath
|
||||
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")
|
||||
|
||||
from tools.config import config
|
||||
|
||||
|
@ -997,14 +996,14 @@ class orm_template(object):
|
|||
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
|
||||
|
||||
|
@ -1012,65 +1011,63 @@ class orm_template(object):
|
|||
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 = []
|
||||
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
|
||||
|
@ -1081,7 +1078,7 @@ class orm_template(object):
|
|||
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:
|
||||
can_click = True
|
||||
if user != 1: # admin user has all roles
|
||||
|
@ -1104,8 +1101,6 @@ class orm_template(object):
|
|||
#
|
||||
# running -> done = signal_next (role Z)
|
||||
# running -> cancel = signal_cancel (role Z)
|
||||
|
||||
|
||||
# As we don't know the object state, in this scenario,
|
||||
# the button "signal_cancel" will be always shown as there is no restriction to cancel in draft
|
||||
# the button "signal_next" will be show if the user has any of the roles (X Y or Z)
|
||||
|
@ -1113,9 +1108,9 @@ class orm_template(object):
|
|||
if roles:
|
||||
can_click = any((not role) or rolesobj.check(cr, user, user_roles, role) for (role,) in roles)
|
||||
|
||||
button.setAttribute('readonly', str(int(not can_click)))
|
||||
button.set('readonly', str(int(not can_click)))
|
||||
|
||||
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':
|
||||
|
@ -1180,70 +1175,64 @@ class orm_template(object):
|
|||
|
||||
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:
|
||||
if node2.tag == 'data':
|
||||
toparse += [ c for c in doc_dest ]
|
||||
continue
|
||||
if node2.localName == 'data':
|
||||
toparse += node2.childNodes
|
||||
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}
|
||||
|
||||
|
@ -1295,7 +1284,8 @@ class orm_template(object):
|
|||
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
|
||||
|
@ -1322,13 +1312,12 @@ class orm_template(object):
|
|||
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:
|
||||
|
@ -3044,7 +3033,3 @@ class orm(orm_template):
|
|||
if i in ids:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
|
|
@ -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 _obj(pool, cr, uid, model_str, context=None):
|
|||
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 @@ def _eval_xml(self,node, pool, cr, uid, idref, context=None):
|
|||
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 @@ def _eval_xml(self,node, pool, cr, uid, idref, context=None):
|
|||
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 @@ def _eval_xml(self,node, pool, cr, uid, idref, context=None):
|
|||
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 @@ class xml_import(object):
|
|||
|
||||
@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 @@ class xml_import(object):
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
# '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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
# 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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
' 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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ form: module.record_id""" % (xml_id,)
|
|||
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 @@ def convert_xml_export(res):
|
|||
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()
|
||||
|
||||
|
|
|
@ -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_export(lang, modules, buffer, format, dbname=None):
|
|||
|
||||
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_xsl(de):
|
|||
|
||||
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_rml(de):
|
|||
|
||||
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 @@ def trans_generate(lang, modules, dbname=None):
|
|||
obj = pool.get(model).browse(cr, uid, res_id)
|
||||
|
||||
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):
|
||||
push_translation(module, 'view', encode(obj.model), 0, t)
|
||||
elif model=='ir.actions.wizard':
|
||||
service_name = 'wizard.'+encode(obj.wiz_name)
|
||||
|
@ -522,10 +522,10 @@ def trans_generate(lang, modules, dbname=None):
|
|||
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))
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ import netsvc
|
|||
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 @@ class interface(netsvc.Service):
|
|||
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 @@ class interface(netsvc.Service):
|
|||
|
||||
# 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)
|
||||
|
|
Loading…
Reference in New Issue