|
@@ -10,7 +10,7 @@ from datetime import datetime
|
|
|
from typing import Dict, List, Optional, Any
|
|
from typing import Dict, List, Optional, Any
|
|
|
from pathlib import Path
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
-from ..database import get_db, Task
|
|
|
|
|
|
|
+from ..database import SessionLocal, Task
|
|
|
|
|
|
|
|
|
|
|
|
|
class TaskManager:
|
|
class TaskManager:
|
|
@@ -76,23 +76,23 @@ class TaskManager:
|
|
|
json.dump(task_payload, f, ensure_ascii=False, indent=2)
|
|
json.dump(task_payload, f, ensure_ascii=False, indent=2)
|
|
|
|
|
|
|
|
# Save to database
|
|
# Save to database
|
|
|
- db = next(get_db())
|
|
|
|
|
- db_task = Task(
|
|
|
|
|
- task_id=task_uuid,
|
|
|
|
|
- task_name=task_name,
|
|
|
|
|
- plan_id=plan_id,
|
|
|
|
|
- status="pending",
|
|
|
|
|
- priority=priority,
|
|
|
|
|
- total_points=len(parameters),
|
|
|
|
|
- completed_points=0,
|
|
|
|
|
- task_dir=task_dir,
|
|
|
|
|
- task_file=task_file,
|
|
|
|
|
- created_by=created_by,
|
|
|
|
|
- created_at=datetime.now(),
|
|
|
|
|
- )
|
|
|
|
|
- db.add(db_task)
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(db_task)
|
|
|
|
|
|
|
+ with SessionLocal() as db:
|
|
|
|
|
+ db_task = Task(
|
|
|
|
|
+ task_id=task_uuid,
|
|
|
|
|
+ task_name=task_name,
|
|
|
|
|
+ plan_id=plan_id,
|
|
|
|
|
+ status="pending",
|
|
|
|
|
+ priority=priority,
|
|
|
|
|
+ total_points=len(parameters),
|
|
|
|
|
+ completed_points=0,
|
|
|
|
|
+ task_dir=task_dir,
|
|
|
|
|
+ task_file=task_file,
|
|
|
|
|
+ created_by=created_by,
|
|
|
|
|
+ created_at=datetime.now(),
|
|
|
|
|
+ )
|
|
|
|
|
+ db.add(db_task)
|
|
|
|
|
+ db.commit()
|
|
|
|
|
+ db.refresh(db_task)
|
|
|
|
|
|
|
|
return self._task_to_dict(db_task)
|
|
return self._task_to_dict(db_task)
|
|
|
|
|
|
|
@@ -105,17 +105,17 @@ class TaskManager:
|
|
|
Returns:
|
|
Returns:
|
|
|
Updated task dict
|
|
Updated task dict
|
|
|
"""
|
|
"""
|
|
|
- db = next(get_db())
|
|
|
|
|
- task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
- if not task:
|
|
|
|
|
- raise ValueError(f"Task {task_id} not found")
|
|
|
|
|
- if task.status != "pending":
|
|
|
|
|
- raise ValueError(f"Task {task_id} is not pending (status: {task.status})")
|
|
|
|
|
-
|
|
|
|
|
- task.status = "dispatched"
|
|
|
|
|
- task.dispatched_at = datetime.now()
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(task)
|
|
|
|
|
|
|
+ with SessionLocal() as db:
|
|
|
|
|
+ task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
+ if not task:
|
|
|
|
|
+ raise ValueError(f"Task {task_id} not found")
|
|
|
|
|
+ if task.status != "pending":
|
|
|
|
|
+ raise ValueError(f"Task {task_id} is not pending (status: {task.status})")
|
|
|
|
|
+
|
|
|
|
|
+ task.status = "dispatched"
|
|
|
|
|
+ task.dispatched_at = datetime.now()
|
|
|
|
|
+ db.commit()
|
|
|
|
|
+ db.refresh(task)
|
|
|
return self._task_to_dict(task)
|
|
return self._task_to_dict(task)
|
|
|
|
|
|
|
|
def update_progress(
|
|
def update_progress(
|
|
@@ -138,32 +138,32 @@ class TaskManager:
|
|
|
Returns:
|
|
Returns:
|
|
|
Updated task dict
|
|
Updated task dict
|
|
|
"""
|
|
"""
|
|
|
- db = next(get_db())
|
|
|
|
|
- task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
- if not task:
|
|
|
|
|
- raise ValueError(f"Task {task_id} not found")
|
|
|
|
|
-
|
|
|
|
|
- if task.status in ("dispatched", "running"):
|
|
|
|
|
- task.status = "running"
|
|
|
|
|
- task.started_at = task.started_at or datetime.now()
|
|
|
|
|
-
|
|
|
|
|
- task.completed_points = current_point
|
|
|
|
|
- if total_points:
|
|
|
|
|
- task.total_points = total_points
|
|
|
|
|
-
|
|
|
|
|
- # Update progress metadata
|
|
|
|
|
- progress_data = {
|
|
|
|
|
- "current_point": current_point,
|
|
|
|
|
- "current_params": current_params,
|
|
|
|
|
- "elapsed_time": elapsed_time,
|
|
|
|
|
- "updated_at": datetime.now().isoformat(),
|
|
|
|
|
- }
|
|
|
|
|
- existing_progress = json.loads(task.progress_data or "{}")
|
|
|
|
|
- existing_progress.update(progress_data)
|
|
|
|
|
- task.progress_data = json.dumps(existing_progress, ensure_ascii=False)
|
|
|
|
|
-
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(task)
|
|
|
|
|
|
|
+ with SessionLocal() as db:
|
|
|
|
|
+ task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
+ if not task:
|
|
|
|
|
+ raise ValueError(f"Task {task_id} not found")
|
|
|
|
|
+
|
|
|
|
|
+ if task.status in ("dispatched", "running"):
|
|
|
|
|
+ task.status = "running"
|
|
|
|
|
+ task.started_at = task.started_at or datetime.now()
|
|
|
|
|
+
|
|
|
|
|
+ task.completed_points = current_point
|
|
|
|
|
+ if total_points:
|
|
|
|
|
+ task.total_points = total_points
|
|
|
|
|
+
|
|
|
|
|
+ # Update progress metadata
|
|
|
|
|
+ progress_data = {
|
|
|
|
|
+ "current_point": current_point,
|
|
|
|
|
+ "current_params": current_params,
|
|
|
|
|
+ "elapsed_time": elapsed_time,
|
|
|
|
|
+ "updated_at": datetime.now().isoformat(),
|
|
|
|
|
+ }
|
|
|
|
|
+ existing_progress = json.loads(task.progress_data or "{}")
|
|
|
|
|
+ existing_progress.update(progress_data)
|
|
|
|
|
+ task.progress_data = json.dumps(existing_progress, ensure_ascii=False)
|
|
|
|
|
+
|
|
|
|
|
+ db.commit()
|
|
|
|
|
+ db.refresh(task)
|
|
|
return self._task_to_dict(task)
|
|
return self._task_to_dict(task)
|
|
|
|
|
|
|
|
def report_results(
|
|
def report_results(
|
|
@@ -188,36 +188,36 @@ class TaskManager:
|
|
|
Returns:
|
|
Returns:
|
|
|
Updated task dict
|
|
Updated task dict
|
|
|
"""
|
|
"""
|
|
|
- db = next(get_db())
|
|
|
|
|
- task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
- if not task:
|
|
|
|
|
- raise ValueError(f"Task {task_id} not found")
|
|
|
|
|
-
|
|
|
|
|
- task.status = status
|
|
|
|
|
- task.completed_at = datetime.now()
|
|
|
|
|
- task.completed_points = len(results)
|
|
|
|
|
- if duration:
|
|
|
|
|
- task.duration = duration
|
|
|
|
|
-
|
|
|
|
|
- # Save results to file
|
|
|
|
|
- results_file = os.path.join(task.task_dir, "results.json")
|
|
|
|
|
- with open(results_file, "w", encoding="utf-8") as f:
|
|
|
|
|
- json.dump({"results": results, "metrics": metrics, "logs": logs}, f, ensure_ascii=False, indent=2)
|
|
|
|
|
-
|
|
|
|
|
- task.results_file = results_file
|
|
|
|
|
- if metrics:
|
|
|
|
|
- task.result_metrics = json.dumps(metrics, ensure_ascii=False)
|
|
|
|
|
-
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(task)
|
|
|
|
|
|
|
+ with SessionLocal() as db:
|
|
|
|
|
+ task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
+ if not task:
|
|
|
|
|
+ raise ValueError(f"Task {task_id} not found")
|
|
|
|
|
+
|
|
|
|
|
+ task.status = status
|
|
|
|
|
+ task.completed_at = datetime.now()
|
|
|
|
|
+ task.completed_points = len(results)
|
|
|
|
|
+ if duration:
|
|
|
|
|
+ task.duration = duration
|
|
|
|
|
+
|
|
|
|
|
+ # Save results to file
|
|
|
|
|
+ results_file = os.path.join(task.task_dir, "results.json")
|
|
|
|
|
+ with open(results_file, "w", encoding="utf-8") as f:
|
|
|
|
|
+ json.dump({"results": results, "metrics": metrics, "logs": logs}, f, ensure_ascii=False, indent=2)
|
|
|
|
|
+
|
|
|
|
|
+ task.results_file = results_file
|
|
|
|
|
+ if metrics:
|
|
|
|
|
+ task.result_metrics = json.dumps(metrics, ensure_ascii=False)
|
|
|
|
|
+
|
|
|
|
|
+ db.commit()
|
|
|
|
|
+ db.refresh(task)
|
|
|
return self._task_to_dict(task)
|
|
return self._task_to_dict(task)
|
|
|
|
|
|
|
|
def get_task(self, task_id: str) -> Optional[Dict[str, Any]]:
|
|
def get_task(self, task_id: str) -> Optional[Dict[str, Any]]:
|
|
|
"""Get task by ID."""
|
|
"""Get task by ID."""
|
|
|
- db = next(get_db())
|
|
|
|
|
- task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
- if not task:
|
|
|
|
|
- return None
|
|
|
|
|
|
|
+ with SessionLocal() as db:
|
|
|
|
|
+ task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
+ if not task:
|
|
|
|
|
+ return None
|
|
|
return self._task_to_dict(task)
|
|
return self._task_to_dict(task)
|
|
|
|
|
|
|
|
def list_tasks(
|
|
def list_tasks(
|
|
@@ -228,15 +228,15 @@ class TaskManager:
|
|
|
offset: int = 0,
|
|
offset: int = 0,
|
|
|
) -> Dict[str, Any]:
|
|
) -> Dict[str, Any]:
|
|
|
"""List tasks with filters."""
|
|
"""List tasks with filters."""
|
|
|
- db = next(get_db())
|
|
|
|
|
- query = db.query(Task)
|
|
|
|
|
- if status:
|
|
|
|
|
- query = query.filter(Task.status == status)
|
|
|
|
|
- if plan_id:
|
|
|
|
|
- query = query.filter(Task.plan_id == plan_id)
|
|
|
|
|
|
|
+ with SessionLocal() as db:
|
|
|
|
|
+ query = db.query(Task)
|
|
|
|
|
+ if status:
|
|
|
|
|
+ query = query.filter(Task.status == status)
|
|
|
|
|
+ if plan_id:
|
|
|
|
|
+ query = query.filter(Task.plan_id == plan_id)
|
|
|
|
|
|
|
|
- total = query.count()
|
|
|
|
|
- tasks = query.order_by(Task.created_at.desc()).offset(offset).limit(limit).all()
|
|
|
|
|
|
|
+ total = query.count()
|
|
|
|
|
+ tasks = query.order_by(Task.created_at.desc()).offset(offset).limit(limit).all()
|
|
|
|
|
|
|
|
return {
|
|
return {
|
|
|
"total": total,
|
|
"total": total,
|
|
@@ -247,17 +247,17 @@ class TaskManager:
|
|
|
|
|
|
|
|
def cancel_task(self, task_id: str) -> Dict[str, Any]:
|
|
def cancel_task(self, task_id: str) -> Dict[str, Any]:
|
|
|
"""Cancel a pending or running task."""
|
|
"""Cancel a pending or running task."""
|
|
|
- db = next(get_db())
|
|
|
|
|
- task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
- if not task:
|
|
|
|
|
- raise ValueError(f"Task {task_id} not found")
|
|
|
|
|
- if task.status in ("completed", "failed", "cancelled"):
|
|
|
|
|
- raise ValueError(f"Task {task_id} already finished (status: {task.status})")
|
|
|
|
|
-
|
|
|
|
|
- task.status = "cancelled"
|
|
|
|
|
- task.completed_at = datetime.now()
|
|
|
|
|
- db.commit()
|
|
|
|
|
- db.refresh(task)
|
|
|
|
|
|
|
+ with SessionLocal() as db:
|
|
|
|
|
+ task = db.query(Task).filter(Task.task_id == task_id).first()
|
|
|
|
|
+ if not task:
|
|
|
|
|
+ raise ValueError(f"Task {task_id} not found")
|
|
|
|
|
+ if task.status in ("completed", "failed", "cancelled"):
|
|
|
|
|
+ raise ValueError(f"Task {task_id} already finished (status: {task.status})")
|
|
|
|
|
+
|
|
|
|
|
+ task.status = "cancelled"
|
|
|
|
|
+ task.completed_at = datetime.now()
|
|
|
|
|
+ db.commit()
|
|
|
|
|
+ db.refresh(task)
|
|
|
return self._task_to_dict(task)
|
|
return self._task_to_dict(task)
|
|
|
|
|
|
|
|
def get_task_results(self, task_id: str) -> Optional[Dict[str, Any]]:
|
|
def get_task_results(self, task_id: str) -> Optional[Dict[str, Any]]:
|