from __future__ import absolute_import from __future__ import print_function from argparse import ArgumentParser from datetime import timedelta from django.core.management.base import BaseCommand from django.utils import timezone from django.utils.dateparse import parse_datetime from analytics.models import RealmCount, UserCount from analytics.lib.counts import COUNT_STATS, CountStat, process_count_stat from zerver.lib.timestamp import datetime_to_string, is_timezone_aware from zerver.models import UserProfile, Message from typing import Any class Command(BaseCommand): help = """Fills Analytics tables. Run as a cron job that runs every hour.""" def add_arguments(self, parser): # type: (ArgumentParser) -> None parser.add_argument('--range-start', '-s', type=str, help="Time to backfill from.") parser.add_argument('--range-end', '-e', type=str, help='Time to backfill to, defaulst to now.', default=datetime_to_string(timezone.now())) parser.add_argument('--utc', type=bool, help="Interpret --range-start and --range-end as times in UTC.", default=False) parser.add_argument('--stat', '-q', type=str, help="CountStat to process. If omitted, all stats are processed") def handle(self, *args, **options): # type: (*Any, **Any) -> None range_end = parse_datetime(options['range_end']) if options['range_start'] is not None: range_start = parse_datetime(options['range_start']) else: range_start = range_end - timedelta(seconds = 3600) # throw error if start time is greater than end time if range_start > range_end: raise ValueError("--range-start cannot be greater than --range-end.") if options['utc']: range_start = range_start.replace(tzinfo=timezone.utc) range_end = range_end.replace(tzinfo=timezone.utc) if not (is_timezone_aware(range_start) and is_timezone_aware(range_end)): raise ValueError("--range-start and --range-end must be timezone aware. Maybe you meant to use the --utc option?") if options['stat'] is not None: process_count_stat(COUNT_STATS[options['stat']], range_start, range_end) else: for stat in COUNT_STATS.values(): process_count_stat(stat, range_start, range_end)