Skip to content

Commit 12e9ab7

Browse files
committed
Add 'manage events views_per_dashboard' CLI endpoint
1 parent c4f9ae3 commit 12e9ab7

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

redash/cli/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from redash.cli import (
1010
data_sources,
1111
database,
12+
events,
1213
groups,
1314
organization,
1415
queries,
@@ -36,6 +37,7 @@ def manager():
3637

3738

3839
manager.add_command(database.manager, "database")
40+
manager.add_command(events.manager, "events")
3941
manager.add_command(users.manager, "users")
4042
manager.add_command(groups.manager, "groups")
4143
manager.add_command(data_sources.manager, "ds")

redash/cli/events.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import datetime
2+
import json
3+
import logging
4+
5+
import click
6+
from flask.cli import AppGroup
7+
from sqlalchemy import cast, func
8+
9+
from redash.models import Dashboard, Event
10+
from redash.models.base import db
11+
12+
logging.getLogger("xmlschema").setLevel(logging.WARNING)
13+
14+
15+
manager = AppGroup(help="Show event infos")
16+
17+
18+
def _validate_days_range(ctx, param, value):
19+
if value is None:
20+
days_ago = ctx.params.get("days_ago")
21+
return days_ago
22+
return value
23+
24+
25+
@manager.command(name="count", help="List event counts from a range of whole days")
26+
@click.option(
27+
"--days-ago", type=int, default=1, help="Start counting given number of days ago. Yesterday is the default."
28+
)
29+
@click.option(
30+
"--days-range",
31+
type=int,
32+
default=None,
33+
callback=_validate_days_range,
34+
help="Take given number of days into account. Up until yesterday is the default.",
35+
)
36+
def list_events(days_ago, days_range):
37+
if days_range > days_ago:
38+
raise click.BadParameter("days_range should not exceed days_ago")
39+
40+
start_date = datetime.date.today() - datetime.timedelta(days=days_ago)
41+
end_date = start_date + datetime.timedelta(days=days_range)
42+
43+
dashboard_event_counts = (
44+
db.session.query(Dashboard.name, func.count())
45+
.select_from(Event)
46+
.join(Dashboard, Dashboard.id == cast(Event.object_id, db.Integer))
47+
.filter(
48+
Event.object_type == "dashboard",
49+
Event.action == "view",
50+
Event.created_at >= start_date,
51+
Event.created_at < end_date,
52+
)
53+
.group_by(Dashboard.name)
54+
.all()
55+
)
56+
57+
print(json.dumps({"dashboard_view_count": {k: v for k, v in dashboard_event_counts}}))

0 commit comments

Comments
 (0)