Files
prop-data-guard/backend/app/tasks/classification_tasks.py
T
hiderfong 6d70520e79 feat: 全量功能模块开发与集成测试修复
- 新增后端模块:Alert、APIAsset、Compliance、Lineage、Masking、Risk、SchemaChange、Unstructured、Watermark
- 新增前端模块页面与API接口
- 新增Alembic迁移脚本(002-014)覆盖全量业务表
- 新增测试数据生成脚本与集成测试脚本
- 修复metadata模型JSON类型导入缺失导致启动失败的问题
- 修复前端Alert/APIAsset页面request模块路径错误
- 更新docker-compose与开发计划文档
2026-04-25 08:51:38 +08:00

63 lines
2.1 KiB
Python

import json
from app.tasks.worker import celery_app
@celery_app.task(bind=True)
def auto_classify_task(self, project_id: int, source_ids: list = None):
"""
Async task to run automatic classification on metadata.
"""
from app.core.database import SessionLocal
from app.models.project import ClassificationProject
from app.services.classification_engine import run_auto_classification
db = SessionLocal()
try:
project = db.query(ClassificationProject).filter(ClassificationProject.id == project_id).first()
if not project:
return {"status": "failed", "reason": "project not found"}
def progress_callback(scanned, matched, total):
percent = int(scanned / total * 100) if total else 0
meta = {
"scanned": scanned,
"matched": matched,
"total": total,
"percent": percent,
}
self.update_state(state="PROGRESS", meta=meta)
# Persist lightweight progress to DB for UI polling
project.scan_progress = json.dumps(meta)
db.commit()
# Initialize
project.status = "scanning"
project.scan_progress = json.dumps({"scanned": 0, "matched": 0, "total": 0, "percent": 0})
db.commit()
result = run_auto_classification(
db,
project_id,
source_ids=source_ids,
progress_callback=progress_callback,
)
if result.get("success"):
project.status = "assigning"
else:
project.status = "created"
project.celery_task_id = None
db.commit()
return {"status": "completed", "project_id": project_id, "result": result}
except Exception as e:
db.rollback()
project = db.query(ClassificationProject).filter(ClassificationProject.id == project_id).first()
if project:
project.status = "created"
project.celery_task_id = None
db.commit()
return {"status": "failed", "reason": str(e)}
finally:
db.close()