machathon-ocr / models.py
Mohamed0115
Deploy Machathon OCR backend with YOLO + OpenCV + PaddleOCR pipeline
30ce8bf
Raw
History Blame Contribute Delete
2.6 kB
import datetime
from sqlalchemy import Column, Integer, String, Float, DateTime, Text, JSON, Enum as SAEnum
from database import Base
import enum
class JobStatus(str, enum.Enum):
PENDING = "pending"
PROCESSING = "processing"
COMPLETED = "completed"
FAILED = "failed"
class Job(Base):
"""Tracks every file processing request for health monitoring."""
__tablename__ = "jobs"
id = Column(Integer, primary_key=True, index=True)
job_id = Column(String(64), unique=True, index=True, nullable=False)
original_filename = Column(String(512), nullable=False)
file_type = Column(String(10)) # "pdf" or "image"
total_pages = Column(Integer, default=1)
current_page = Column(Integer, default=0)
status = Column(String(20), default=JobStatus.PENDING.value)
# --- Results ---
tables_found = Column(Integer, default=0)
cells_extracted = Column(Integer, default=0)
result_payload = Column(JSON, nullable=True) # full extraction data
# --- Health metrics ---
latency_seconds = Column(Float, nullable=True)
error_message = Column(Text, nullable=True)
# --- Timestamps ---
created_at = Column(DateTime, default=datetime.datetime.utcnow)
started_at = Column(DateTime, nullable=True)
completed_at = Column(DateTime, nullable=True)
def to_dict(self):
return {
"id": self.id,
"job_id": self.job_id,
"original_filename": self.original_filename,
"file_type": self.file_type,
"total_pages": self.total_pages,
"current_page": self.current_page,
"status": self.status,
"tables_found": self.tables_found,
"cells_extracted": self.cells_extracted,
"latency_seconds": self.latency_seconds,
"error_message": self.error_message,
"created_at": self.created_at.isoformat() if self.created_at else None,
"started_at": self.started_at.isoformat() if self.started_at else None,
"completed_at": self.completed_at.isoformat() if self.completed_at else None,
}
class HealthLog(Base):
"""Aggregated health snapshots for the monitoring dashboard."""
__tablename__ = "health_logs"
id = Column(Integer, primary_key=True, index=True)
timestamp = Column(DateTime, default=datetime.datetime.utcnow, index=True)
total_jobs = Column(Integer, default=0)
successful_jobs = Column(Integer, default=0)
failed_jobs = Column(Integer, default=0)
avg_latency = Column(Float, default=0.0)
p95_latency = Column(Float, default=0.0)