diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py
index beb4e27200a..4f3ed8b0387 100644
--- a/openerp/addons/base/ir/ir_actions.py
+++ b/openerp/addons/base/ir/ir_actions.py
@@ -96,8 +96,11 @@ class report_xml(osv.osv):
result = cr.dictfetchall()
reports = openerp.report.interface.report_int._reports
for r in result:
+ print ">>> Registering:", r['report_name'], "...",
if reports.has_key('report.'+r['report_name']):
+ print " Already present."
continue
+ print " Done."
if r['report_rml'] or r['report_rml_content_data']:
report_sxw('report.'+r['report_name'], r['model'],
opj('addons',r['report_rml'] or '/'), header=r['header'])
@@ -140,6 +143,7 @@ class report_xml(osv.osv):
'report_sxw_content': fields.function(_report_content, fnct_inv=_report_content_inv, type='binary', string='SXW Content',),
'report_rml_content': fields.function(_report_content, fnct_inv=_report_content_inv, type='binary', string='RML Content'),
+ 'parser': fields.char('Parser Class'),
}
_defaults = {
'type': 'ir.actions.report.xml',
diff --git a/openerp/import_xml.rng b/openerp/import_xml.rng
index 97b2c4a13c0..5f4c40b65d3 100644
--- a/openerp/import_xml.rng
+++ b/openerp/import_xml.rng
@@ -107,6 +107,7 @@
+
diff --git a/openerp/netsvc.py b/openerp/netsvc.py
index a5e33ff22b1..33d7a222884 100644
--- a/openerp/netsvc.py
+++ b/openerp/netsvc.py
@@ -24,6 +24,7 @@
import errno
import logging
import logging.handlers
+import operator
import os
import platform
import release
@@ -45,13 +46,37 @@ import openerp
_logger = logging.getLogger(__name__)
-def LocalService(name):
+def LocalService(name, cursor=None):
# Special case for addons support, will be removed in a few days when addons
# are updated to directly use openerp.osv.osv.service.
if name == 'workflow':
return openerp.workflow
- return openerp.report.interface.report_int._reports[name]
+ if cursor is None: # TODO temporary, while refactoring
+ registered_report = openerp.report.interface.report_int._reports[name]
+ print ">>> Oh noes no cursor."
+ return registered_report
+ else:
+ from openerp.report.report_sxw import report_sxw, report_rml
+ cr = cursor
+ opj = os.path.join
+ cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name[len('report.'):],))
+ result = cr.dictfetchall()
+ for r in result:
+ if r['report_rml'] or r['report_rml_content_data']:
+ if r['parser']:
+ kwargs = { 'parser': operator.attrgetter(r['parser'])(openerp.addons) }
+ else:
+ kwargs = {}
+ new_report = report_sxw('report.'+r['report_name'], r['model'],
+ opj('addons',r['report_rml'] or '/'), header=r['header'], register=False, **kwargs)
+ elif r['report_xsl']:
+ new_report = report_rml('report.'+r['report_name'], r['model'],
+ opj('addons',r['report_xml']),
+ r['report_xsl'] and opj('addons',r['report_xsl']), register=False)
+ else:
+ raise Exception, "Unhandled report type: %s" % r
+ return new_report
BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE, _NOTHING, DEFAULT = range(10)
#The background is set with 40 plus the number of the color, and the foreground with 30
diff --git a/openerp/report/interface.py b/openerp/report/interface.py
index f0de9631800..6c5fc24b559 100644
--- a/openerp/report/interface.py
+++ b/openerp/report/interface.py
@@ -43,11 +43,17 @@ class report_int(object):
_reports = {}
- def __init__(self, name):
- if not name.startswith('report.'):
- raise Exception('ConceptionError, bad report name, should start with "report."')
- assert name not in self._reports, 'The report "%s" already exists!' % name
- self._reports[name] = self
+ def __init__(self, name, register=True):
+ if register:
+ print "*** Registering report `%s` but it should be registered trough data declaration instead. ***" % name
+ if not name.startswith('report.'):
+ raise Exception('ConceptionError, bad report name, should start with "report."')
+ assert name not in self._reports, 'The report "%s" already exists!' % name
+ self._reports[name] = self
+ else:
+ # The report is instanciated at each use site, which is ok.
+ pass
+
self.__name = name
self.name = name
@@ -65,8 +71,8 @@ class report_rml(report_int):
XML -> DATAS -> RML -> PDF -> HTML
using a XSL:RML transformation
"""
- def __init__(self, name, table, tmpl, xsl):
- super(report_rml, self).__init__(name)
+ def __init__(self, name, table, tmpl, xsl, register=True):
+ super(report_rml, self).__init__(name, register=register)
self.table = table
self.internal_header=False
self.tmpl = tmpl
diff --git a/openerp/report/print_xml.py b/openerp/report/print_xml.py
index c2af0984c2e..558f7dd3bd0 100644
--- a/openerp/report/print_xml.py
+++ b/openerp/report/print_xml.py
@@ -264,7 +264,7 @@ class document(object):
def parse_tree(self, ids, model, context=None):
if not context:
context={}
- browser = self.pool.get(model).browse(self.cr, self.uid, ids, context)
+ browser = self.pool[model].browse(self.cr, self.uid, ids, context)
self.parse_node(self.dom, self.doc, browser)
def parse_string(self, xml, ids, model, context=None):
diff --git a/openerp/report/report_sxw.py b/openerp/report/report_sxw.py
index 325690205ef..0e2a7e18edd 100644
--- a/openerp/report/report_sxw.py
+++ b/openerp/report/report_sxw.py
@@ -388,8 +388,8 @@ class rml_parse(object):
self.setCompany(objects[0].company_id)
class report_sxw(report_rml, preprocess.report):
- def __init__(self, name, table, rml=False, parser=rml_parse, header='external', store=False):
- report_rml.__init__(self, name, table, rml, '')
+ def __init__(self, name, table, rml=False, parser=rml_parse, header='external', store=False, register=True):
+ report_rml.__init__(self, name, table, rml, '', register=register)
self.name = name
self.parser = parser
self.header = header
diff --git a/openerp/service/report.py b/openerp/service/report.py
index c20c7f0d7ec..d7832dfb40b 100644
--- a/openerp/service/report.py
+++ b/openerp/service/report.py
@@ -90,7 +90,7 @@ def exp_report(db, uid, object, ids, datas=None, context=None):
def go(id, uid, ids, datas, context):
cr = openerp.pooler.get_db(db).cursor()
try:
- obj = openerp.netsvc.LocalService('report.'+object)
+ obj = openerp.netsvc.LocalService('report.'+object, cursor=cr)
(result, format) = obj.create(cr, uid, ids, datas, context)
if not result:
tb = sys.exc_info()
diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py
index 00b8bf96340..a8ba37e29d5 100644
--- a/openerp/tools/convert.py
+++ b/openerp/tools/convert.py
@@ -302,6 +302,8 @@ form: module.record_id""" % (xml_id,)
res['header'] = eval(rec.get('header','False'))
if rec.get('report_type'):
res['report_type'] = rec.get('report_type')
+ if rec.get('parser'):
+ res['parser'] = rec.get('parser')
res['multi'] = rec.get('multi') and eval(rec.get('multi','False'))
diff --git a/openerp/tools/test_reports.py b/openerp/tools/test_reports.py
index 9ec4dab6cc3..71cedc1a98d 100644
--- a/openerp/tools/test_reports.py
+++ b/openerp/tools/test_reports.py
@@ -50,7 +50,7 @@ def try_report(cr, uid, rname, ids, data=None, context=None, our_module=None):
else:
rname_s = rname
_logger.log(netsvc.logging.TEST, " - Trying %s.create(%r)", rname, ids)
- res = netsvc.LocalService(rname).create(cr, uid, ids, data, context)
+ res = netsvc.LocalService(rname, cursor=cr).create(cr, uid, ids, data, context)
if not isinstance(res, tuple):
raise RuntimeError("Result of %s.create() should be a (data,format) tuple, now it is a %s" % \
(rname, type(res)))