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