Refactor job model and optimize job streaming.
Updated the `JobModel` with foreign key relationships and string-based status to enhance database consistency, and improved job event streaming by using `jsonable_encoder` for better serialization. Also, streamlined dependencies by adding `urllib3` to handle HTTP requests.
This commit is contained in:
@@ -7,7 +7,6 @@ from sqlalchemy import (
|
||||
JSON,
|
||||
DateTime,
|
||||
Boolean,
|
||||
Enum,
|
||||
func,
|
||||
)
|
||||
from sqlalchemy.orm import relationship
|
||||
@@ -318,8 +317,8 @@ class Jobs(Base):
|
||||
__tablename__ = "jobs"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
experiment_parameters_id = Column(Integer, nullable=False)
|
||||
status = Column(Enum(JobStatus), default=JobStatus.TODO, nullable=False)
|
||||
parameters = Column(JSON, nullable=False)
|
||||
experiment_parameters_id = Column(Integer, ForeignKey("experiment_parameters.id"))
|
||||
status = Column(String, nullable=False)
|
||||
parameters = relationship(ExperimentParameters)
|
||||
created_at = Column(DateTime, server_default=func.now())
|
||||
updated_at = Column(DateTime, onupdate=func.now())
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import json
|
||||
import asyncio
|
||||
from fastapi import APIRouter, Depends
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
from sqlalchemy.orm import Session
|
||||
from starlette.responses import StreamingResponse
|
||||
from app.models import JobStatus, Jobs as JobModel
|
||||
@@ -11,15 +12,14 @@ router = APIRouter()
|
||||
|
||||
async def job_event_generator(db: Session):
|
||||
while True:
|
||||
# Fetch jobs with status TODO
|
||||
jobs = db.query(JobModel).filter(JobModel.status == JobStatus.TODO).all()
|
||||
|
||||
if jobs:
|
||||
# It's recommended to explicitly communicate IDs clearly
|
||||
job_payload = [{"id": job.id, "parameters": job.parameters} for job in jobs]
|
||||
job_payload = jsonable_encoder(jobs)
|
||||
yield f"data: {json.dumps(job_payload)}\n\n"
|
||||
await asyncio.sleep(5)
|
||||
|
||||
await asyncio.sleep(5) # A reasonable heartbeat/refresh
|
||||
|
||||
# A reasonable heartbeat/refresh
|
||||
|
||||
|
||||
@router.get("/jobs/stream")
|
||||
|
||||
@@ -352,7 +352,7 @@ def create_experiment_parameters_for_sample(
|
||||
|
||||
new_job = JobModel(
|
||||
experiment_parameters_id=new_exp.id, # <-- Correct reference here
|
||||
parameters=new_exp.to_dict(), # assuming params has a to_dict() method
|
||||
parameters=new_exp, # assuming params has a to_dict() method
|
||||
status=JobStatus.TODO,
|
||||
)
|
||||
db.add(new_job)
|
||||
|
||||
@@ -941,3 +941,19 @@ class ResultResponse(BaseModel):
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class JobsCreate(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
status: str
|
||||
type: str
|
||||
start_time: datetime
|
||||
end_time: datetime
|
||||
description: Optional[str]
|
||||
parameters: str
|
||||
datacollectionparameters: DataCollectionParameters
|
||||
beamlineparameters: BeamlineParameters
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
Reference in New Issue
Block a user