프로젝트 user 부분 view.py

권수민·2023년 10월 24일
0
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework_simplejwt.views import TokenObtainPairView
from user.models import User
from user.serializers import UserSerializer, LoginSerializer, PasswordSerializer
from rest_framework.response import Response
from rest_framework import status, permissions
from user.common_utils import lets_check_password

class RegisterView(APIView):
    def post(self, request):
        """사용자 정보를 받아 회원가입 합니다."""
        serializer = UserSerializer(
            data=request.data, context={"profile_img": request.FILES}
        )
        print(request.FILES)
        if serializer.is_valid():
            serializer.save()
            return Response({"message": "회원가입 성공"}, status=status.HTTP_201_CREATED)
        else:
            return Response(
                {"message": serializer.errors}, status=status.HTTP_400_BAD_REQUEST
            )


class EmailCheckView(APIView):
    def post(self, request):
        """이메일 중복 검사를 위한 클래스 뷰입니다."""
        email = User.objects.filter(email=request.data["email"])
        # print(request.data['email'])
        # print(email)
        if email:
            return Response(
                {"message": "해당 이메일은 이미 사용 중입니다."}, status=status.HTTP_409_CONFLICT
            )
        else:
            return Response({"message": "해당 이메일은 사용 가능합니다."}, status=status.HTTP_200_OK)


class NicknameCheckView(APIView):
    def post(self, request):
        """닉네임 중복 검사를 위한 클래스 뷰입니다."""
        nickname = User.objects.filter(nickname=request.data["nickname"])
        # print(request.data['nickname'])
        # print(nickname)
        if nickname:
            return Response(
                {"message": "해당 닉네임은 이미 사용 중입니다."}, status=status.HTTP_409_CONFLICT
            )
        else:
            return Response({"message": "해당 닉네임은 사용 가능합니다."}, status=status.HTTP_200_OK)

"""common.utils에다가 빼놓았습니다."""
# class PasswordCheckView(APIView):
#     def post(self, request, user_id):
#         user = get_object_or_404(User, id=user_id)
#         if request.data["password"] is None:
#             return Response(
#                 {"message": "입력된값이 없습니다."}, status=status.HTTP_404_NOT_FOUND
#             )
#         if user.check_password(request.data["password"]):
#             message = f"반갑습니다.{request.user.nickname}님"
#             return Response({"message": message}, status=status.HTTP_200_OK)
#         else:
#             return Response(
#                 {"message": "입력된값이 일치하지 않습니다."}, status=status.HTTP_409_CONFLICT
#             )


class LoginView(TokenObtainPairView):
    """
    사용자 정보를 받아 로그인 합니다.
    DRF의 JWT 토큰 인증 로그인 방식에 기본 제공된는 클래스 뷰를 커스터마이징하여 재정의합니다.
    """

    serializer_class = LoginSerializer


class UserInfoView(APIView):
    permission_classes = [permissions.IsAuthenticated]
    "비밀번호 확인해서 수정페이지 access"
    def post(self,request,user_id):
        return lets_check_password(request,user_id)
        
    
    def get_user(self, user_id):
        return get_object_or_404(User, id=user_id)

    def get(self, request, user_id):
        """사용자의 회원 정보를 보여줍니다."""
        serializer = UserSerializer(self.get_user(user_id))
        return Response(serializer.data, status=status.HTTP_200_OK)

    def patch(self, request, user_id): 
        """사용자의 정보를 받아 회원 정보를 수정합니다."""
        serializer = UserSerializer(
            self.get_user(user_id),
            data=request.data,
            context={"profile_img": request.FILES, "user_id": user_id},
            partial=True,
        )
        if serializer.is_valid():
            serializer.save()
            print(serializer.data)
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(
                {"message": "회원정보를 수정할 수 없습니다.", "errors": serializer.errors},
                status=status.HTTP_400_BAD_REQUEST,
            )
            
    """밑에 클라스 주석시켜놓은걸 빼서 가져왔습니다. 
    위에 patch가이 있어 put으로하고 partial=True지정해줬는데
    patch랑 다를바 없어서 언제 put과 patch그냥 아무거나 사용해도되나요?
    위에 patch에 비번도 같이 한번에 보내서 바꿔주고 싶었는데 unique=True속성때매 
    같이 그 필드 인풋값을 보내주라고 떠가지고 따로 put patch로 넣어줬습니다. 한 클라스안에 """         
    def put(self, request, user_id):
        """사용자의 비밀번호만을 수정합니다."""
        serializer = PasswordSerializer(
            self.get_user(user_id),
            context={"user_id": user_id},
            data=request.data,
            partial=True,
        )
        print(f'put에서: {user_id}')
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(
                {"message": "비밀번호를 수정할수없습니다.", "errors": serializer.errors},
                status=status.HTTP_400_BAD_REQUEST,
            )


# class UserPasswordInfoView(APIView):
#     def patch(self, request, user_id):
#         """사용자의 비밀번호를 수정합니다."""
#         serializer = PasswordSerializer(
#             self.get_user(user_id),
#             context={"user_id": user_id},
#             data=request.data,
#             partial=True,
#         )
#         if serializer.is_valid():
#             serializer.save()
#             return Response(serializer.data, status=status.HTTP_200_OK)
#         else:
#             return Response(
#                 {"message": "비밀번호를 수정할수없습니다.", "errors": serializer.errors},
#                 status=status.HTTP_400_BAD_REQUEST,
#             )
profile
초보개발자

0개의 댓글