Export CSV support for spreadsheet view.
* new Django view, handle_csv(), with a new URLconf, /new_tko/server/csv/
* new module csv_encoder with logic to encode the results of an RPC call into CSV format
* logic in csv_encoder to convert results of get_status_counts() (or get_latest_tests()) into CSV, when called from spreadsheet view
* added optional "Export to CSV" link to TableActionsPanel, and made SpreadsheetView use it with a handler to call the /csv/ entry point with the current query info

Signed-off-by: Steve Howard <showard@google.com>


git-svn-id: http://test.kernel.org/svn/autotest/trunk@3086 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/frontend/afe/json_rpc/serviceHandler.py b/frontend/afe/json_rpc/serviceHandler.py
index 9ea5e3a..7a80529 100644
--- a/frontend/afe/json_rpc/serviceHandler.py
+++ b/frontend/afe/json_rpc/serviceHandler.py
@@ -65,51 +65,44 @@
 class ServiceMethodNotFound(ServiceException):
     pass
 
+
 class ServiceHandler(object):
 
     def __init__(self, service):
         self.service=service
 
-    def handleRequest(self, json):
-        err=None
-        err_traceback = None
-        result = None
-        id_=''
+    def dispatchRequest(self, request):
+        try:
+            methName = request['method']
+            args = request['params']
+        except KeyError:
+            raise BadServiceRequest(request)
 
-        #print 'Request:', json
+        meth = self.findServiceEndpoint(methName)
+        result = self.invokeServiceEndpoint(meth, args)
+        return result
+
+    def _getRequestId(self, request):
+        try:
+            return request['id']
+        except KeyError:
+            raise BadServiceRequest(request)
+
+    def handleRequest(self, jsonRequest):
+        id_ = None
+        result = None
+        err = None
+        err_traceback = None
+
+        request = self.translateRequest(jsonRequest)
 
         try:
-            req = self.translateRequest(json)
-        except ServiceRequestNotTranslatable, e:
-            err = e
-            req={'id':id_}
+            id_ = self._getRequestId(request)
+            result = self.dispatchRequest(request)
+        except Exception, err:
+            err_traceback = traceback.format_exc()
 
-        if err==None:
-            try:
-                id_ = req['id']
-                methName = req['method']
-                args = req['params']
-            except:
-                err = BadServiceRequest(json)
-
-        if err is None:
-            try:
-                meth = self.findServiceEndpoint(methName)
-            except Exception, e:
-                err_traceback = traceback.format_exc()
-                print err_traceback
-                err = e
-
-        if err is None:
-            try:
-                result = self.invokeServiceEndpoint(meth, args)
-            except Exception, e:
-                err_traceback = traceback.format_exc()
-                print err_traceback
-                err = e
-        resultdata = self.translateResult(result, err, err_traceback, id_)
-
-        return resultdata
+        return self.translateResult(result, err, err_traceback, id_)
 
     @staticmethod
     def translateRequest(data):
@@ -117,17 +110,13 @@
             req = json_decoder.decode(data)
         except:
             raise ServiceRequestNotTranslatable(data)
-        req = customConvertJson(req) # -srh
+        req = customConvertJson(req)
         return req
 
     def findServiceEndpoint(self, name):
         try:
             meth = getattr(self.service, name)
-# -srh
-#            if getattr(meth, "IsServiceMethod"):
             return meth
-#            else:
-#                raise ServiceMethodNotFound(name)
         except AttributeError:
             raise ServiceMethodNotFound(name)