|
| 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