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,
# )