128 lines
4.3 KiB
Python
128 lines
4.3 KiB
Python
|
|
import base64
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
from django.conf import settings
|
||
|
|
from django.contrib.auth.hashers import make_password
|
||
|
|
from django.db.models import Max
|
||
|
|
from django.shortcuts import get_object_or_404
|
||
|
|
from gmssl import sm4
|
||
|
|
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 apps.common.serializers import AuthPersonSerializer
|
||
|
|
from apps.core.models import AIAnnotateTeamMember, AuthPerson
|
||
|
|
|
||
|
|
|
||
|
|
@api_view(["GET"])
|
||
|
|
@permission_classes([IsAuthenticated])
|
||
|
|
def get_person_list(request):
|
||
|
|
organization_id = request.GET.get("organization_id", None)
|
||
|
|
team_id = request.GET.get("team_id", None)
|
||
|
|
username = request.GET.get("username", None)
|
||
|
|
last_name = request.GET.get("last_name", None)
|
||
|
|
page_size = request.GET.get("page_size", None)
|
||
|
|
|
||
|
|
team_members = AIAnnotateTeamMember.objects.filter(team_id=team_id)
|
||
|
|
member_accounts = [team_member.member_account for team_member in team_members]
|
||
|
|
|
||
|
|
filter_kwargs = {}
|
||
|
|
if organization_id:
|
||
|
|
filter_kwargs["organization_id"] = organization_id
|
||
|
|
if username:
|
||
|
|
filter_kwargs["username__icontains"] = username
|
||
|
|
if last_name:
|
||
|
|
filter_kwargs["last_name__icontains"] = last_name
|
||
|
|
|
||
|
|
persons = AuthPerson.objects.filter(**filter_kwargs).order_by("id")
|
||
|
|
if member_accounts:
|
||
|
|
persons = persons.exclude(username__in=member_accounts)
|
||
|
|
|
||
|
|
paginator = PageNumberPagination()
|
||
|
|
paginator.page_size = page_size or 10
|
||
|
|
|
||
|
|
result_page = paginator.paginate_queryset(persons, request)
|
||
|
|
serializer = AuthPersonSerializer(result_page, many=True)
|
||
|
|
return paginator.get_paginated_response(serializer.data)
|
||
|
|
|
||
|
|
|
||
|
|
@api_view(["GET"])
|
||
|
|
@permission_classes([IsAuthenticated])
|
||
|
|
def read_person(request):
|
||
|
|
person_id = request.GET.get("id", None)
|
||
|
|
person = get_object_or_404(AuthPerson, id=person_id)
|
||
|
|
serializer = AuthPersonSerializer(person)
|
||
|
|
return Response(serializer.data)
|
||
|
|
|
||
|
|
|
||
|
|
@api_view(["POST"])
|
||
|
|
@permission_classes([IsAuthenticated])
|
||
|
|
def add_person(request):
|
||
|
|
data = request.data
|
||
|
|
max_id = AuthPerson.objects.aggregate(Max("id"))["id__max"]
|
||
|
|
data["id"] = (max_id + 1) if max_id is not None else 1
|
||
|
|
data["date_joined"] = datetime.now()
|
||
|
|
data["password"] = make_password("123456")
|
||
|
|
serializer = AuthPersonSerializer(data=data)
|
||
|
|
|
||
|
|
if serializer.is_valid():
|
||
|
|
serializer.save()
|
||
|
|
return Response({"message": "Person added successfully"})
|
||
|
|
|
||
|
|
return Response(
|
||
|
|
{"error": "Invalid data", "details": serializer.errors},
|
||
|
|
status=status.HTTP_400_BAD_REQUEST,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
@api_view(["PUT"])
|
||
|
|
@permission_classes([IsAuthenticated])
|
||
|
|
def update_person(request):
|
||
|
|
data = request.data
|
||
|
|
person = get_object_or_404(AuthPerson, id=data.get("id"))
|
||
|
|
serializer = AuthPersonSerializer(instance=person, data=request.data, partial=True)
|
||
|
|
|
||
|
|
if serializer.is_valid():
|
||
|
|
serializer.save()
|
||
|
|
return Response({"message": "Person updated successfully"})
|
||
|
|
|
||
|
|
return Response(
|
||
|
|
{"error": "Invalid data", "details": serializer.errors},
|
||
|
|
status=status.HTTP_400_BAD_REQUEST,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
@api_view(["DELETE"])
|
||
|
|
@permission_classes([IsAuthenticated])
|
||
|
|
def delete_person(request):
|
||
|
|
person_id = request.GET.get("id", None)
|
||
|
|
person = get_object_or_404(AuthPerson, id=person_id)
|
||
|
|
person.delete()
|
||
|
|
return Response({"message": "Person deleted successfully"})
|
||
|
|
|
||
|
|
|
||
|
|
@api_view(["POST"])
|
||
|
|
@permission_classes([IsAuthenticated])
|
||
|
|
def update_password(request):
|
||
|
|
username = request.data.get("username")
|
||
|
|
encrypted_password = request.data.get("password")
|
||
|
|
|
||
|
|
try:
|
||
|
|
password = decrypt_password(
|
||
|
|
encrypted_password, getattr(settings, "private_key", "")
|
||
|
|
)
|
||
|
|
AuthPerson.objects.filter(username=username).update(password=make_password(password))
|
||
|
|
return Response({"code": "0", "success": "用户密码修改成功!"})
|
||
|
|
except Exception:
|
||
|
|
return Response({"code": "1", "error": "用户密码更新失败!"})
|
||
|
|
|
||
|
|
|
||
|
|
def decrypt_password(encrypted_text, private_key):
|
||
|
|
cipher = sm4.CryptSM4()
|
||
|
|
cipher.set_key(private_key.encode(), True)
|
||
|
|
encrypted_bytes = base64.b64decode(encrypted_text)
|
||
|
|
decrypted_bytes = cipher.crypt_ecb(encrypted_bytes)
|
||
|
|
return decrypted_bytes.decode()
|