优化脚本 就该模型
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
"""平台超管后台 · 跨团队端点。所有视图统一挂 IsPlatformAdmin,非超管一律 403,写操作记审计。"""
|
||||
|
||||
import logging
|
||||
from decimal import Decimal, ROUND_HALF_UP
|
||||
|
||||
from django.db.models import Count, F, Q
|
||||
@@ -39,6 +40,12 @@ from .serializers import (
|
||||
QualityWordSerializer,
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 后台「刷新状态」只向供应商拉取已提交的异步视频任务;单次上限避免请求拖死。
|
||||
_ADMIN_TASK_POLL_LIMIT = 20
|
||||
_ADMIN_TASK_POLL_STATUSES = (AITask.Status.SUBMITTED, AITask.Status.POLLING)
|
||||
|
||||
|
||||
def _team_qs():
|
||||
return (
|
||||
@@ -410,6 +417,31 @@ def admin_asset_reviews_poll(request):
|
||||
return Response({"polled": len(statuses), "statuses": statuses})
|
||||
|
||||
|
||||
def _refresh_inflight_task(task: AITask, *, operator) -> AITask:
|
||||
"""对单条在途任务向供应商拉一次最新态。无远端 ID / 非视频异步任务则原样返回。"""
|
||||
if not task.provider_task_id:
|
||||
return task
|
||||
if task.task_type == AITask.Type.FREE_VIDEO:
|
||||
from apps.ai.free_video import finalize_free_video
|
||||
|
||||
return finalize_free_video(task=task)
|
||||
if task.task_type == AITask.Type.VIDEO_SEGMENT:
|
||||
from apps.ai.services import poll_video_segment
|
||||
from apps.projects.models import VideoSegment
|
||||
|
||||
segment_id = (task.request_payload or {}).get("video_segment_id")
|
||||
if not segment_id:
|
||||
return task
|
||||
segment = VideoSegment.objects.filter(id=segment_id).first()
|
||||
if segment is None:
|
||||
return task
|
||||
user = task.created_by or getattr(task.team, "owner", None) or operator
|
||||
poll_video_segment(video_segment=segment, user=user)
|
||||
task.refresh_from_db()
|
||||
return task
|
||||
return task
|
||||
|
||||
|
||||
# ─────────────────────────── AI 任务监控 + 成本异常 ───────────────────────────
|
||||
|
||||
|
||||
@@ -440,6 +472,33 @@ def admin_tasks(request):
|
||||
return paginator.get_paginated_response(AdminTaskSerializer(page, many=True).data)
|
||||
|
||||
|
||||
@api_view(["POST"])
|
||||
@permission_classes([IsPlatformAdmin])
|
||||
def admin_tasks_poll(request):
|
||||
"""向供应商刷新在途视频任务状态。给 task_ids 则只拉这些,否则拉全平台 submitted/polling。
|
||||
|
||||
图片/脚本等同步任务没有远端 task id,点刷新后前端会再拉一次列表,worker 已落库的终态会一并更新。
|
||||
"""
|
||||
ids = request.data.get("task_ids")
|
||||
qs = (
|
||||
AITask.objects.select_related("team", "model_config", "model_config__provider", "project")
|
||||
.filter(status__in=_ADMIN_TASK_POLL_STATUSES)
|
||||
.exclude(provider_task_id="")
|
||||
.order_by("-updated_at")
|
||||
)
|
||||
if ids:
|
||||
qs = qs.filter(id__in=ids)
|
||||
statuses = {}
|
||||
for task in qs[:_ADMIN_TASK_POLL_LIMIT]:
|
||||
try:
|
||||
refreshed = _refresh_inflight_task(task, operator=request.user)
|
||||
statuses[str(refreshed.id)] = refreshed.status
|
||||
except Exception: # noqa: BLE001 — 单条失败不阻断整页刷新
|
||||
logger.warning("admin poll task %s failed", task.id, exc_info=True)
|
||||
statuses[str(task.id)] = task.status
|
||||
return Response({"polled": len(statuses), "statuses": statuses})
|
||||
|
||||
|
||||
@api_view(["GET"])
|
||||
@permission_classes([IsPlatformAdmin])
|
||||
def admin_task_detail(request, task_id):
|
||||
|
||||
Reference in New Issue
Block a user