215 lines
6.0 KiB
Python
215 lines
6.0 KiB
Python
from django.contrib import auth
|
|
from django.db.models import QuerySet
|
|
from django.shortcuts import get_object_or_404
|
|
from django_filters.rest_framework import DjangoFilterBackend
|
|
from rest_framework import generics
|
|
from rest_framework import permissions
|
|
from rest_framework import views
|
|
from rest_framework.exceptions import ValidationError
|
|
from rest_framework.filters import SearchFilter, OrderingFilter
|
|
from rest_framework.pagination import PageNumberPagination
|
|
from rest_framework.response import Response
|
|
from rest_framework.serializers import Serializer
|
|
|
|
from . import models
|
|
from . import serializers
|
|
|
|
from utils.models import UploadFile
|
|
|
|
class User(generics.ListCreateAPIView):
|
|
"""
|
|
获得user列表
|
|
添加user
|
|
"""
|
|
serializer_class = serializers.UserSerializer
|
|
queryset = models.User.objects.all().order_by('id')
|
|
permission_classes = (permissions.IsAdminUser,)
|
|
pagination_class = PageNumberPagination
|
|
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
|
|
filterset_fields = [
|
|
'role',
|
|
'teacher'
|
|
]
|
|
search_fields = [
|
|
'id',
|
|
'username',
|
|
'email',
|
|
]
|
|
ordering_fields = [
|
|
'id',
|
|
'username',
|
|
'date_joined',
|
|
'last_login',
|
|
]
|
|
|
|
def perform_create(self, serializer):
|
|
user = serializer.validated_data
|
|
role = user.get('role')
|
|
is_staff = False
|
|
is_superuser = False
|
|
if role == 'TEACHER':
|
|
is_staff = True
|
|
elif role == 'ADMIN':
|
|
is_staff = True
|
|
is_superuser = True
|
|
u = models.User.objects.create_user(
|
|
username=user['username'],
|
|
password=user['password'],
|
|
role=user['role'],
|
|
email=user['email'],
|
|
is_staff=is_staff,
|
|
is_superuser=is_superuser,
|
|
is_active=user['is_active'],
|
|
point=user['point']
|
|
)
|
|
teacher_list = user.get('teacher')
|
|
for teacher in teacher_list:
|
|
u.teacher.add(teacher)
|
|
|
|
|
|
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
"""
|
|
获得指定user
|
|
更新指定user
|
|
删除指定user
|
|
"""
|
|
serializer_class = serializers.UserSerializer
|
|
queryset = models.User.objects.all()
|
|
permission_classes = (permissions.IsAdminUser,)
|
|
|
|
def perform_update(self, serializer):
|
|
serializer.save()
|
|
data = serializer.validated_data
|
|
password = data.get('password')
|
|
user = get_object_or_404(models.User, id=self.kwargs['pk'])
|
|
if password:
|
|
user.set_password(password)
|
|
user.save()
|
|
role = user.role
|
|
if role != 'STUDENT':
|
|
user.teacher.clear()
|
|
is_staff = False
|
|
is_superuser = False
|
|
if role == 'TEACHER':
|
|
is_staff = True
|
|
elif role == 'ADMIN':
|
|
is_staff = True
|
|
is_superuser = True
|
|
user.is_staff = is_staff
|
|
user.is_superuser = is_superuser
|
|
user.save()
|
|
|
|
|
|
class RoleList(generics.GenericAPIView):
|
|
"""
|
|
获得角色列表
|
|
"""
|
|
queryset = QuerySet()
|
|
permission_classes = (permissions.IsAuthenticated,)
|
|
|
|
def get(self, request):
|
|
role_list = []
|
|
for role in models.User.ROLE_CHOICE:
|
|
role_list.append({
|
|
'id': role[0],
|
|
'name': role[1]
|
|
})
|
|
return Response(role_list)
|
|
|
|
|
|
class Login(generics.GenericAPIView):
|
|
"""
|
|
登陆
|
|
"""
|
|
serializer_class = serializers.LoginSerializer
|
|
|
|
def post(self, request):
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
data = serializer.validated_data
|
|
user = auth.authenticate(username=data.get('username'), password=data.get("password"))
|
|
if user:
|
|
if not user.is_active:
|
|
raise ValidationError('您的账户未激活或被关闭,请检查邮箱或者联系管理员')
|
|
else:
|
|
auth.login(request, user)
|
|
return Response(serializers.UserSerializer(user).data)
|
|
else:
|
|
raise ValidationError('用户名不存在或密码不正确')
|
|
|
|
|
|
class Logout(generics.GenericAPIView):
|
|
"""
|
|
注销
|
|
"""
|
|
permission_classes = (permissions.IsAuthenticated,)
|
|
|
|
def get(self, request):
|
|
auth.logout(request)
|
|
return Response("")
|
|
|
|
|
|
class GetInfo(generics.GenericAPIView):
|
|
"""
|
|
获得当前用户信息
|
|
"""
|
|
serializer_class = serializers.UserSerializer
|
|
permission_classes = (permissions.IsAuthenticated,)
|
|
|
|
def get(self, request):
|
|
s = self.get_serializer(request.user)
|
|
return Response(s.data)
|
|
|
|
|
|
class ResetPassword(generics.GenericAPIView):
|
|
"""
|
|
重置密码
|
|
"""
|
|
serializer_class = Serializer
|
|
permission_classes = (permissions.IsAuthenticated,)
|
|
|
|
def post(self, request):
|
|
new_password = request.data.get('new_password')
|
|
if new_password:
|
|
request.user.set_password(new_password)
|
|
request.user.save()
|
|
auth.logout(request)
|
|
else:
|
|
raise ValidationError('新密码不正确')
|
|
return Response("")
|
|
|
|
|
|
class CheckUsername(views.APIView):
|
|
"""
|
|
检查username是否重复
|
|
"""
|
|
|
|
def get(self, request):
|
|
username = request.query_params.get('username')
|
|
if username:
|
|
return Response(models.User.objects.filter(username=username).exists())
|
|
else:
|
|
raise ValidationError("Did not get username.")
|
|
|
|
|
|
class Avatar(views.APIView):
|
|
"""
|
|
获得更新用户头像
|
|
"""
|
|
permission_classes = (permissions.IsAuthenticated,)
|
|
|
|
def get(self, request):
|
|
avatar = request.user.avatar
|
|
return Response({
|
|
'id': avatar.id if avatar else None,
|
|
'url': avatar.get_url() if avatar else None
|
|
})
|
|
|
|
def post(self, request):
|
|
file_id = request.data.get('id')
|
|
file = get_object_or_404(UploadFile, id=file_id)
|
|
user = request.user
|
|
user.avatar = file
|
|
user.save()
|
|
return Response(serializers.UserSerializer(user).data)
|