+1
-7
@@ -206,10 +206,7 @@ def admin_delete_document(doc_id: int, token: str):
|
|||||||
db.commit()
|
db.commit()
|
||||||
db.close()
|
db.close()
|
||||||
return {"message": "Document supprimé"}
|
return {"message": "Document supprimé"}
|
||||||
# ── Scrapers ─────────────────────────────────────────────────
|
|
||||||
# Les scrapers tournent aussi via le cron hôte (scripts/regwatch-scrape.sh,
|
|
||||||
# dimanche 3h). Ces endpoints permettent de les déclencher à la demande depuis
|
|
||||||
# la page admin et de consulter l'historique des exécutions.
|
|
||||||
|
|
||||||
SCRAPER_SOURCES = ("CIR", "SCCS")
|
SCRAPER_SOURCES = ("CIR", "SCCS")
|
||||||
PARIS = ZoneInfo("Europe/Paris")
|
PARIS = ZoneInfo("Europe/Paris")
|
||||||
@@ -226,9 +223,6 @@ def _serialize_run(run: ScraperRun) -> dict:
|
|||||||
}
|
}
|
||||||
|
|
||||||
def _execute_scraper(run_id: int, source: str) -> None:
|
def _execute_scraper(run_id: int, source: str) -> None:
|
||||||
"""Exécuté en tâche de fond : lance le scraper puis clôt la ligne de journal."""
|
|
||||||
# Import tardif : ollama/pdfplumber/bs4 sont lourds, inutile de les charger
|
|
||||||
# au démarrage de l'API alors qu'ils ne servent qu'ici.
|
|
||||||
from scrapers.cir_scraper import scrape_cir
|
from scrapers.cir_scraper import scrape_cir
|
||||||
from scrapers.sccs_scraper import scrape_sccs
|
from scrapers.sccs_scraper import scrape_sccs
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import os
|
|||||||
DB_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), "regwatch.db")
|
DB_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), "regwatch.db")
|
||||||
DATABASE_URL = os.getenv("DATABASE_URL", f"sqlite:///{DB_PATH}")
|
DATABASE_URL = os.getenv("DATABASE_URL", f"sqlite:///{DB_PATH}")
|
||||||
|
|
||||||
# check_same_thread est propre à SQLite : psycopg2 le rejette.
|
|
||||||
CONNECT_ARGS = {"check_same_thread": False} if DATABASE_URL.startswith("sqlite") else {}
|
CONNECT_ARGS = {"check_same_thread": False} if DATABASE_URL.startswith("sqlite") else {}
|
||||||
|
|
||||||
engine = create_engine(
|
engine = create_engine(
|
||||||
|
|||||||
+2
-3
@@ -20,11 +20,10 @@ class Document(Base):
|
|||||||
pdf_url = Column(String, unique=True)
|
pdf_url = Column(String, unique=True)
|
||||||
|
|
||||||
class ScraperRun(Base):
|
class ScraperRun(Base):
|
||||||
"""Une exécution de scraper, déclenchée depuis la page admin ou par le cron."""
|
|
||||||
__tablename__ = "scraper_runs"
|
__tablename__ = "scraper_runs"
|
||||||
id = Column(Integer, primary_key=True, index=True)
|
id = Column(Integer, primary_key=True, index=True)
|
||||||
source = Column(String, index=True) # CIR | SCCS
|
source = Column(String, index=True)
|
||||||
status = Column(String, default="pending") # pending | running | success | error
|
status = Column(String, default="pending")
|
||||||
started_at = Column(DateTime(timezone=True))
|
started_at = Column(DateTime(timezone=True))
|
||||||
finished_at = Column(DateTime(timezone=True), nullable=True)
|
finished_at = Column(DateTime(timezone=True), nullable=True)
|
||||||
documents_added = Column(Integer, default=0)
|
documents_added = Column(Integer, default=0)
|
||||||
|
|||||||
Reference in New Issue
Block a user