51 lines
1.1 KiB
Python
51 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
import time
|
|
from datetime import datetime
|
|
from zoneinfo import ZoneInfo
|
|
|
|
from app.config import config
|
|
from app.db import init_db
|
|
from app.reporting import due_jobs, send_scheduled_job
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def run_once() -> int:
|
|
tz = ZoneInfo(config.app_timezone)
|
|
now = datetime.now(tz)
|
|
jobs = due_jobs(now)
|
|
sent = 0
|
|
|
|
for job in jobs:
|
|
logger.info(
|
|
"Sending %s report for %s to %s",
|
|
job.cadence,
|
|
f"{job.start_date} to {job.end_date}",
|
|
job.recipient_email,
|
|
)
|
|
try:
|
|
if send_scheduled_job(job, tz):
|
|
sent += 1
|
|
except Exception:
|
|
logger.exception("Scheduled report failed")
|
|
|
|
return sent
|
|
|
|
|
|
def main() -> None:
|
|
init_db()
|
|
poll_seconds = max(60, config.report_scheduler_poll_seconds)
|
|
logger.info("Report scheduler started; polling every %s seconds", poll_seconds)
|
|
|
|
while True:
|
|
run_once()
|
|
time.sleep(poll_seconds)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|