后端: - 新增 celery_health 生成前置闸——无 worker 在线时图片/视频生成入口 一律 503,防"提交到 ARK 后无人轮询、结果悬空+额度冻结"的数据丢失 - 拼接导出:帧率跟随源众数、字幕逐句重映射、原声/BGM 混音修复 - 资金核算审计脚本 + genesis 账目回填 + 滞留预留清理命令 - 接入 yunqi provider 与豆包 TTS 模型(catalog/migrations/bootstrap 命令) 前端:全站页面更新(pipeline/library/products/projects/team/account 等), 新增共享 pager 分页组件 QA:刷新 function-audit 全量输出,新增 full-qa 报告 文档:BP 产品介绍资料、design/CLAUDE.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
30 lines
979 B
Python
30 lines
979 B
Python
from rest_framework.exceptions import PermissionDenied
|
|
|
|
|
|
def get_current_team(user):
|
|
membership = user.team_memberships.filter(status="active").select_related("team").first()
|
|
if not membership:
|
|
raise PermissionDenied("current user has no active team")
|
|
return membership.team
|
|
|
|
|
|
def can_manage_team(user, team):
|
|
"""团队管理权限:仅 owner / admin 可做充值、改限额、增删成员等管理动作。"""
|
|
membership = user.team_memberships.filter(team=team, status="active").first()
|
|
return bool(membership and membership.role in {"owner", "admin"})
|
|
|
|
|
|
class TeamScopedViewSetMixin:
|
|
team_field = "team"
|
|
|
|
def get_team(self):
|
|
return get_current_team(self.request.user)
|
|
|
|
def get_queryset(self):
|
|
queryset = super().get_queryset()
|
|
return queryset.filter(**{self.team_field: self.get_team()})
|
|
|
|
def perform_create(self, serializer):
|
|
serializer.save(team=self.get_team(), created_by=self.request.user)
|
|
|