qwen_agent/routes/projects.py
朱潮 425f3c5bb4 chore: replace Chinese comments and log messages with English
Convert all Chinese comments, docstrings, logger/print output,
HTTPException detail messages, and API response messages to English
across the entire codebase. Functional zh/ja localized strings
(e.g. prompt templates, timezone display names, date formats) are
preserved as-is.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-30 19:45:35 +08:00

177 lines
7.1 KiB
Python

import os
import json
from typing import Optional
from fastapi import APIRouter, HTTPException
import logging
logger = logging.getLogger('app')
from task_queue.task_status import task_status_store
router = APIRouter()
@router.get("/api/v1/projects")
async def list_all_projects():
"""Get the complete project list."""
try:
# Get robot projects (projects/robot)
robot_dir = "projects/robot"
robot_projects = []
if os.path.exists(robot_dir):
for item in os.listdir(robot_dir):
item_path = os.path.join(robot_dir, item)
if os.path.isdir(item_path):
try:
# Read robot config file
config_path = os.path.join(item_path, "robot_config.json")
config_data = {}
if os.path.exists(config_path):
with open(config_path, 'r', encoding='utf-8') as f:
config_data = json.load(f)
# Count files
file_count = 0
if os.path.exists(os.path.join(item_path, "datasets")):
for root, dirs, files in os.walk(os.path.join(item_path, "datasets")):
file_count += len(files)
robot_projects.append({
"id": item,
"name": config_data.get("name", item),
"type": "robot",
"status": config_data.get("status", "active"),
"file_count": file_count,
"config": config_data,
"created_at": os.path.getctime(item_path),
"updated_at": os.path.getmtime(item_path)
})
except Exception as e:
logger.error(f"Error reading robot project {item}: {str(e)}")
robot_projects.append({
"id": item,
"name": item,
"type": "robot",
"status": "unknown",
"file_count": 0,
"created_at": os.path.getctime(item_path),
"updated_at": os.path.getmtime(item_path)
})
# Get datasets (projects/data)
data_dir = "projects/data"
datasets = []
if os.path.exists(data_dir):
for item in os.listdir(data_dir):
item_path = os.path.join(data_dir, item)
if os.path.isdir(item_path):
try:
# Read processing log
log_path = os.path.join(item_path, "processing_log.json")
log_data = {}
if os.path.exists(log_path):
with open(log_path, 'r', encoding='utf-8') as f:
log_data = json.load(f)
# Count files
file_count = 0
for root, dirs, files in os.walk(item_path):
file_count += len([f for f in files if not f.endswith('.pkl')])
# Get status
status = "active"
if log_data.get("status"):
status = log_data["status"]
elif os.path.exists(os.path.join(item_path, "processed")):
status = "completed"
datasets.append({
"id": item,
"name": f"Dataset - {item[:8]}...",
"type": "dataset",
"status": status,
"file_count": file_count,
"log_data": log_data,
"created_at": os.path.getctime(item_path),
"updated_at": os.path.getmtime(item_path)
})
except Exception as e:
logger.error(f"Error reading dataset {item}: {str(e)}")
datasets.append({
"id": item,
"name": f"Dataset - {item[:8]}...",
"type": "dataset",
"status": "unknown",
"file_count": 0,
"created_at": os.path.getctime(item_path),
"updated_at": os.path.getmtime(item_path)
})
all_projects = robot_projects + datasets
return {
"success": True,
"message": "Project list retrieved successfully",
"total_projects": len(all_projects),
"robot_projects": robot_projects,
"datasets": datasets,
"projects": all_projects # Keep backward compatibility
}
except Exception as e:
logger.error(f"Error listing projects: {str(e)}")
raise HTTPException(status_code=500, detail=f"Failed to retrieve project list: {str(e)}")
@router.get("/api/v1/projects/robot")
async def list_robot_projects():
"""Get the robot project list."""
try:
response = await list_all_projects()
return {
"success": True,
"message": "Robot project list retrieved successfully",
"total_projects": len(response["robot_projects"]),
"projects": response["robot_projects"]
}
except Exception as e:
logger.error(f"Error listing robot projects: {str(e)}")
raise HTTPException(status_code=500, detail=f"Failed to retrieve robot project list: {str(e)}")
@router.get("/api/v1/projects/datasets")
async def list_datasets():
"""Get the dataset list."""
try:
response = await list_all_projects()
return {
"success": True,
"message": "Dataset list retrieved successfully",
"total_projects": len(response["datasets"]),
"projects": response["datasets"]
}
except Exception as e:
logger.error(f"Error listing datasets: {str(e)}")
raise HTTPException(status_code=500, detail=f"Failed to retrieve dataset list: {str(e)}")
@router.get("/api/v1/projects/{dataset_id}/tasks")
async def get_project_tasks(dataset_id: str):
"""Get all tasks for the specified project."""
try:
tasks = task_status_store.get_by_unique_id(dataset_id)
return {
"success": True,
"message": "Project tasks retrieved successfully",
"dataset_id": dataset_id,
"total_tasks": len(tasks),
"tasks": tasks
}
except Exception as e:
logger.error(f"Error getting project tasks: {str(e)}")
raise HTTPException(status_code=500, detail=f"Failed to retrieve project tasks: {str(e)}")