diff --git a/doc/changelog.rst b/doc/changelog.rst index a80e8dc6c8d..ec75fadfe6b 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -6,6 +6,8 @@ Changelog `trunk` ------- +- Almost removed ``LocalService()``. For reports, + ``openerp.report.render_report()`` can be used. - Added the :ref:`Long polling ` worker type. - Added :ref:`orm-workflows` to the ORM. - Added :ref:`routing-decorators` to the RPC and WSGI stack. diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index 4f3ed8b0387..71170f42e91 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -109,6 +109,39 @@ class report_xml(osv.osv): opj('addons',r['report_xml']), r['report_xsl'] and opj('addons',r['report_xsl'])) + def render_report(self, cr, uid, ids, name, data, context=None): + """ + Look up a report definition and render the report for the provided IDs. + """ + import openerp + import operator + import os + opj = os.path.join + + cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name,)) + new_report = None + for r in cr.dictfetchall(): + 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: + # TODO: + # Temporarily, we look reports up the _reports dict. + # raise Exception, "Unhandled report type: %s" % r + pass + if new_report is None: + new_report = interface.report_int._reports['report.' + name] + + return new_report.create(cr, uid, ids, data, context) + _name = 'ir.actions.report.xml' _inherit = 'ir.actions.actions' _table = 'ir_act_report_xml' diff --git a/openerp/addons/base/ir/ir_actions.xml b/openerp/addons/base/ir/ir_actions.xml index da118129932..82514692c06 100644 --- a/openerp/addons/base/ir/ir_actions.xml +++ b/openerp/addons/base/ir/ir_actions.xml @@ -82,6 +82,7 @@ + diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 33d7a222884..aab166ab4c2 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -46,37 +46,10 @@ import openerp _logger = logging.getLogger(__name__) +# TODO LocalService is deprecated. 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 - - 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 + assert name == 'workflow' + return openerp.workflow 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/__init__.py b/openerp/report/__init__.py index 6b56f15b6b5..647e6ba93a6 100644 --- a/openerp/report/__init__.py +++ b/openerp/report/__init__.py @@ -31,5 +31,14 @@ import report_sxw import printscreen +def render_report(cr, uid, ids, name, data, context=None): + """ + Helper to call ``ir.actions.report.xml.render_report()``. + """ + import openerp + registry = openerp.modules.registry.RegistryManager.get(cr.dbname) + return registry['ir.actions.report.xml'].render_report(cr, uid, ids, name, data, context) + + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/service/report.py b/openerp/service/report.py index d7832dfb40b..5144a064b1e 100644 --- a/openerp/service/report.py +++ b/openerp/service/report.py @@ -7,6 +7,7 @@ import threading import openerp.netsvc import openerp.pooler +import openerp.report from openerp import tools import security @@ -51,8 +52,7 @@ def exp_render_report(db, uid, object, ids, datas=None, context=None): cr = openerp.pooler.get_db(db).cursor() try: - obj = openerp.netsvc.LocalService('report.'+object) - (result, format) = obj.create(cr, uid, ids, datas, context) + result, format = openerp.report.render_report(cr, uid, ids, object, datas, context) if not result: tb = sys.exc_info() self_reports[id]['exception'] = openerp.exceptions.DeferredException('RML is not available at specified location or not enough data to print!', tb) @@ -90,8 +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, cursor=cr) - (result, format) = obj.create(cr, uid, ids, datas, context) + result, format = openerp.report.render_report(cr, uid, ids, object, datas, context) if not result: tb = sys.exc_info() self_reports[id]['exception'] = openerp.exceptions.DeferredException('RML is not available at specified location or not enough data to print!', tb) diff --git a/openerp/tools/test_reports.py b/openerp/tools/test_reports.py index 71cedc1a98d..ccb9c839dc9 100644 --- a/openerp/tools/test_reports.py +++ b/openerp/tools/test_reports.py @@ -26,6 +26,7 @@ """ import openerp.netsvc as netsvc +import openerp.report import openerp.tools as tools import logging import openerp.pooler as pooler @@ -50,7 +51,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, cursor=cr).create(cr, uid, ids, data, context) + res = openerp.report.render_report(cr, uid, ids, rname_s, 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)))