[IMP] report: use openerp.report.render_report() instead of LocalService().create().
authorVo Minh Thu <vmt@openerp.com>
Fri, 22 Feb 2013 12:48:01 +0000 (13:48 +0100)
committerVo Minh Thu <vmt@openerp.com>
Fri, 22 Feb 2013 12:48:01 +0000 (13:48 +0100)
bzr revid: vmt@openerp.com-20130222124801-zhhbw2bgghhf6rg6

doc/changelog.rst
openerp/addons/base/ir/ir_actions.py
openerp/addons/base/ir/ir_actions.xml
openerp/netsvc.py
openerp/report/__init__.py
openerp/service/report.py
openerp/tools/test_reports.py

index a80e8dc..ec75fad 100644 (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.
index 4f3ed8b..71170f4 100644 (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'
index da11812..8251469 100644 (file)
@@ -82,6 +82,7 @@
                                 <group string="Miscellaneous">
                                     <field name="multi"/>
                                     <field name="auto"/>
+                                    <field name="parser"/>
                                 </group>
                             </group>
                         </page>
index 33d7a22..aab166a 100644 (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
index 6b56f15..647e6ba 100644 (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:
 
index d7832df..5144a06 100644 (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)
index 71cedc1..ccb9c83 100644 (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)))