@@ -0,0 +1,37 @@
|
||||
"""Разбор периода для analytics."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import date, datetime, timedelta
|
||||
from typing import Optional, Tuple
|
||||
|
||||
|
||||
def parse_iso_date(value: Optional[str]) -> Optional[date]:
|
||||
if not value:
|
||||
return None
|
||||
try:
|
||||
return date.fromisoformat(str(value).strip()[:10])
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
|
||||
def resolve_date_bounds(
|
||||
date_from: Optional[str],
|
||||
date_to: Optional[str],
|
||||
) -> Tuple[datetime, datetime]:
|
||||
"""Включительно date_from … date_to (конец дня date_to)."""
|
||||
today = date.today()
|
||||
start_d = parse_iso_date(date_from) or today
|
||||
end_d = parse_iso_date(date_to) or start_d
|
||||
if end_d < start_d:
|
||||
start_d, end_d = end_d, start_d
|
||||
start_dt = datetime.combine(start_d, datetime.min.time())
|
||||
end_dt = datetime.combine(end_d, datetime.max.time())
|
||||
return start_dt, end_dt
|
||||
|
||||
|
||||
def iter_dates_in_range(start_d: date, end_d: date):
|
||||
cur = start_d
|
||||
while cur <= end_d:
|
||||
yield cur
|
||||
cur += timedelta(days=1)
|
||||
Reference in New Issue
Block a user