model_train_dm/backend/apps/annotation/views/annotate_team.py

182 lines
6.0 KiB
Python
Raw Normal View History

2026-07-27 17:51:49 +08:00
import uuid
from django.db import transaction
from django.db.models import CharField, Max
from django.db.models.functions import Cast
from django.shortcuts import get_object_or_404
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.pagination import PageNumberPagination
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.utils import json
from apps.common.serializers import AIAnnotateTeamMemberSerializer, AIAnnotateTeamSerializer
from apps.core.models import AIAnnotateTeam, AIAnnotateTeamMember
@api_view(["POST"])
@permission_classes([IsAuthenticated])
def create_annotate_team(request):
data = request.data
data["id"] = str(uuid.uuid4())
max_team_code = AIAnnotateTeam.objects.aggregate(
team_code=Max(Cast("team_code", CharField()))
).get("team_code")
max_team_code = int(max_team_code) if max_team_code is not None else 0
new_team_code = f"{max_team_code + 1:04}"
data["team_code"] = new_team_code
data["status"] = "01"
serializer = AIAnnotateTeamSerializer(data=data)
if serializer.is_valid():
serializer.save()
return Response({"message": "团队创建成功"})
return Response(
{"error": "无效的数据", "details": serializer.errors},
status=status.HTTP_400_BAD_REQUEST,
)
@api_view(["POST"])
@permission_classes([IsAuthenticated])
@transaction.atomic
def add_team_members(request):
data = request.data
team_id = data.get("team_id")
josn_str = data.get("team_members")
members = json.loads(josn_str)
objects_to_save = []
for member in members:
if not AIAnnotateTeamMember.objects.filter(
team_id=team_id, member_account=member.get("member_account")
).exists():
member_obj = AIAnnotateTeamMember(
id=str(uuid.uuid4()),
team_id=team_id,
member_account=member.get("member_account"),
member_name=member.get("member_name"),
member_email=member.get("member_email"),
)
objects_to_save.append(member_obj)
AIAnnotateTeamMember.objects.bulk_create(objects_to_save)
return Response({"message": "团队成员添加成功"})
@api_view(["GET"])
@permission_classes([IsAuthenticated])
def read_annotate_team(request):
team_id = request.GET.get("id", None)
team = get_object_or_404(AIAnnotateTeam, id=team_id)
serializer = AIAnnotateTeamSerializer(team)
return Response(serializer.data)
@api_view(["GET"])
@permission_classes([IsAuthenticated])
def search_annotate_team(request):
team_code = request.GET.get("team_code", None)
team_name = request.GET.get("team_name", None)
organization = request.GET.get("organization", None)
page_size = request.GET.get("page_size", None)
filter_kwargs = {}
if team_code:
filter_kwargs["team_code__icontains"] = team_code
if team_name:
filter_kwargs["team_name__icontains"] = team_name
if organization:
filter_kwargs["organization"] = organization
teams = AIAnnotateTeam.objects.filter(**filter_kwargs).order_by("team_code")
paginator = PageNumberPagination()
paginator.page_size = page_size or 10
result_page = paginator.paginate_queryset(teams, request)
serializer = AIAnnotateTeamSerializer(result_page, many=True)
return paginator.get_paginated_response(serializer.data)
@api_view(["GET"])
@permission_classes([IsAuthenticated])
def get_team_members(request):
team_id = request.GET.get("team_id", None)
filter_kwargs = {}
if team_id:
filter_kwargs["team_id"] = team_id
members = AIAnnotateTeamMember.objects.filter(**filter_kwargs).order_by(
"-member_role", "member_name"
)
serializer = AIAnnotateTeamMemberSerializer(members, many=True)
return Response(serializer.data)
@api_view(["PUT"])
@permission_classes([IsAuthenticated])
def update_annotate_team(request):
data = request.data
team = get_object_or_404(AIAnnotateTeam, id=data.get("id"))
serializer = AIAnnotateTeamSerializer(instance=team, data=data, partial=True)
if serializer.is_valid():
serializer.save()
return Response({"message": "团队更新成功"})
return Response(
{"error": "无效的数据", "details": serializer.errors},
status=status.HTTP_400_BAD_REQUEST,
)
@api_view(["PUT"])
@permission_classes([IsAuthenticated])
@transaction.atomic
def update_team_member(request):
data = request.data
team_member = get_object_or_404(AIAnnotateTeamMember, id=data.get("id"))
member_role = data.get("member_role")
if member_role == "leader":
AIAnnotateTeamMember.objects.filter(team_id=team_member.team_id).exclude(
id__in=team_member.id
).update(member_role="labeler")
AIAnnotateTeam.objects.filter(id=team_member.team_id).update(
team_leader_id=team_member.member_account,
team_leader_name=team_member.member_name,
)
serializer = AIAnnotateTeamMemberSerializer(instance=team_member, data=data, partial=True)
if serializer.is_valid():
serializer.save()
return Response({"message": "团队成员更新成功"})
return Response(
{"error": "无效的数据", "details": serializer.errors},
status=status.HTTP_400_BAD_REQUEST,
)
@api_view(["DELETE"])
@permission_classes([IsAuthenticated])
def delete_annotate_team(request):
team_id = request.GET.get("id", None)
team = get_object_or_404(AIAnnotateTeam, id=team_id)
team.delete()
return Response({"message": "团队删除成功"})
@api_view(["DELETE"])
def delete_team_members(request):
member_ids = request.GET.get("ids", None)
if member_ids is None:
return Response({"message": "未选择成员ID"}, status=400)
ids = [id for id in member_ids.split(",")]
if ids:
queryset = AIAnnotateTeamMember.objects.filter(id__in=ids)
queryset.delete()
return Response({"message": "团队成员删除成功"})