Coverage for baibu/metrics/management/commands/compute_metrics.py: 100%

27 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-10-06 13:07 +0000

1from datetime import date 

2 

3from django.core.management.base import BaseCommand 

4from django.core.management.base import CommandError 

5from django.utils import timezone 

6 

7from baibu.metrics import rollups 

8 

9 

10def _date(value: str) -> date: 

11 try: 

12 return date.fromisoformat(value) 

13 except ValueError as exc: 

14 msg = f"Not a date (YYYY-MM-DD): {value}" 

15 raise CommandError(msg) from exc 

16 

17 

18class Command(BaseCommand): 

19 help = ( 

20 "Compute the usage rollups for a range of days (default: yesterday), replacing stored values. " 

21 "Days are in the platform time zone." 

22 ) 

23 

24 def add_arguments(self, parser): 

25 parser.add_argument("--start", type=_date, help="First day, YYYY-MM-DD. Default: --end.") 

26 parser.add_argument("--end", type=_date, help="Last day, YYYY-MM-DD. Default: yesterday.") 

27 

28 def handle(self, *args, start=None, end=None, **options): 

29 end = end or rollups.yesterday() 

30 start = start or end 

31 if start > end: 

32 msg = "--start must not be after --end." 

33 raise CommandError(msg) 

34 if end >= timezone.localdate(): 

35 msg = "Only finished days can be computed; --end must be before today." 

36 raise CommandError(msg) 

37 days = rollups.store_range(start, end) 

38 self.stdout.write(f"Computed {days} day(s), {start} to {end}.")