Skip to content

Commit

Permalink
Merge pull request #119 from PySpur-Dev/fix/cascade-deletes
Browse files Browse the repository at this point in the history
Refactor workflow deletion logic and relationships
  • Loading branch information
srijanpatel authored Jan 27, 2025
2 parents cc30f29 + 4f5dacd commit 3a0b1ef
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 24 deletions.
17 changes: 2 additions & 15 deletions backend/app/api/workflow_management.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@
)
from ..database import get_db
from ..models.workflow_model import WorkflowModel as WorkflowModel
from ..models.workflow_version_model import WorkflowVersionModel
from ..models.run_model import RunModel
from ..nodes.primitives.input import InputNodeConfig

router = APIRouter()
Expand Down Expand Up @@ -181,35 +179,24 @@ def reset_workflow(
description="Delete a workflow by ID",
)
def delete_workflow(workflow_id: str, db: Session = Depends(get_db)):
# Fetch the workflow by ID
workflow = db.query(WorkflowModel).filter(WorkflowModel.id == workflow_id).first()

# If workflow not found, raise 404 error
if not workflow:
raise HTTPException(status_code=404, detail="Workflow not found")

try:
# Delete associated runs
db.query(RunModel).filter(RunModel.workflow_id == workflow_id).delete()

# Delete associated workflow versions
db.query(WorkflowVersionModel).filter(
WorkflowVersionModel.workflow_id == workflow_id
).delete()

# Delete associated test files
test_files_dir = Path("data/test_files") / workflow_id
if test_files_dir.exists():
shutil.rmtree(test_files_dir)

# Delete the workflow
# Delete the workflow (cascading will handle related records)
db.delete(workflow)
db.commit()
except Exception as e:
db.rollback()
raise HTTPException(
status_code=500,
detail=f"Error deleting workflow and its versions: {str(e)}",
detail=f"Error deleting workflow: {str(e)}",
)

return None
Expand Down
9 changes: 8 additions & 1 deletion backend/app/models/output_file_model.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from sqlalchemy import Computed, Integer, String, DateTime
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy.orm import Mapped, mapped_column, relationship
from datetime import datetime, timezone
from .base_model import BaseModel

Expand All @@ -21,3 +21,10 @@ class OutputFileModel(BaseModel):
default=datetime.now(timezone.utc),
onupdate=datetime.now(timezone.utc),
)

run = relationship(
"RunModel",
back_populates="output_file",
single_parent=True,
cascade="all, delete-orphan",
)
12 changes: 8 additions & 4 deletions backend/app/models/run_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,19 @@ class RunModel(BaseModel):
output_file_id: Mapped[Optional[str]] = mapped_column(
String, ForeignKey("output_files.id"), nullable=True
)
tasks: Mapped[List["TaskModel"]] = relationship("TaskModel")
tasks: Mapped[List["TaskModel"]] = relationship(
"TaskModel", cascade="all, delete-orphan"
)
parent_run: Mapped[Optional["RunModel"]] = relationship(
"RunModel", remote_side=[id], back_populates="subruns"
"RunModel",
remote_side=[id],
back_populates="subruns",
)
subruns: Mapped[List["RunModel"]] = relationship(
"RunModel", back_populates="parent_run"
"RunModel", back_populates="parent_run", cascade="all, delete-orphan"
)
output_file: Mapped[Optional["OutputFileModel"]] = relationship(
"OutputFileModel", backref="run"
"OutputFileModel", back_populates="run"
)

@property
Expand Down
6 changes: 4 additions & 2 deletions backend/app/models/task_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,10 @@ class TaskModel(BaseModel):
subworkflow: Mapped[Optional[Any]] = mapped_column(JSON, nullable=True)
subworkflow_output: Mapped[Optional[Any]] = mapped_column(JSON, nullable=True)

parent_task: Mapped[Optional["TaskModel"]] = relationship(
"TaskModel", remote_side=[id], backref="subtasks"
# Relationships
parent_task = relationship("TaskModel", remote_side=[id], back_populates="subtasks")
subtasks = relationship(
"TaskModel", back_populates="parent_task", cascade="all, delete-orphan"
)

@property
Expand Down
4 changes: 3 additions & 1 deletion backend/app/models/workflow_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,6 @@ class WorkflowModel(BaseModel):
onupdate=datetime.now(timezone.utc),
)

versions = relationship("WorkflowVersionModel", back_populates="workflow")
versions = relationship(
"WorkflowVersionModel", back_populates="workflow", cascade="all, delete-orphan"
)
2 changes: 1 addition & 1 deletion backend/app/models/workflow_version_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,5 @@ class WorkflowVersionModel(BaseModel):
workflow = relationship("WorkflowModel", back_populates="versions")

runs: Mapped[Optional[List["RunModel"]]] = relationship(
"RunModel", backref="workflow_version"
"RunModel", backref="workflow_version", cascade="all, delete-orphan"
)

0 comments on commit 3a0b1ef

Please sign in to comment.