[MERGE] lp:~xmo/openobject-server/setup_py_fixes

bzr revid: chs@tinyerp.com-20091217083446-57e8ko62e12eiv2u
bzr revid: chs@tinyerp.com-20091217083636-yoc153jnt4rhsw35
This commit is contained in:
Christophe Simonis
2009-12-17 09:36:36 +01:00
19 changed files with 331 additions and 454 deletions
+15
View File
@@ -3,3 +3,18 @@
.bzrignore
bin/addons/*
bin/filestore*
.Python
include
lib
bin/activate
bin/activate_this.py
bin/easy_install
bin/easy_install-2.6
bin/pip
bin/python
bin/python2.6
*.pyc
*.pyo
build/
bin/yolk
bin/pil*.py
-1
View File
@@ -207,4 +207,3 @@ while True:
time.sleep(60)
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+1 -1
View File
@@ -1277,7 +1277,7 @@ class orm_template(object):
if pos == 'replace':
parent = node.getparent()
if parent is None:
src = copy.deepcopy(node2.getchildren()[0])
src = copy.deepcopy(node2[0])
else:
for child in node2:
node.addprevious(child)
+36 -74
View File
@@ -32,12 +32,10 @@ from osv.osv import except_osv
from osv.orm import browse_null
from osv.orm import browse_record_list
import pooler
from xml.dom import minidom
import libxml2
import libxslt
from pychart import *
import misc
import cStringIO
from lxml import etree
class external_pdf(render.render):
def __init__(self, pdf):
@@ -286,17 +284,13 @@ class report_custom(report_int):
if report['print_orientation']=='landscape':
pageSize=[pageSize[1],pageSize[0]]
impl = minidom.getDOMImplementation()
new_doc = impl.createDocument(None, "report", None)
new_doc = etree.Element('report')
# build header
config = new_doc.createElement("config")
config = etree.SubElement(new_doc, 'config')
def _append_node(name, text):
n = new_doc.createElement(name)
t = new_doc.createTextNode(text)
n.appendChild(t)
config.appendChild(n)
n = etree.SubElement(config, name)
t.text = text
_append_node('date', time.strftime('%d/%m/%Y'))
_append_node('PageFormat', '%s' % report['print_format'])
@@ -316,45 +310,33 @@ class report_custom(report_int):
_append_node('report-header', '%s' % (report['title'],))
_append_node('report-footer', '%s' % (report['footer'],))
new_doc.childNodes[0].appendChild(config)
header = new_doc.createElement("header")
header = etree.SubElement(new_doc, 'header')
for f in fields:
field = new_doc.createElement("field")
field_txt = new_doc.createTextNode('%s' % (f['name'],))
field.appendChild(field_txt)
header.appendChild(field)
new_doc.childNodes[0].appendChild(header)
field = etree.SubElement(header, 'field')
field.text = f['name']
lines = new_doc.createElement("lines")
lines = etree.SubElement(new_doc, 'lines')
level.reverse()
for line in results:
shift = level.pop()
node_line = new_doc.createElement("row")
node_line = etree.SubElement(lines, 'row')
prefix = '+'
for f in range(len(fields)):
col = new_doc.createElement("col")
col = etree.SubElement(node_line, 'col')
if f == 0:
col.setAttribute('para','yes')
col.setAttribute('tree','yes')
col.setAttribute('space',str(3*shift)+'mm')
col.attrib.update(para='yes',
tree='yes',
space=str(3*shift)+'mm')
if line[f] != None:
txt = new_doc.createTextNode(prefix+str(line[f]) or '')
col.text = prefix+str(line[f]) or ''
else:
txt = new_doc.createTextNode('/')
col.appendChild(txt)
node_line.appendChild(col)
col.text = '/'
prefix = ''
lines.appendChild(node_line)
new_doc.childNodes[0].appendChild(lines)
styledoc = libxml2.parseFile(os.path.join(tools.config['root_path'],'addons/base/report/custom_new.xsl'))
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseDoc(new_doc.toxml())
rml_obj = style.applyStylesheet(doc, None)
rml = style.saveResultToString(rml_obj)
transform = etree.XSLT(
etree.parse(os.path.join(tools.config['root_path'],
'addons/base/report/custom_new.xsl')))
rml = etree.tostring(transform(new_doc))
self.obj = render.rml(rml)
self.obj.render()
@@ -591,17 +573,12 @@ class report_custom(report_int):
if report['print_orientation']=='landscape':
pageSize=[pageSize[1],pageSize[0]]
impl = minidom.getDOMImplementation()
new_doc = impl.createDocument(None, "report", None)
# build header
config = new_doc.createElement("config")
new_doc = etree.Element('report')
config = etree.SubElement(new_doc, 'config')
def _append_node(name, text):
n = new_doc.createElement(name)
t = new_doc.createTextNode(text)
n.appendChild(t)
config.appendChild(n)
n = etree.SubElement(config, name)
n.text = text
_append_node('date', time.strftime('%d/%m/%Y'))
_append_node('PageSize', '%.2fmm,%.2fmm' % tuple(pageSize))
@@ -621,40 +598,25 @@ class report_custom(report_int):
_append_node('report-header', '%s' % (report['title'],))
_append_node('report-footer', '%s' % (report['footer'],))
new_doc.childNodes[0].appendChild(config)
header = new_doc.createElement("header")
header = etree.SubElement(new_doc, 'header')
for f in fields:
field = new_doc.createElement("field")
field_txt = new_doc.createTextNode('%s' % (f['name'],))
field.appendChild(field_txt)
header.appendChild(field)
new_doc.childNodes[0].appendChild(header)
field = etree.SubElement(header, 'field')
field.text = f['name']
lines = new_doc.createElement("lines")
lines = etree.SubElement(new_doc, 'lines')
for line in results:
node_line = new_doc.createElement("row")
node_line = etree.SubElement(lines, 'row')
for f in range(len(fields)):
col = new_doc.createElement("col")
col.setAttribute('tree','no')
col = etree.SubElement(node_line, 'col', tree='no')
if line[f] != None:
txt = new_doc.createTextNode(str(line[f] or ''))
col.text = line[f] or ''
else:
txt = new_doc.createTextNode('/')
col.appendChild(txt)
node_line.appendChild(col)
lines.appendChild(node_line)
new_doc.childNodes[0].appendChild(lines)
col.text = '/'
# file('/tmp/terp.xml','w+').write(new_doc.toxml())
styledoc = libxml2.parseFile(os.path.join(tools.config['root_path'],'addons/base/report/custom_new.xsl'))
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseDoc(new_doc.toxml())
rml_obj = style.applyStylesheet(doc, None)
rml = style.saveResultToString(rml_obj)
transform = etree.XSLT(
etree.parse(os.path.join(tools.config['root_path'],
'addons/base/report/custom_new.xsl')))
rml = etree.tostring(transform(new_doc))
self.obj = render.rml(rml)
self.obj.render()
+18 -34
View File
@@ -22,8 +22,6 @@
import os
import re
import libxml2
import libxslt
from lxml import etree
import netsvc
import pooler
@@ -146,48 +144,34 @@ class report_rml(report_int):
if not self.xsl:
return xml
# load XSL (parse it to the XML level)
styledoc = libxml2.parseDoc(tools.file_open(self.xsl).read())
xsl_path, tail = os.path.split(self.xsl)
for child in styledoc.children:
if child.name == 'import':
if child.hasProp('href'):
imp_file = child.prop('href')
_x, imp_file = tools.file_open(imp_file, subdir=xsl_path, pathinfo=True)
child.setProp('href', urllib.quote(str(imp_file)))
stylesheet = etree.parse(tools.file_open(self.xsl))
xsl_path, _ = os.path.split(self.xsl)
for import_child in stylesheet.findall('./import'):
if 'href' in import_child.attrib:
imp_file = import_child.get('href')
_, imp_file = tools.file_open(imp_file, subdir=xsl_path, pathinfo=True)
import_child.set('href', urllib.quote(str(imp_file)))
#TODO: get all the translation in one query. That means we have to:
# * build a list of items to translate,
# * issue the query to translate them,
# * (re)build/update the stylesheet with the translated items
# translate the XSL stylesheet
def look_down(child, lang):
while child is not None:
if (child.type == "element") and child.hasProp('t'):
#FIXME: use cursor
res = service.execute(cr.dbname, uid, 'ir.translation',
'_get_source', self.name2, 'xsl', lang, child.content)
if res:
child.setContent(res.encode('utf-8'))
look_down(child.children, lang)
child = child.next
def translate(doc, lang):
for node in doc.xpath('//*[@t]'):
translation = service.execute(
cr.dbname, uid, 'ir.translation', '_get_source',
self.name2, 'xsl', lang, node.text)
if translation:
node.text = translation
if context.get('lang', False):
look_down(styledoc.children, context['lang'])
translate(stylesheet, context['lang'])
# parse XSL
style = libxslt.parseStylesheetDoc(styledoc)
# load XML (data)
doc = libxml2.parseMemory(xml,len(xml))
# create RML (apply XSL to XML data)
result = style.applyStylesheet(doc, None)
# save result to string
xml = style.saveResultToString(result)
transform = etree.XSLT(stylesheet)
xml = etree.tostring(
transform(etree.fromstring(xml)))
style.freeStylesheet()
doc.freeDoc()
result.freeDoc()
return xml
def create_pdf(self, rml, localcontext = None, logo=None, title=None):
+9 -18
View File
@@ -121,8 +121,7 @@ class document(object):
#TODO: test this
if value == '' and 'default' in attrs:
value = attrs['default']
el = etree.Element(node.tag)
parent.append(el)
el = etree.SubElement(parent, node.tag)
el.text = tounicode(value)
#TODO: test this
for key, value in attrs.iteritems():
@@ -154,31 +153,27 @@ class document(object):
fp.write(dt)
i = str(len(self.bin_datas))
self.bin_datas[i] = fp
el = etree.Element(node.tag)
el = etree.SubElement(parent, node.tag)
el.text = i
parent.append(el)
elif attrs['type']=='data':
#TODO: test this
txt = self.datas.get('form', {}).get(attrs['name'], '')
el = etree.Element(node.tag)
el = etree.SubElement(parent, node.tag)
el.text = txt
parent.append(el)
elif attrs['type']=='function':
if attrs['name'] in self.func:
txt = self.func[attrs['name']](node)
else:
txt = print_fnc.print_fnc(attrs['name'], node)
el = etree.Element(node.tag)
el = etree.SubElement(parent, node.tag)
el.text = txt
parent.append(el)
elif attrs['type']=='eval':
value = self.eval(browser, attrs['expr'])
el = etree.Element(node.tag)
el = etree.SubElement(parent, node.tag)
el.text = str(value)
parent.append(el)
elif attrs['type']=='fields':
fields = attrs['name'].split(',')
@@ -196,8 +191,7 @@ class document(object):
v_list = [vals[k] for k in keys]
for v in v_list:
el = etree.Element(node.tag)
parent.append(el)
el = etree.SubElement(parent, node.tag)
for el_cld in node:
self.parse_node(el_cld, el, v)
@@ -231,8 +225,7 @@ class document(object):
def parse_result_tree(node, parent, datas):
if not node.tag == etree.Comment:
el = etree.Element(node.tag)
parent.append(el)
el = etree.SubElement(parent, node.tag)
atr = self.node_attrs_get(node)
if 'value' in atr:
if not isinstance(datas[atr['value']], (str, unicode)):
@@ -256,8 +249,7 @@ class document(object):
else:
v_list = value
for v in v_list:
el = etree.Element(node.tag)
parent.append(el)
el = etree.SubElement(parent, node.tag)
for el_cld in node:
self.parse_node(el_cld, el, v)
else:
@@ -266,8 +258,7 @@ class document(object):
if node.tag == parent.tag:
el = parent
else:
el = etree.Element(node.tag)
parent.append(el)
el = etree.SubElement(parent, node.tag)
for el_cld in node:
self.parse_node(el_cld,el, browser)
def xml_get(self):
+13 -24
View File
@@ -25,8 +25,6 @@ import tools
from report import render
from lxml import etree
import libxml2
import libxslt
import time, os
@@ -77,21 +75,18 @@ class report_printscreen_list(report_int):
def _create_table(self, uid, ids, fields, fields_order, results, context, title=''):
pageSize=[297.0,210.0]
impl = minidom.getDOMImplementation()
new_doc = etree.Element("report")
config = etree.Element("config")
config = etree.SubElement(new_doc, 'config')
# build header
def _append_node(name, text):
n = etree.Element(name)
n = etree.SubElement(config, name)
n.text = text
config.append(n)
_append_node('date', time.strftime('%d/%m/%Y'))
_append_node('PageSize', '%.2fmm,%.2fmm' % tuple(pageSize))
_append_node('PageWidth', '%.2f' % (pageSize[0] * 2.8346,))
_append_node('PageHeight', '%.2f' %(pageSize[1] * 2.8346,))
_append_node('report-header', title)
l = []
@@ -110,17 +105,15 @@ class report_printscreen_list(report_int):
s = fields[fields_order[pos]].get('size', 56) / 28 + 1
l[pos] = strmax * s / t
_append_node('tableSize', ','.join(map(str,l)) )
new_doc.append(config)
header=etree.Element("header")
header = etree.SubElement(new_doc, 'header')
for f in fields_order:
field = etree.Element("field")
field = etree.SubElement(header, 'field')
field.text = fields[f]['string'] or ''
header.append(field)
new_doc.append(header)
lines = etree.Element("lines")
lines = etree.SubElement(new_doc, 'lines')
for line in results:
node_line = etree.Element("row")
node_line = etree.SubElement(lines, 'row')
for f in fields_order:
if fields[f]['type']=='many2one' and line[f]:
line[f] = line[f][1]
@@ -129,21 +122,17 @@ class report_printscreen_list(report_int):
if fields[f]['type'] == 'float':
precision=(('digits' in fields[f]) and fields[f]['digits'][1]) or 2
line[f]=round(line[f],precision)
col = etree.Element("col")
col.set('tree','no')
col = etree.SubElement(node_line, 'col', tree='no')
if line[f] != None:
col.text = tools.ustr(line[f] or '')
else:
col.text = '/'
node_line.append(col)
lines.append(node_line)
new_doc.append(node_line)
styledoc = libxml2.parseFile(os.path.join(tools.config['root_path'],'addons/base/report/custom_new.xsl'))
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseDoc(new_doc.toxml())
rml_obj = style.applyStylesheet(doc, None)
rml = style.saveResultToString(rml_obj)
transform = etree.XSLT(
etree.parse(os.path.join(tools.config['root_path'],
'addons/base/report/custom_new.xsl')))
rml = etree.tostring(transform(new_doc))
self.obj = render.rml(rml, self.title)
self.obj.render()
return True
+19 -42
View File
@@ -24,8 +24,6 @@ import pooler
import tools
from lxml import etree
from report import render
import libxml2
import libxslt
import locale
import time, os
@@ -37,14 +35,9 @@ class report_printscreen_list(report_int):
def _parse_node(self, root_node):
result = []
for node in root_node.getchildren():
for node in root_node:
if node.tag == 'field':
attrsa = node.attrib
attrs = {}
if not attrsa is None:
for key,val in attrsa.items():
attrs[key] = val
result.append(attrs['name'])
result.append(node.get('name'))
else:
result.extend(self._parse_node(node))
return result
@@ -90,30 +83,28 @@ class report_printscreen_list(report_int):
def _create_table(self, uid, ids, fields, fields_order, results, context, title=''):
pageSize=[297.0, 210.0]
new_doc = etree.Element("report")
config = etree.Element("config")
# build header
new_doc = etree.Element("report")
config = etree.SubElement(new_doc, 'config')
def _append_node(name, text):
n = etree.Element(name)
n = etree.SubElement(config, name)
n.text = text
config.append(n)
#_append_node('date', time.strftime('%d/%m/%Y'))
_append_node('date', time.strftime(str(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y'))))
_append_node('PageSize', '%.2fmm,%.2fmm' % tuple(pageSize))
_append_node('PageWidth', '%.2f' % (pageSize[0] * 2.8346,))
_append_node('PageHeight', '%.2f' %(pageSize[1] * 2.8346,))
_append_node('report-header', title)
l = []
t = 0
rowcount=0;
strmax = (pageSize[0]-40) * 2.8346
temp = []
count = len(fields_order)
for i in range(0,count):
for i in range(0, count):
temp.append(0)
ince = -1;
@@ -135,23 +126,20 @@ class report_printscreen_list(report_int):
l[pos] = strmax * s / t
_append_node('tableSize', ','.join(map(str,l)) )
new_doc.append(config)
header=etree.Element("header")
header = etree.SubElement(new_doc, 'header')
for f in fields_order:
field = etree.Element("field")
field = etree.SubElement(header, 'field')
field.text = tools.ustr(fields[f]['string'] or '')
header.append(field)
new_doc.append(header)
lines = etree.Element("lines")
lines = etree.SubElement(new_doc, 'lines')
tsum = []
count = len(fields_order)
for i in range(0,count):
tsum.append(0)
for line in results:
node_line = etree.Element("row")
node_line = etree.SubElement(lines, 'row')
count = -1
for f in fields_order:
float_flag = 0
@@ -192,10 +180,8 @@ class report_printscreen_list(report_int):
d1= mx.DateTime.strptime(line[f],'%Y-%m-%d %H:%M:%S')
new_d1 = d1.strftime(format)
line[f] = new_d1
col = etree.Element("col")
col.set('para','yes')
col.set('tree','no')
col = etree.SubElement(node_line, 'col', para='yes', tree='no')
if line[f] != None:
col.text = tools.ustr(line[f] or '')
if float_flag:
@@ -204,15 +190,10 @@ class report_printscreen_list(report_int):
tsum[count] = float(tsum[count]) + float(line[f]);
else:
col.text = '/'
node_line.append(col)
lines.append(node_line)
node_line = etree.Element("row")
lines.append(node_line)
node_line = etree.SubElement(lines, 'row')
for f in range(0,count+1):
col = etree.Element("col")
col.set('para','yes')
col.set('tree','no')
col = etree.SubElement(node_line, 'col', para='yes', tree='no')
if tsum[f] != None:
if tsum[f] >= 0.01 :
prec = '%.' + str(tools.config['price_accuracy']) + 'f'
@@ -227,16 +208,12 @@ class report_printscreen_list(report_int):
txt ='Total'
col.text = tools.ustr(txt or '')
node_line.append(col)
lines.append(node_line)
transform = etree.XSLT(
etree.parse(os.path.join(tools.config['root_path'],
'addons/base/report/custom_new.xsl')))
rml = etree.tostring(transform(new_doc))
new_doc.append(lines)
styledoc = libxml2.parseFile(os.path.join(tools.config['root_path'],'addons/base/report/custom_new.xsl'))
style = libxslt.parseStylesheetDoc(styledoc)
doc = libxml2.parseDoc(etree.tostring(new_doc))
rml_obj = style.applyStylesheet(doc, None)
rml = style.saveResultToString(rml_obj)
self.obj = render.rml(rml, title=self.title)
self.obj.render()
return True
+1 -1
View File
@@ -74,7 +74,7 @@ class html2html(object):
return self._node
def url_modify(self,root):
for n in root.getchildren():
for n in root:
if (n.text.find('<a ')>=0 or n.text.find('&lt;a')>=0) and n.text.find('href')>=0 and n.text.find('style')<=0 :
node = (n.tag=='span' and n.getparent().tag=='u') and n.getparent().getparent() or ((n.tag=='span') and n.getparent()) or n
style = node.get('color') and "style='color:%s; text-decoration: none;'"%node.get('color') or ''
+4 -6
View File
@@ -103,12 +103,10 @@ class _flowable(object):
process(node,new_node)
if new_node.get('colWidths',False):
sizes = map(lambda x: utils.unit_get(x), new_node.get('colWidths').split(','))
tr = etree.Element('tr')
tr = etree.SubElement(new_node, 'tr')
for s in sizes:
td = etree.Element('td')
td.set("width", str(s))
tr.append(td)
new_node.append(tr)
etree.SubElement(tr, 'td', width=str(s))
return etree.tostring(new_node)
def _tag_para(self, node):
@@ -297,7 +295,7 @@ class _rml_template(object):
posx = int(utils.unit_get(tmpl.get('x1')))
frames[(posy,posx,tmpl.get('id'))] = _rml_tmpl_frame(posx, utils.unit_get(tmpl.get('width')))
for tmpl in pt.findall('pageGraphics'):
for n in tmpl.getchildren():
for n in tmpl:
if n.tag == 'image':
self.data = rc + utils._process_text(self, n.text)
if n.tag in self._tags:
+4 -3
View File
@@ -87,7 +87,7 @@ class _rml_styles(object,):
def _table_style_get(self, style_node):
styles = []
for node in style_node.getchildren():
for node in style_node:
start = utils.tuple_int_get(node, 'start', (0,0) )
stop = utils.tuple_int_get(node, 'stop', (-1,-1) )
if node.tag=='blockValign':
@@ -185,7 +185,7 @@ class _rml_doc(object):
def _textual_image(self, node):
rc = ''
for n in node.getchildren():
for n in node:
rc +=( etree.tostring(n) or '') + n.tail
return base64.decodestring(node.tostring())
@@ -776,7 +776,8 @@ class _rml_template(object):
frame.lastFrame = True
frames.append( frame )
try :
gr = pt.findall('pageGraphics') or pt.getchildren()[1].findall('pageGraphics')
gr = pt.findall('pageGraphics')\
or pt[1].findall('pageGraphics')
except :
gr=''
if len(gr):
+5 -9
View File
@@ -55,7 +55,7 @@ def xml2str(s):
def _child_get(node, self=None, tagname=None):
for n in node:
if self and self.localcontext and n.get('rml_loop', False):
if self and self.localcontext and n.get('rml_loop'):
oldctx = self.localcontext
for ctx in eval(n.get('rml_loop'),{}, self.localcontext):
@@ -79,12 +79,12 @@ def _child_get(node, self=None, tagname=None):
yield n
self.localcontext = oldctx
continue
if self and self.localcontext and n.get('rml_except', False):
if self and self.localcontext and n.get('rml_except'):
try:
eval(n.get('rml_except'), {}, self.localcontext)
except:
continue
if self and self.localcontext and n.get('rml_tag', False):
if self and self.localcontext and n.get('rml_tag'):
try:
(tag,attr) = eval(n.get('rml_tag'),{}, self.localcontext)
n2 = copy.deepcopy(n)
@@ -122,10 +122,7 @@ def _process_text(self, txt):
return result
def text_get(node):
rc = ''
for node in node.getchildren():
rc = rc + tools.ustr(node.text)
return rc
return ''.join([tools.ustr(n.text) for n in node])
units = [
(re.compile('^(-?[0-9\.]+)\s*in$'), reportlab.lib.units.inch),
@@ -155,8 +152,7 @@ def unit_get(size):
def tuple_int_get(node, attr_name, default=None):
if not node.get(attr_name):
return default
res = [int(x) for x in node.get(attr_name).split(',')]
return res
return map(int, node.get(attr_name).split(','))
def bool_get(value):
return (str(value)=="1") or (value.lower()=='yes')
+14 -14
View File
@@ -302,7 +302,7 @@ class rml_parse(object):
rml_head = rml_head.replace('<image','<!--image')
rml_head = rml_head.replace('</image>','</image-->')
head_dom = etree.XML(rml_head)
for tag in head_dom.getchildren():
for tag in head_dom:
found = rml_dom.find('.//'+tag.tag)
if found is not None and len(found):
if tag.get('position'):
@@ -466,13 +466,14 @@ class report_sxw(report_rml, preprocess.report):
for pe in elements:
if pe.get(rml_parser.localcontext['name_space']["meta"]+"name"):
if pe.get(rml_parser.localcontext['name_space']["meta"]+"name") == "Info 3":
pe.getchildren()[0].text=data['id']
pe[0].text=data['id']
if pe.get(rml_parser.localcontext['name_space']["meta"]+"name") == "Info 4":
pe.getchildren()[0].text=data['model']
meta = etree.tostring(rml_dom_meta)
pe[0].text=data['model']
meta = etree.tostring(rml_dom_meta, encoding='utf-8',
xml_declaration=True)
rml_dom = etree.XML(rml)
body = rml_dom.getchildren()[-1]
body = rml_dom[-1]
elements = []
key1 = rml_parser.localcontext['name_space']["text"]+"p"
key2 = rml_parser.localcontext['name_space']["text"]+"drop-down"
@@ -486,7 +487,7 @@ class report_sxw(report_rml, preprocess.report):
pp=de.getparent()
if de.text or de.tail:
pe.text = de.text or de.tail
for cnd in de.getchildren():
for cnd in de:
if cnd.text or cnd.tail:
if pe.text:
pe.text += cnd.text or cnd.tail
@@ -512,12 +513,11 @@ class report_sxw(report_rml, preprocess.report):
rml_dom = self.preprocess_rml(rml_dom,report_type)
create_doc = self.generators[report_type]
odt = etree.tostring(create_doc(rml_dom, rml_parser.localcontext))
odt = etree.tostring(create_doc(rml_dom, rml_parser.localcontext),
encoding='utf-8', xml_declaration=True)
sxw_z = zipfile.ZipFile(sxw_io, mode='a')
sxw_z.writestr('content.xml', "<?xml version='1.0' encoding='UTF-8'?>" + \
odt)
sxw_z.writestr('meta.xml', "<?xml version='1.0' encoding='UTF-8'?>" + \
meta)
sxw_z.writestr('content.xml', odt)
sxw_z.writestr('meta.xml', meta)
if report_xml.header:
#Add corporate header/footer
@@ -532,9 +532,9 @@ class report_sxw(report_rml, preprocess.report):
odt = create_doc(rml_dom,rml_parser.localcontext)
if report_xml.header:
rml_parser._add_header(odt)
odt = etree.tostring(odt)
sxw_z.writestr('styles.xml',"<?xml version='1.0' encoding='UTF-8'?>" + \
odt)
odt = etree.tostring(odt, encoding='utf-8',
xml_declaration=True)
sxw_z.writestr('styles.xml', odt)
sxw_z.close()
final_op = sxw_io.getvalue()
sxw_io.close()
+33 -41
View File
@@ -108,77 +108,69 @@ class SecureMultiHandler2(SecureMultiHTTPHandler):
def log_error(self, format, *args):
netsvc.Logger().notifyChannel('http',netsvc.LOG_ERROR,format % args)
class HttpDaemon(threading.Thread, netsvc.Server):
def __init__(self, interface, port):
class BaseHttpDaemon(threading.Thread, netsvc.Server):
def __init__(self, interface, port, handler):
threading.Thread.__init__(self)
netsvc.Server.__init__(self)
self.__port = port
self.__interface = interface
try:
self.server = ThreadedHTTPServer((interface, port), MultiHandler2)
self.server = ThreadedHTTPServer((interface, port), handler)
self.server.vdirs = []
self.server.logRequests = True
netsvc.Logger().notifyChannel("web-services", netsvc.LOG_INFO,
"starting HTTP service at %s port %d" % (interface or '0.0.0.0', port,))
netsvc.Logger().notifyChannel(
"web-services", netsvc.LOG_INFO,
"starting HTTPS service at %s port %d" %
(interface or '0.0.0.0', port,))
except Exception, e:
netsvc.Logger().notifyChannel('httpd', netsvc.LOG_CRITICAL, "Error occur when starting the server daemon: %s" % (e,))
netsvc.Logger().notifyChannel(
'httpd', netsvc.LOG_CRITICAL,
"Error occur when starting the server daemon: %s" % (e,))
raise
def attach(self, path, gw):
pass
def stop(self):
self.running = False
if os.name != 'nt':
self.server.socket.shutdown( hasattr(socket, 'SHUT_RDWR') and socket.SHUT_RDWR or 2 )
try:
self.server.socket.shutdown(
hasattr(socket, 'SHUT_RDWR') and socket.SHUT_RDWR or 2)
except socket.error, e:
if e.errno != 57: raise
# OSX, socket shutdowns both sides if any side closes it
# causing an error 57 'Socket is not connected' on shutdown
# of the other side (or something), see
# http://bugs.python.org/issue4397
netsvc.Logger().notifyChannel(
'server', netsvc.LOG_DEBUG,
'"%s" when shutting down server socket, '
'this is normal under OS X'%e)
self.server.socket.close()
def run(self):
#self.server.register_introspection_functions()
self.running = True
while self.running:
self.server.handle_request()
return True
class HttpDaemon(BaseHttpDaemon):
def __init__(self, interface, port):
super(HttpDaemon, self).__init__(interface, port,
handler=MultiHandler2)
class HttpSDaemon(threading.Thread, netsvc.Server):
def __init__(self, interface, port):
threading.Thread.__init__(self)
netsvc.Server.__init__(self)
self.__port = port
self.__interface = interface
try:
self.server = ThreadedHTTPServer((interface, port), SecureMultiHandler2)
self.server.vdirs = []
self.server.logRequests = True
netsvc.Logger().notifyChannel("web-services", netsvc.LOG_INFO,
"starting HTTPS service at %s port %d" % (interface or '0.0.0.0', port,))
super(HttpDaemon, self).__init__(interface, port,
handler=SecureMultiHandler2)
except SSLError, e:
netsvc.Logger().notifyChannel('httpd-ssl', netsvc.LOG_CRITICAL, "Can not load the certificate and/or the private key files")
netsvc.Logger().notifyChannel(
'httpd-ssl', netsvc.LOG_CRITICAL,
"Can not load the certificate and/or the private key files")
raise
except Exception, e:
netsvc.Logger().notifyChannel('httpd-ssl', netsvc.LOG_CRITICAL, "Error occur when starting the server daemon: %s" % (e,))
raise
def attach(self, path, gw):
pass
def stop(self):
self.running = False
if os.name != 'nt':
self.server.socket.shutdown( hasattr(socket, 'SHUT_RDWR') and socket.SHUT_RDWR or 2 )
self.server.socket.close()
def run(self):
#self.server.register_introspection_functions()
self.running = True
while self.running:
self.server.handle_request()
return True
httpd = None
httpsd = None
+2 -1
View File
@@ -211,7 +211,8 @@ class configmanager(object):
else:
rcfilepath = os.path.expanduser('~/.openerp_serverrc')
self.rcfile = fname or opt.config or os.environ.get('OPENERP_SERVER') or rcfilepath
self.rcfile = os.path.abspath(
fname or opt.config or os.environ.get('OPENERP_SERVER') or rcfilepath)
self.load()
+69 -85
View File
@@ -35,12 +35,6 @@ from config import config
import logging
import sys
try:
from lxml import etree
except:
sys.stderr.write("ERROR: pythonic binding for the libxml2 and libxslt libraries is missing\n")
sys.stderr.write("ERROR: Try to install python-lxml package\n")
sys.exit(2)
import pickle
@@ -63,17 +57,16 @@ def _eval_xml(self,node, pool, cr, uid, idref, context=None):
if context is None:
context = {}
if node.tag in ('field','value'):
t = node.get('type','') or 'char'
f_model = node.get("model", '').encode('ascii')
if len(node.get('search','')):
t = node.get('type','char')
f_model = node.get('model', '').encode('ascii')
if node.get('search'):
f_search = node.get("search",'').encode('utf-8')
f_use = node.get("use",'').encode('ascii')
f_use = node.get("use",'id').encode('ascii')
f_name = node.get("name",'').encode('utf-8')
if len(f_use)==0:
f_use = "id"
q = eval(f_search, idref)
ids = pool.get(f_model).search(cr, uid, q)
if f_use<>'id':
if f_use != 'id':
ids = map(lambda x: x[f_use], pool.get(f_model).read(cr, uid, ids, [f_use]))
_cols = pool.get(f_model)._columns
if (f_name in _cols) and _cols[f_name]._type=='many2many':
@@ -85,7 +78,7 @@ def _eval_xml(self,node, pool, cr, uid, idref, context=None):
f_val = f_val[0]
return f_val
a_eval = node.get('eval','')
if len(a_eval):
if a_eval:
import time
from mx import DateTime
idref2 = idref.copy()
@@ -118,52 +111,53 @@ 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([etree.tostring(i).encode("utf8") for i in node.getchildren()]), idref)
return txt
return '<?xml version="1.0"?>\n'\
+_process("".join([etree.tostring(n, encoding='utf-8')
for n in node]),
idref)
if t in ('char', 'int', 'float'):
d = node.text
if t == 'int':
d = d.strip()
if d=='None':
if d == 'None':
return None
else:
d=int(d.strip())
elif t=='float':
d=float(d.strip())
return int(d.strip())
elif t == 'float':
return float(d.strip())
return d
elif t in ('list','tuple'):
res=[]
for n in [i for i in node.getchildren() if (i.tag=='value')]:
for n in node.findall('./value'):
res.append(_eval_xml(self,n,pool,cr,uid,idref))
if t=='tuple':
return tuple(res)
return res
elif node.tag == "getitem":
for n in [i for i in node.getchildren()]:
for n in node:
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',''))]
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):
if 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()]:
for n in node:
return_val = _eval_xml(self,n, pool, cr, uid, idref, context)
if return_val != None:
if return_val is not 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
return node.text
escape_re = re.compile(r'(?<!\\)/')
def escape(x):
@@ -220,14 +214,14 @@ class xml_import(object):
context = {}
node_context = node.get("context",'').encode('utf8')
if len(node_context):
if node_context:
context.update(eval(node_context, eval_dict))
return context
def get_uid(self, cr, uid, data_node, node):
node_uid = node.get('uid','') or (len(data_node) and data_node.get('uid',''))
if len(node_uid):
if node_uid:
return self.id_get(cr, None, node_uid)
return uid
@@ -250,18 +244,17 @@ form: module.record_id""" % (xml_id,)
d_search = rec.get("search",'')
d_id = rec.get("id",'')
ids = []
if len(d_search):
if d_search:
ids = self.pool.get(d_model).search(cr,self.uid,eval(d_search))
if len(d_id):
if d_id:
try:
ids.append(self.id_get(cr, d_model, d_id))
except:
# d_id cannot be found. doesn't matter in this case
pass
if len(ids):
if ids:
self.pool.get(d_model).unlink(cr, self.uid, ids)
self.pool.get('ir.model.data')._unlink(cr, self.uid, d_model, ids, direct=True)
return False
def _tag_report(self, cr, rec, data_node=None):
res = {}
@@ -270,20 +263,19 @@ form: module.record_id""" % (xml_id,)
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.get(field):
res[dest] = rec.get(field,'').encode('utf8')
res[dest] = rec.get(field).encode('utf8')
if rec.get('auto'):
res['auto'] = eval(rec.get('auto',''))
res['auto'] = eval(rec.get('auto'))
if rec.get('sxw'):
sxw_content = misc.file_open(rec.get('sxw','')).read()
sxw_content = misc.file_open(rec.get('sxw')).read()
res['report_sxw_content'] = sxw_content
if rec.get('header'):
res['header'] = eval(rec.get('header',''))
res['header'] = eval(rec.get('header'))
if rec.get('report_type'):
res['report_type'] = rec.get('report_type','')
res['multi'] = rec.get('multi','') and eval(rec.get('multi',''))
xml_id = rec.get('id','').encode('utf8')
res['report_type'] = rec.get('report_type')
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.get('groups'):
@@ -303,10 +295,10 @@ form: module.record_id""" % (xml_id,)
self.idref[xml_id] = int(id)
if not rec.get('menu') or eval(rec.get('menu','')):
keyword = str(rec.get('keyword','') or 'client_print_multi')
keyword = str(rec.get('keyword', 'client_print_multi'))
keys = [('action',keyword),('res_model',res['model'])]
value = 'ir.actions.report.xml,'+str(id)
replace = rec.get("replace",'') or True
replace = rec.get('replace', 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
@@ -316,7 +308,7 @@ form: module.record_id""" % (xml_id,)
context = self.get_context(data_node, rec, {'ref': _ref(self, cr)})
uid = self.get_uid(cr, self.uid, data_node, rec)
_eval_xml(self,rec, self.pool, cr, uid, self.idref, context=context)
return False
return
def _tag_wizard(self, cr, rec, data_node=None):
string = rec.get("string",'').encode('utf8')
@@ -349,7 +341,6 @@ form: module.record_id""" % (xml_id,)
value = 'ir.actions.wizard,'+str(id)
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.get("string",'').encode('utf8')
@@ -369,7 +360,6 @@ form: module.record_id""" % (xml_id,)
value = 'ir.actions.url,'+str(id)
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.get('name','').encode('utf-8')
@@ -438,38 +428,37 @@ form: module.record_id""" % (xml_id,)
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
def _tag_ir_set(self, cr, rec, data_node=None):
if not self.mode=='init':
return False
if self.mode != 'init':
return
res = {}
for field in [i for i in rec.getchildren() if (i.tag=="field")]:
for field in rec.findall('./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))
return False
def _tag_workflow(self, cr, rec, data_node=None):
if self.isnoupdate(data_node) and self.mode != 'init':
return
model = str(rec.get('model',''))
w_ref = rec.get('ref','')
if len(w_ref):
if w_ref:
id = self.id_get(cr, model, w_ref)
else:
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)
number_children = len(rec)
assert number_children > 0,\
'You must define a child node if you dont give a ref'
assert number_children == 1,\
'Only one child node is accepted (%d given)' % number_children
id = _eval_xml(self, rec[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.get('action','')), cr)
return False
#
# Support two types of notation:
@@ -509,7 +498,7 @@ form: module.record_id""" % (xml_id,)
menu_parent_id = self.id_get(cr, 'ir.ui.menu', rec.get('parent',''))
values = {'parent_id': menu_parent_id}
if rec.get('name'):
values['name'] = rec.get('name','')
values['name'] = rec.get('name')
try:
res = [ self.id_get(cr, 'ir.ui.menu', rec.get('id','')) ]
except:
@@ -557,9 +546,10 @@ form: module.record_id""" % (xml_id,)
if (not values.get('name', False)) and resw:
values['name'] = resw[0]
if rec.get('sequence'):
values['sequence'] = int(rec.get('sequence',''))
values['sequence'] = int(rec.get('sequence'))
if rec.get('icon'):
values['icon'] = str(rec.get('icon',''))
values['icon'] = str(rec.get('icon'))
if rec.get('groups'):
g_names = rec.get('groups','').split(',')
groups_value = []
@@ -581,7 +571,7 @@ form: module.record_id""" % (xml_id,)
self.idref[rec_id] = int(pid)
if rec.get('action') and pid:
a_action = rec.get('action','').encode('utf8')
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)
@@ -601,7 +591,7 @@ form: module.record_id""" % (xml_id,)
rec_id = rec.get("id",'').encode('ascii')
self._test_xml_id(rec_id)
rec_src = rec.get("search",'').encode('utf8')
rec_src_count = rec.get("count",'')
rec_src_count = rec.get("count")
severity = rec.get("severity",'').encode('ascii') or netsvc.LOG_ERROR
rec_string = rec.get("string",'').encode('utf8') or 'unknown'
@@ -610,12 +600,12 @@ form: module.record_id""" % (xml_id,)
eval_dict = {'ref': _ref(self, cr)}
context = self.get_context(data_node, rec, eval_dict)
uid = self.get_uid(cr, self.uid, data_node, rec)
if len(rec_id):
if rec_id:
ids = [self.id_get(cr, rec_model, rec_id)]
elif len(rec_src):
elif rec_src:
q = eval(rec_src, eval_dict)
ids = self.pool.get(rec_model).search(cr, uid, q, context=context)
if len(rec_src_count):
if rec_src_count:
count = int(rec_src_count)
if len(ids) != count:
self.assert_report.record_assertion(False, severity)
@@ -631,8 +621,8 @@ form: module.record_id""" % (xml_id,)
raise Exception('Severe assertion failure')
return
assert ids != None, 'You must give either an id or a search criteria'
assert ids is not None,\
'You must give either an id or a search criteria'
ref = _ref(self, cr)
for id in ids:
brrec = model.browse(cr, uid, id, context)
@@ -645,7 +635,7 @@ 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.getchildren() if (i.tag=="test")]:
for test in rec.findall('./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)
@@ -700,7 +690,7 @@ form: module.record_id""" % (xml_id,)
# otherwise it is skipped
return None
res = {}
for field in [i for i in rec.getchildren() if (i.tag == "field")]:
for field in rec.findall('./field'):
#TODO: most of this code is duplicated above (in _eval_xml)...
f_name = field.get("name",'').encode('utf-8')
f_ref = field.get("ref",'').encode('ascii')
@@ -711,7 +701,7 @@ form: module.record_id""" % (xml_id,)
f_use = field.get("use",'').encode('ascii') or 'id'
f_val = False
if len(f_search):
if f_search:
q = eval(f_search, self.idref)
field = []
assert f_model, 'Define an attribute model="..." in your .XML file !'
@@ -727,7 +717,7 @@ form: module.record_id""" % (xml_id,)
# otherwise (we are probably in a many2one field),
# take the first element of the search
f_val = s[0][f_use]
elif len(f_ref):
elif f_ref:
if f_ref=="null":
f_val = False
else:
@@ -755,9 +745,7 @@ form: module.record_id""" % (xml_id,)
result = self.pool.get('ir.model.data')._get_id(cr, self.uid, mod, id_str)
return int(self.pool.get('ir.model.data').read(cr, self.uid, [result], ['res_id'])[0]['res_id'])
def parse(self, xmlstr):
de = etree.XML(xmlstr)
def parse(self, de):
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" )
@@ -765,8 +753,8 @@ form: module.record_id""" % (xml_id,)
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.getchildren() if (i.tag=="data")]:
for rec in n.getchildren():
for n in de.findall('./data'):
for rec in n:
if rec.tag in self._tags:
try:
self._tags[rec.tag](self.cr, rec, n)
@@ -861,12 +849,9 @@ def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init',
# xml import/export
#
def convert_xml_import(cr, module, xmlfile, idref=None, mode='init', noupdate=False, report=None):
xmlstr = xmlfile.read()
xmlfile.seek(0)
relaxng_doc = etree.parse(file(os.path.join( config['root_path'], 'import_xml.rng' )))
relaxng = etree.RelaxNG(relaxng_doc)
doc = etree.parse(xmlfile)
relaxng = etree.RelaxNG(
etree.parse(os.path.join(config['root_path'],'import_xml.rng' )))
try:
relaxng.assert_(doc)
except Exception, e:
@@ -878,8 +863,7 @@ def convert_xml_import(cr, module, xmlfile, idref=None, mode='init', noupdate=Fa
if idref is None:
idref={}
obj = xml_import(cr, module, idref, mode, report=report, noupdate=noupdate)
obj.parse(xmlstr)
del obj
obj.parse(doc.getroot())
return True
def convert_xml_export(res):
+7 -11
View File
@@ -375,9 +375,9 @@ def trans_export(lang, modules, buffer, format, dbname=None):
def trans_parse_xsl(de):
res = []
for n in [i for i in de.getchildren()]:
for n in de:
if n.get("t"):
for m in [j for j in n.getchildren() if j.text]:
for m in [j for j in n if j.text]:
l = m.text.strip().replace('\n',' ')
if len(l):
res.append(l.encode("utf8"))
@@ -386,8 +386,8 @@ def trans_parse_xsl(de):
def trans_parse_rml(de):
res = []
for n in [i for i in de.getchildren()]:
for m in [j for j in n.getchildren() if j.text]:
for n in de:
for m in [j for j in n if j.text]:
string_list = [s.replace('\n', ' ').strip() for s in re.split('\[\[.+?\]\]', m.text)]
for s in string_list:
if s:
@@ -398,14 +398,10 @@ def trans_parse_rml(de):
def trans_parse_view(de):
res = []
if de.get("string"):
s = de.get('string')
if s:
res.append(s.encode("utf8"))
res.append(de.get('string').encode("utf8"))
if de.get("sum"):
s = de.get('sum')
if s:
res.append(s.encode("utf8"))
for n in [i for i in de.getchildren()]:
res.append(de.get('sum').encode("utf8"))
for n in de:
res.extend(trans_parse_view(n))
return res
+1 -1
View File
@@ -53,7 +53,7 @@ class interface(netsvc.Service):
trans = translate(cr, self.wiz_name+','+state, 'wizard_view', lang, node.get('string').encode('utf8'))
if trans:
node.set('string', trans)
for n in node.getchildren():
for n in node:
self.translate_view(cr, n, state, lang)
def execute_cr(self, cr, uid, data, state='init', context=None):
+80 -88
View File
@@ -29,6 +29,7 @@
import imp
import sys
import os
from os.path import join, isfile, basename
import glob
from distutils.core import setup, Command
@@ -39,11 +40,9 @@ if os.name == 'nt':
import py2exe
has_py2exe = True
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), "bin"))
sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "bin"))
opj = os.path.join
execfile(opj('bin', 'release.py'))
execfile(join('bin', 'release.py'))
if sys.argv[1] == 'bdist_rpm':
version = version.split('-')[0]
@@ -52,126 +51,114 @@ if sys.argv[1] == 'bdist_rpm':
py_short_version = '%s.%s' % sys.version_info[:2]
required_modules = [
('lxml', 'lxml module: pythonic libxml2 and libxslt bindings'),
('mako', 'Mako template engine'),
('mx', "egenix's mx library for its extended DateTime module"),
('psycopg2', 'PostgreSQL module'),
('xml', 'XML Tools for python'),
('libxml2', 'libxml2 python bindings'),
('libxslt', 'libxslt python bindings'),
('reportlab', 'reportlab module'),
('pychart', 'pychart module'),
('pydot', 'pydot module'),
('lxml', 'lxml module: pythonic libxml2 and libxslt bindings'),
('mako','Mako templating library'),
('pytz', 'Timezone handling library for Python'),
('reportlab', 'reportlab module'),
]
def check_modules():
ok = True
errors = []
for modname, desc in required_modules:
try:
exec('import %s' % modname)
imp.find_module(modname)
except ImportError:
ok = False
print 'Error: python module %s (%s) is required' % (modname, desc)
errors.append(
'Error: python module %s (%s) is required' % (modname, desc))
if not ok:
if errors:
print '\n'.join(errors)
sys.exit(1)
def _find_addons():
for (dp, dn, names) in os.walk(opj('bin', 'addons')):
def find_addons():
for root, _, names in os.walk(join('bin', 'addons')):
if '__terp__.py' in names:
modname = os.path.basename(dp)
yield (modname, dp)
yield basename(root), root
#look for extra modules
try:
empath = os.getenv('EXTRA_MODULES_PATH','../addons/')
f = open(opj(empath,'server_modules.list'),'r')
# print 'Getting modules from:' , opj(empath,'server_modules.list')
mods = f.readlines()
for mname in mods:
empath = os.getenv('EXTRA_MODULES_PATH', '../addons/')
for mname in open(join(empath, 'server_modules.list')):
mname = mname.strip()
if not mname:
continue
if os.path.exists(opj(empath,mname,'__terp__.py')):
yield ( mname, opj(empath,mname) )
if os.path.exists(join(empath, mname, '__terp__.py')):
yield mname, join(empath, mname)
else:
print "Module %s specified, but no valid path." % mname
except:
pass
__found_addons = None
# Cache the results of _find_addons() and return them
def find_addons(found_addons = None):
if not found_addons:
found_addons = _find_addons()
return found_addons
def data_files():
'''Build list of data files to be installed'''
files = []
if os.name == 'nt':
os.chdir('bin')
for (dp,dn,names) in os.walk('addons'):
files.append((dp, map(lambda x: opj('bin', dp, x), names)))
os.chdir('..')
for (dp,dn,names) in os.walk('doc'):
files.append((dp, map(lambda x: opj(dp, x), names)))
files.append(('.', [opj('bin', 'import_xml.rng'),
opj('bin', 'server.pkey'),
opj('bin', 'server.cert')]))
for root, _, names in os.walk(join('bin','addons')):
files.append((root, [join(root, name) for name in names]))
for root, _, names in os.walk('doc'):
files.append((root, [join(root, name) for name in names]))
files.append(('.', [join('bin', 'import_xml.rng'),
join('bin', 'server.pkey'),
join('bin', 'server.cert')]))
else:
man_directory = opj('share', 'man')
files.append((opj(man_directory, 'man1'), ['man/openerp-server.1']))
files.append((opj(man_directory, 'man5'), ['man/openerp_serverrc.5']))
man_directory = join('share', 'man')
files.append((join(man_directory, 'man1'), ['man/openerp-server.1']))
files.append((join(man_directory, 'man5'), ['man/openerp_serverrc.5']))
doc_directory = opj('share', 'doc', 'openerp-server-%s' % version)
files.append((doc_directory, [f for f in glob.glob('doc/*') if os.path.isfile(f)]))
files.append((opj(doc_directory, 'migrate', '3.3.0-3.4.0'), [f for f in glob.glob('doc/migrate/3.3.0-3.4.0/*') if os.path.isfile(f)]))
files.append((opj(doc_directory, 'migrate', '3.4.0-4.0.0'), [f for f in glob.glob('doc/migrate/3.4.0-4.0.0/*') if os.path.isfile(f)]))
doc_directory = join('share', 'doc', 'openerp-server-%s' % version)
files.append((doc_directory, filter(isfile, glob.glob('doc/*'))))
files.append((join(doc_directory, 'migrate', '3.3.0-3.4.0'),
filter(isfile, glob.glob('doc/migrate/3.3.0-3.4.0/*'))))
files.append((join(doc_directory, 'migrate', '3.4.0-4.0.0'),
filter(isfile, glob.glob('doc/migrate/3.4.0-4.0.0/*'))))
openerp_site_packages = opj('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server')
openerp_site_packages = join('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server')
files.append((openerp_site_packages, [opj('bin', 'import_xml.rng'),
opj('bin', 'server.pkey'),
opj('bin', 'server.cert')]))
files.append((openerp_site_packages, [join('bin', 'import_xml.rng'),
join('bin', 'server.pkey'),
join('bin', 'server.cert')]))
if sys.version_info[0:2] == (2,5):
files.append((openerp_site_packages, [ opj('python25-compat','BaseHTTPServer.py'),
opj('python25-compat','SimpleXMLRPCServer.py'),
opj('python25-compat','SocketServer.py')]))
files.append((openerp_site_packages, [ join('python25-compat','BaseHTTPServer.py'),
join('python25-compat','SimpleXMLRPCServer.py'),
join('python25-compat','SocketServer.py')]))
for (addonname, add_path) in find_addons():
addon_path = opj('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server','addons', addonname)
pathfiles = []
for addonname, add_path in find_addons():
addon_path = join('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server','addons', addonname)
for root, dirs, innerfiles in os.walk(add_path):
innerfiles = filter(lambda fil: os.path.splitext(fil)[1] not in ('.pyc', '.pyd', '.pyo'), innerfiles)
if innerfiles:
res = os.path.normpath(opj(addon_path, root.replace(opj(add_path), '.')))
pathfiles.extend(((res, map(lambda fil: opj(root, fil), innerfiles)),))
files.extend(pathfiles)
res = os.path.normpath(join(addon_path, root.replace(join(add_path), '.')))
files.extend(((res, map(lambda fil: join(root, fil),
innerfiles)),))
# for tup in files:
# print "Files:", tup[0], tup[1]
return files
if not os.getenv('NO_CHECK_MODULES',False) :
if not os.getenv('NO_CHECK_MODULES') :
check_modules()
f = file('openerp-server','w')
start_script = """#!/bin/sh\necho "OpenERP Setup - The content of this file is generated at the install stage\n" """
f.write(start_script)
f.write("""#!/bin/sh
echo "Error: the content of this file should have been replaced during "
echo "installation\n"
exit 1
""")
f.close()
def find_package_dirs():
res = {}
for (mod, path) in find_addons():
res ['openerp-server.addons.'+ mod ] = path
res ['openerp-server'] = 'bin'
return res
package_dirs = {'openerp-server': 'bin'}
for mod, path in find_addons():
package_dirs['openerp-server.addons.' + mod] = path
return package_dirs
class openerp_server_install(install):
def run(self):
# create startup script
start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n" % (opj(self.install_libbase, "openerp-server"), sys.executable)
start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n"\
% (join(self.install_libbase, "openerp-server"), sys.executable)
# write script
f = open('openerp-server', 'w')
f.write(start_script)
@@ -185,9 +172,9 @@ options = {
"dist_dir": 'dist',
"packages": ["lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
"lxml.objectify", "decimal", "xml", "xml.dom", "xml.xpath",
"encodings","mx.DateTime","wizard","pychart","PIL", "pyparsing",
"pydot","asyncore","asynchat", "reportlab", "vobject","mako",
"HTMLParser", "select"],
"encodings","mx.DateTime","wizard","pychart","PIL",
"pyparsing", "pydot","asyncore","asynchat", "reportlab",
"vobject", "HTMLParser", "select"],
"excludes" : ["Tkconstants","Tkinter","tcl"],
}
}
@@ -210,23 +197,28 @@ setup(name = name,
'openerp-server.addons',
'openerp-server.ir',
'openerp-server.osv',
'openerp-server.service',
'openerp-server.tools',
'openerp-server.pychart',
'openerp-server.pychart.afm',
'openerp-server.report',
'openerp-server.report.printscreen',
'openerp-server.report.pyPdf',
'openerp-server.report.render',
'openerp-server.report.render.rml2pdf',
'openerp-server.report.render.rml2html',
'openerp-server.report.render.rml2txt',
'openerp-server.report.render.html2html',
'openerp-server.report.render.makohtml2html',
'openerp-server.wizard',
'openerp-server.report.render.odt2odt',
'openerp-server.report.render.rml2html',
'openerp-server.report.render.rml2pdf',
'openerp-server.report.render.rml2txt',
'openerp-server.service',
'openerp-server.tools',
'openerp-server.wizard',
'openerp-server.workflow'] + \
list(map( lambda (a, p): 'openerp-server.addons.'+ a ,find_addons())),
[('openerp-server.addons.' + name)
for name, _ in find_addons()],
package_dir = find_package_dirs(),
console = [ { "script" : "bin\\openerp-server.py", "icon_resources" : [ (1,"pixmaps\\openerp-icon.ico") ] } ],
console = [{"script": join("bin", "openerp-server.py"),
"icon_resources": [(1,join("pixmaps","openerp-icon.ico"))]
}],
options = options,
)
@@ -245,15 +237,15 @@ if has_py2exe:
# Make sure the layout of pytz hasn't changed
assert (pytz.__file__.endswith('__init__.pyc') or
pytz.__file__.endswith('__init__.py')), pytz.__file__
zoneinfo_dir = os.path.join(os.path.dirname(pytz.__file__), 'zoneinfo')
zoneinfo_dir = join(os.path.dirname(pytz.__file__), 'zoneinfo')
# '..\\Lib\\pytz\\__init__.py' -> '..\\Lib'
disk_basedir = os.path.dirname(os.path.dirname(pytz.__file__))
zipfile_path = os.path.join(options['py2exe']['dist_dir'], 'library.zip')
zipfile_path = join(options['py2exe']['dist_dir'], 'library.zip')
z = zipfile.ZipFile(zipfile_path, 'a')
for absdir, directories, filenames in os.walk(zoneinfo_dir):
assert absdir.startswith(disk_basedir), (absdir, disk_basedir)
zip_dir = absdir[len(disk_basedir):]
for f in filenames:
z.write(os.path.join(absdir, f), os.path.join(zip_dir, f))
z.write(join(absdir, f), join(zip_dir, f))
z.close()