Skip to content

Commit

Permalink
Add support for patching multiple analyses
Browse files Browse the repository at this point in the history
  • Loading branch information
seallard committed Feb 19, 2024
1 parent c1ae1d3 commit 64c0aff
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 1 deletion.
4 changes: 4 additions & 0 deletions trailblazer/dto/analyses_response.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,7 @@ class Analysis(BaseModel):
class AnalysesResponse(BaseModel):
analyses: list[Analysis]
total_count: int


class UpdateAnalysesResponse(BaseModel):
analyses: list[Analysis]
14 changes: 14 additions & 0 deletions trailblazer/dto/update_analyses.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from pydantic import BaseModel

from trailblazer.constants import TrailblazerStatus


class AnalysisUpdate(BaseModel):
analysis_id: int
status: TrailblazerStatus | None = None
comment: str | None = None
is_visible: bool | None = None


class UpdateAnalyses(BaseModel):
analyses: list[AnalysisUpdate]
13 changes: 13 additions & 0 deletions trailblazer/server/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@
FailedJobsRequest,
FailedJobsResponse,
)
from trailblazer.dto.analyses_response import UpdateAnalysesResponse
from trailblazer.dto.create_analysis_request import CreateAnalysisRequest
from trailblazer.dto.update_analyses import UpdateAnalyses
from trailblazer.exc import MissingAnalysis
from trailblazer.server.ext import store
from trailblazer.server.utils import (
Expand Down Expand Up @@ -73,6 +75,17 @@ def get_analyses(analysis_service: AnalysisService = Provide[Container.analysis_
return jsonify(error=str(error)), HTTPStatus.BAD_REQUEST


@blueprint.route("/analyses", methods=["PATCH"])
@inject
def patch_analyses(analysis_service: AnalysisService = Provide[Container.analysis_service]):
try:
data = UpdateAnalyses.model_validate(request.json)
response: UpdateAnalysesResponse = analysis_service.update_analyses(data)
return jsonify(response.model_dump()), HTTPStatus.OK
except ValidationError as error:
return jsonify(error=str(error)), HTTPStatus.BAD_REQUEST


@blueprint.route("/analyses/<int:analysis_id>", methods=["GET"])
@inject
def get_analysis(
Expand Down
8 changes: 7 additions & 1 deletion trailblazer/services/analysis_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
AnalysisUpdateRequest,
CreateAnalysisRequest,
)
from trailblazer.dto.analyses_response import UpdateAnalysesResponse
from trailblazer.dto.update_analyses import UpdateAnalyses
from trailblazer.exc import MissingAnalysis
from trailblazer.services.utils import create_analysis_response
from trailblazer.services.utils import create_update_analyses_response, create_analysis_response
from trailblazer.store.models import Analysis, Job
from trailblazer.store.store import Store

Expand Down Expand Up @@ -35,6 +37,10 @@ def update_analysis(self, analysis_id: int, update: AnalysisUpdateRequest) -> An
)
return create_analysis_response(analysis)

def update_analyses(self, data: UpdateAnalyses) -> UpdateAnalysesResponse:
analyses: list[Analysis] = self.store.update_analyses(data)
return create_update_analyses_response(analyses)

def add_pending_analysis(self, request_data: CreateAnalysisRequest) -> AnalysisResponse:
analysis: Analysis = self.store.add_pending_analysis(request_data)
return create_analysis_response(analysis)
Expand Down
9 changes: 9 additions & 0 deletions trailblazer/services/utils.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from trailblazer.dto import AnalysisResponse, FailedJobsResponse
from trailblazer.dto.analyses_response import AnalysesResponse, UpdateAnalysesResponse
from trailblazer.dto.job_response import JobResponse
from trailblazer.store.models import Analysis, Job

Expand All @@ -19,3 +20,11 @@ def create_job_response(job: Job) -> JobResponse:
return JobResponse(
slurm_id=job.slurm_id, analysis_id=job.analysis_id, status=job.status, id=job.id
)


def create_update_analyses_response(analyses: list[Analysis]) -> UpdateAnalysesResponse:
data: list[dict] = []
for analysis in analyses:
analysis_data = analysis.to_dict()
data.append(analysis_data)
return UpdateAnalysesResponse(analyses=data)
13 changes: 13 additions & 0 deletions trailblazer/store/crud/update.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from trailblazer.apps.slurm.models import SqueueResult
from trailblazer.apps.tower.api import TowerAPI, get_tower_api
from trailblazer.constants import SlurmJobStatus, TrailblazerStatus, WorkflowManager
from trailblazer.dto.update_analyses import UpdateAnalyses
from trailblazer.exc import MissingAnalysis, TrailblazerError
from trailblazer.services.slurm.dtos import SlurmJobInfo
from trailblazer.store.base import BaseHandler
Expand Down Expand Up @@ -262,6 +263,18 @@ def update_analysis(

return analysis

def update_analyses(self, update_data: UpdateAnalyses) -> list[Analysis]:
updated_analyses: list[Analysis] = []
for analysis_update in update_data.analyses:
analysis: Analysis = self.update_analysis(
analysis_id=analysis_update.analysis_id,
status=analysis_update.status,
comment=analysis_update.comment,
is_visible=analysis_update.is_visible,
)
updated_analyses.append(analysis)
return updated_analyses

def update_job(self, job_id: int, job_info: SlurmJobInfo) -> Job:
job: Job | None = self.get_job_by_id(job_id)
job.name = job_info.name
Expand Down

0 comments on commit 64c0aff

Please sign in to comment.