fix MultiDict error in API analytics
fix MultiDict error in API analytics

import urllib import urllib
import json import json
from pprint import pprint from pprint import pprint
import logging import logging
import ckan.logic as logic import ckan.logic as logic
import hashlib import hashlib
import threading import threading
from ckan.common import _, c, request, response from ckan.common import _, c, request, response
from pylons import config from pylons import config
  from webob.multidict import UnicodeMultiDict
  from paste.util.multidict import MultiDict
   
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
   
from ckan.controllers.api import ApiController from ckan.controllers.api import ApiController
   
class DGAApiController(ApiController): class DGAApiController(ApiController):
   
def _post_analytics(self,user,request_obj_type,request_function,request_id): def _post_analytics(self,user,request_obj_type,request_function,request_id):
if (config.get('googleanalytics.id') != None): if (config.get('googleanalytics.id') != None):
data = urllib.urlencode({ data = urllib.urlencode({
"v":1, "v":1,
"tid":config.get('googleanalytics.id'), "tid":config.get('googleanalytics.id'),
"cid":hashlib.md5(user).hexdigest(), "cid":hashlib.md5(user).hexdigest(),
"t":"event", "t":"event",
"dh":c.environ['HTTP_HOST'], "dh":c.environ['HTTP_HOST'],
"dp":c.environ['PATH_INFO'], "dp":c.environ['PATH_INFO'],
"dr":c.environ.get('HTTP_REFERER',''), "dr":c.environ.get('HTTP_REFERER',''),
"ec":"CKAN API Request", "ec":"CKAN API Request",
"ea":request_obj_type+request_function, "ea":request_obj_type+request_function,
"el":request_id, "el":request_id,
}) })
log.debug("Sending API Analytics Data: "+data) log.debug("Sending API Analytics Data: "+data)
# send analytics asynchronously # send analytics asynchronously
threading.Thread(target=urllib.urlopen,args=("http://www.google-analytics.com/collect", data)).start() threading.Thread(target=urllib.urlopen,args=("http://www.google-analytics.com/collect", data)).start()
   
def action(self, logic_function, ver=None): def action(self, logic_function, ver=None):
try: try:
function = logic.get_action(logic_function) function = logic.get_action(logic_function)
except Exception,e: except Exception,e:
log.debug(e) log.debug(e)
pass pass
try: try:
side_effect_free = getattr(function, 'side_effect_free', False) side_effect_free = getattr(function, 'side_effect_free', False)
request_data = self._get_request_data(try_url_params=side_effect_free) request_data = self._get_request_data(try_url_params=side_effect_free)
if isinstance(request_data, dict): if isinstance(request_data, dict):
id = request_data.get('id','') id = request_data.get('id','')
if 'q' in request_data.keys(): if 'q' in request_data.keys():
id = request_data['q'] id = request_data['q']
if 'query' in request_data.keys(): if 'query' in request_data.keys():
id = request_data['query'] id = request_data['query']
self._post_analytics(c.user,logic_function,'', id) self._post_analytics(c.user,logic_function,'', id)
except Exception,e: except Exception,e:
print log.debug(e) print log.debug(e)
pass pass
return ApiController.action(self,logic_function, ver) return ApiController.action(self,logic_function, ver)
def list(self, ver=None, register=None, subregister=None, id=None): def list(self, ver=None, register=None, subregister=None, id=None):
self._post_analytics(c.user,register+("_"+str(subregister) if subregister else ""),"list",id) self._post_analytics(c.user,register+("_"+str(subregister) if subregister else ""),"list",id)
return ApiController.list(self,ver, register, subregister, id) return ApiController.list(self,ver, register, subregister, id)
def show(self, ver=None, register=None, subregister=None, id=None, id2=None): def show(self, ver=None, register=None, subregister=None, id=None, id2=None):
self._post_analytics(c.user,register+("_"+str(subregister) if subregister else ""),"show",id) self._post_analytics(c.user,register+("_"+str(subregister) if subregister else ""),"show",id)
return ApiController.show(self,ver, register, subregister, id,id2) return ApiController.show(self,ver, register, subregister, id,id2)
def update(self, ver=None, register=None, subregister=None, id=None, id2=None): def update(self, ver=None, register=None, subregister=None, id=None, id2=None):
self._post_analytics(c.user,register+("_"+str(subregister) if subregister else ""),"update",id) self._post_analytics(c.user,register+("_"+str(subregister) if subregister else ""),"update",id)
return ApiController.update(self,ver, register, subregister, id,id2) return ApiController.update(self,ver, register, subregister, id,id2)
def delete(self, ver=None, register=None, subregister=None, id=None, id2=None): def delete(self, ver=None, register=None, subregister=None, id=None, id2=None):
self._post_analytics(c.user,register+("_"+str(subregister) if subregister else ""),"delete",id) self._post_analytics(c.user,register+("_"+str(subregister) if subregister else ""),"delete",id)
return ApiController.delete(self,ver, register, subregister, id,id2) return ApiController.delete(self,ver, register, subregister, id,id2)
def search(self, ver=None, register=None): def search(self, ver=None, register=None):
id = None id = None
try: try:
params = MultiDict(self._get_search_params(request.params)) params = MultiDict(self._get_search_params(request.params))
if 'q' in params.keys(): if 'q' in params.keys():
id = params['q'] id = params['q']
if 'query' in params.keys(): if 'query' in params.keys():
id = params['query'] id = params['query']
except ValueError, e: except ValueError, e:
print str(e) print str(e)
pass pass
self._post_analytics(c.user,register,"search",id) self._post_analytics(c.user,register,"search",id)