-
Notifications
You must be signed in to change notification settings - Fork 79
/
controller.py
122 lines (104 loc) · 3.9 KB
/
controller.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
from __future__ import absolute_import
import logging
from ckan.lib.base import BaseController, c, render, request
from . import dbutil
import hashlib
from . import plugin
from paste.util.multidict import MultiDict
from ckan.controllers.api import ApiController
import ckan.plugins.toolkit as tk
from ckanext.googleanalytics import config
log = logging.getLogger("ckanext.googleanalytics")
class GAController(BaseController):
def view(self):
# get package objects corresponding to popular GA content
c.top_resources = dbutil.get_top_resources(limit=10)
return render("summary.html")
class GAApiController(ApiController):
# intercept API calls to record via google analytics
def _post_analytics(
self, user, request_obj_type, request_function, request_id
):
data_dict = {
"v": 1,
"tid": config.tracking_id(),
"cid": hashlib.md5(user).hexdigest(),
# customer id should be obfuscated
"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,
}
plugin.GoogleAnalyticsPlugin.analytics_queue.put(data_dict)
def action(self, logic_function, ver=None):
try:
function = tk.get_action(logic_function)
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:
id = request_data["q"]
if "query" in request_data:
id = request_data["query"]
self._post_analytics(c.user, logic_function, "", id)
except Exception as e:
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 list(params.keys()):
id = params["q"]
if "query" in list(params.keys()):
id = params["query"]
except ValueError as e:
log.debug(str(e))
pass
self._post_analytics(c.user, register, "search", id)
return ApiController.search(self, ver, register)