Google Analytics for CKAN API
[ckanext-datagovau.git] / ckanext / datagovau / controller.py
blob:a/ckanext/datagovau/controller.py -> blob:b/ckanext/datagovau/controller.py
--- a/ckanext/datagovau/controller.py
+++ b/ckanext/datagovau/controller.py
@@ -1,1 +1,82 @@
+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)
+