File size: 1,544 Bytes
ed52286
 
 
 
 
 
 
 
 
 
 
 
193eb98
 
ed52286
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fc1a5f0
ed52286
 
fc1a5f0
ed52286
 
 
 
 
 
193eb98
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
"""
Modèle SQLAlchemy 2.0 — table des jobs de traitement.

Un job suit l'exécution du pipeline sur une page.
  corpus.run  → crée un JobModel par page du corpus (page_id renseigné)
  pages.run   → crée un JobModel pour la page cible

Cycle de vie :
  pending → running → done
                   ↘ failed
"""
# 1. stdlib
from datetime import datetime, timezone
from functools import partial

# 2. third-party
from sqlalchemy import DateTime, ForeignKey, String, Text
from sqlalchemy.orm import Mapped, mapped_column, relationship

# 3. local
from app.models.database import Base


class JobModel(Base):
    """Suivi d'un job de pipeline (1 job = 1 page)."""

    __tablename__ = "jobs"

    id: Mapped[str] = mapped_column(String, primary_key=True)
    corpus_id: Mapped[str] = mapped_column(
        String, ForeignKey("corpora.id", ondelete="CASCADE"), nullable=False, index=True
    )
    page_id: Mapped[str | None] = mapped_column(
        String, ForeignKey("pages.id", ondelete="SET NULL"), nullable=True, index=True
    )
    # pending / running / done / failed
    status: Mapped[str] = mapped_column(String, nullable=False, default="pending")
    started_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
    finished_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
    error_message: Mapped[str | None] = mapped_column(Text, nullable=True)
    created_at: Mapped[datetime] = mapped_column(
        DateTime, nullable=False, default=partial(datetime.now, tz=timezone.utc)
    )