`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.
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'
<group string="Miscellaneous">
<field name="multi"/>
<field name="auto"/>
+ <field name="parser"/>
</group>
</group>
</page>
_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
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:
import openerp.netsvc
import openerp.pooler
+import openerp.report
from openerp import tools
import security
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)
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)
"""
import openerp.netsvc as netsvc
+import openerp.report
import openerp.tools as tools
import logging
import openerp.pooler as pooler
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)))