ckanext-googleanalytics/ckanext/googleanalytics/logic/action.py

96 lines
2.5 KiB
Python
Raw Normal View History

2022-05-06 20:50:26 +02:00
from __future__ import absolute_import
import ckan.plugins.toolkit as tk
from ckan.logic import validate
from . import schema
from .. import config
2022-05-06 20:50:26 +02:00
from ..model import PackageStats, ResourceStats
2022-05-07 00:59:15 +02:00
from ..ga_auth import init_service, get_profile_id
2022-05-06 20:50:26 +02:00
def get_actions():
return dict(
2022-05-07 00:59:15 +02:00
googleanalytics_package_stats_show=package_stats_show,
googleanalytics_resource_stats_show=resource_stats_show,
googleanalytics_event_report=event_report,
2022-05-06 20:50:26 +02:00
)
2022-05-07 00:59:15 +02:00
@validate(schema.package_stats_show)
2022-05-06 20:50:26 +02:00
@tk.side_effect_free
2022-05-07 00:59:15 +02:00
def package_stats_show(context, data_dict):
2022-05-06 20:50:26 +02:00
tk.check_access("googleanalytics_package_stats_show", context, data_dict)
rec = (
context["session"]
.query(PackageStats)
.filter(PackageStats.package_id == data_dict["id"])
.one_or_none()
)
if not rec:
raise tk.ObjectNotFound()
return rec.for_json(context)
2022-05-07 00:59:15 +02:00
@validate(schema.resource_stats_show)
2022-05-06 20:50:26 +02:00
@tk.side_effect_free
2022-05-07 00:59:15 +02:00
def resource_stats_show(context, data_dict):
2022-05-06 20:50:26 +02:00
tk.check_access("googleanalytics_resource_stats_show", context, data_dict)
rec = (
context["session"]
.query(ResourceStats)
.filter(ResourceStats.resource_id == data_dict["id"])
.one_or_none()
)
if not rec:
raise tk.ObjectNotFound()
return rec.for_json(context)
2022-05-07 00:59:15 +02:00
@validate(schema.event_report)
@tk.side_effect_free
def event_report(context, data_dict):
tk.check_access("sysadmin", context, data_dict)
2022-09-09 16:47:05 +02:00
se = init_service(config.credentials())
2022-05-07 01:07:23 +02:00
filters = []
if "action" in data_dict:
filters.append(
"ga:eventAction=={action}".format(action=data_dict["action"])
)
if "category" in data_dict:
filters.append(
"ga:eventCategory=={category}".format(
category=data_dict["category"]
)
)
2022-05-07 00:59:15 +02:00
if "label" in data_dict:
2022-05-07 01:07:23 +02:00
filters.append(
"ga:eventLabel=={label}".format(label=data_dict["label"])
)
2022-05-07 00:59:15 +02:00
report = (
se.data()
.ga()
.get(
ids="ga:{id}".format(id=get_profile_id(se)),
dimensions=",".join(data_dict["dimensions"]),
metrics=",".join(data_dict["metrics"]),
start_date=data_dict["start_date"].date().isoformat(),
end_date=data_dict["end_date"].date().isoformat(),
2022-05-07 01:07:23 +02:00
filters=";".join(filters) or None,
2022-05-07 00:59:15 +02:00
)
.execute()
)
return {
"headers": [h["name"] for h in report["columnHeaders"]],
2022-05-08 03:22:12 +02:00
"rows": report.get("rows", []),
2022-05-07 00:59:15 +02:00
}