Add conditional caching and opt-in import scheduler

This commit is contained in:
ik
2026-09-03 08:04:57 +07:00
parent ddd8b84055
commit a528fc707f
13 changed files with 248 additions and 9 deletions
+63
View File
@@ -0,0 +1,63 @@
from __future__ import annotations
import logging
import time
from datetime import datetime, timedelta, timezone
from sqlalchemy import select
from sqlalchemy.orm import Session
from .config import settings
from .database import SessionLocal
from .importer import import_records
from .models import OfficialRecordImport
logger = logging.getLogger("rf4.import_scheduler")
def import_is_due(session: Session, *, now: datetime | None = None) -> bool:
current = now or datetime.now(timezone.utc)
latest = session.scalar(
select(OfficialRecordImport.started_at)
.where(OfficialRecordImport.source_url == settings.official_records_url)
.order_by(OfficialRecordImport.started_at.desc())
.limit(1)
)
if latest is None:
return True
if latest.tzinfo is None:
latest = latest.replace(tzinfo=timezone.utc)
return latest <= current - timedelta(seconds=settings.import_interval_seconds)
def run_due_import() -> bool:
with SessionLocal() as session:
if not import_is_due(session):
return False
run = import_records(
session,
url=settings.official_records_url,
region=settings.official_records_region,
category=settings.official_records_category,
)
logger.info(
"official import completed status=%s seen=%d created=%d updated=%d not_modified=%s",
run.status.value, run.rows_seen, run.rows_created, run.rows_updated, run.not_modified,
)
return True
def main() -> None:
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s %(message)s")
logger.info("scheduler started interval_seconds=%d", settings.import_interval_seconds)
while True:
try:
run_due_import()
except Exception:
logger.exception("scheduled official import failed")
time.sleep(settings.import_interval_seconds)
if __name__ == "__main__":
main()