Files
2026-09-03 13:11:46 +08:00

43 lines
1.4 KiB
Python

from rest_framework.exceptions import PermissionDenied
from rest_framework.renderers import BaseRenderer
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)
class ServerSentEventRenderer(BaseRenderer):
"""让 DRF 内容协商接受 Accept: text/event-stream(否则流式端点直接 406)。
实际响应由视图返回 StreamingHttpResponse 直接下发,这个 renderer 只用于通过协商。"""
media_type = "text/event-stream"
format = "event-stream"
charset = None
def render(self, data, accepted_media_type=None, renderer_context=None):
return data