BookingService/user/views.py

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)