[IMP] report: use openerp.report.render_report() instead of LocalService().create().

bzr revid: vmt@openerp.com-20130222124801-zhhbw2bgghhf6rg6
This commit is contained in:
Vo Minh Thu 2013-02-22 13:48:01 +01:00
parent 0cb53890df
commit 729d969fd9
7 changed files with 53 additions and 35 deletions

View File

@ -6,6 +6,8 @@ Changelog
`trunk`
-------
- Almost removed ``LocalService()``. For reports,
``openerp.report.render_report()`` can be used.
- Added the :ref:`Long polling <longpolling-worker>` worker type.
- Added :ref:`orm-workflows` to the ORM.
- Added :ref:`routing-decorators` to the RPC and WSGI stack.

View File

@ -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'

View File

@ -82,6 +82,7 @@
<group string="Miscellaneous">
<field name="multi"/>
<field name="auto"/>
<field name="parser"/>
</group>
</group>
</page>

View File

@ -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

View File

@ -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:

View File

@ -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)

View File

@ -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)))