import logging from datetime import timedelta, timezone from django.core.management import BaseCommand from django.utils import timezone as django_timezone from pingcap_sso.models import OperationReportAbstract from pingcap_sso.lib.operation_report import run_all_report_task logger = logging.getLogger(__name__) class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument( '--period', required=True, ) def handle(self, *args, **options): handler = getattr(self, options['period'], None) if not handler: logger.error('invalid period option: {}'.format(options['period'])) exit(1) self.now = django_timezone.now().astimezone( timezone(timedelta(hours=8)) ) handler() def daily(self): # This task should run at 00:01 to 00:30 of everyday to collect yesterday's data start_at = ( self.now - timedelta(days=1) ).replace( hour=0, minute=0, second=0, microsecond=0 ) end_at = start_at + timedelta(days=1) report_date = start_at.date() sequence = report_date.strftime('%Y-%m-%d') time_dimension = OperationReportAbstract.TIME_DAILY run_all_report_task(start_at, end_at, time_dimension, sequence, report_date) def weekly(self): # This task should run at 00:01 to 00:30 of every friday to collect last week's data start_at = ( self.now - timedelta(days=(self.now.weekday() + 3)) ).replace( hour=0, minute=0, second=0, microsecond=0 ) end_at = start_at + timedelta(days=7) report_date = start_at.date() sequence = report_date.strftime('%Y-%W') time_dimension = OperationReportAbstract.TIME_WEEKLY run_all_report_task(start_at, end_at, time_dimension, sequence, report_date) def monthly(self): # This task should run at 00:01 to 00:30 of the first day of every month to collect last month's data end_at = self.now.replace(day=1, hour=0, minute=0, second=0, microsecond=0) - timedelta(days=1) start_at = end_at.replace(day=1) report_date = start_at.date() sequence = report_date.strftime('%Y-%m') time_dimension = OperationReportAbstract.TIME_MONTHLY run_all_report_task(start_at, end_at, time_dimension, sequence, report_date)