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)