✨ Feat: [#41] 유저 마이페이지 기능 구현
This commit is contained in:
136
users/views.py
136
users/views.py
@@ -3,6 +3,7 @@ from django.conf import settings
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.viewsets import ReadOnlyModelViewSet
|
||||
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer, TokenRefreshSerializer
|
||||
from rest_framework_simplejwt.tokens import RefreshToken
|
||||
from rest_framework_simplejwt.exceptions import TokenError, InvalidToken
|
||||
@@ -16,11 +17,18 @@ from django.db.models import Case, When, Value, IntegerField, Q
|
||||
|
||||
from .models import *
|
||||
from .serializers import *
|
||||
from .services import *
|
||||
|
||||
from projects.serializers import *
|
||||
from portfolios.serializers import *
|
||||
|
||||
from django.db import transaction
|
||||
|
||||
|
||||
class RefreshAPIView(APIView):
|
||||
permission_classes = [AllowAny]
|
||||
# access token 재발급
|
||||
@transaction.atomic
|
||||
def post(self, request):
|
||||
refresh = request.COOKIES.get("refresh")
|
||||
if not refresh:
|
||||
@@ -41,6 +49,7 @@ class RefreshAPIView(APIView):
|
||||
class JoinAPIView(APIView):
|
||||
permission_classes = [AllowAny]
|
||||
# 회원가입
|
||||
@transaction.atomic
|
||||
def post(self, request):
|
||||
serializer = JoinSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
@@ -52,6 +61,7 @@ class JoinAPIView(APIView):
|
||||
class LoginAPIView(APIView):
|
||||
permission_classes = [AllowAny]
|
||||
# 로그인
|
||||
@transaction.atomic
|
||||
def post(self, request):
|
||||
email=request.data.get("email", None)
|
||||
password=request.data.get("password", None)
|
||||
@@ -122,6 +132,7 @@ class SetPortofolioRequiredInfoAPIView(APIView):
|
||||
else:
|
||||
return Response({"message": "can use this url"}, status=status.HTTP_200_OK)
|
||||
|
||||
@transaction.atomic
|
||||
def patch(self, request):
|
||||
user = request.user
|
||||
serializer = SetPortofolioRequiredInfoSerializer(user, data=request.data)
|
||||
@@ -131,3 +142,128 @@ class SetPortofolioRequiredInfoAPIView(APIView):
|
||||
user.save()
|
||||
return Response({"message": "updated successfully"}, status=status.HTTP_202_ACCEPTED)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
|
||||
# 마이페이지 관련
|
||||
class MyPageProfileAPIView(APIView):
|
||||
|
||||
# 프로필 조회(안 읽은 알림 수)
|
||||
def get(self, request, nickname):
|
||||
target_user = get_object_or_404(User, nickname=nickname)
|
||||
user = request.user
|
||||
serializer = UserProfileSerializer(target_user)
|
||||
data = serializer.data
|
||||
data['represent_portfolio_id'] = UserToPortfolioService.get_represent_portfolio(target_user)
|
||||
data['new_notification_count'] = UserToNotificationService.get_new_notification_count(user)
|
||||
return Response(data, status=status.HTTP_200_OK)
|
||||
|
||||
# 프로필 수정
|
||||
@transaction.atomic
|
||||
def patch(self, request, nickname):
|
||||
target_user = get_object_or_404(User, nickname=nickname)
|
||||
user = request.user
|
||||
if user == target_user:
|
||||
serializer = UserProfileSerializer(user, request.data, partial=True)
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
data = serializer.data
|
||||
data['represent_portfolio_id'] = UserToPortfolioService.get_represent_portfolio(target_user)
|
||||
data['new_notification_count'] = UserToNotificationService.get_new_notification_count(user)
|
||||
return Response(data, status=status.HTTP_200_OK)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
else:
|
||||
return Response({"message": "Not account owner"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
class MyPageWorkListAPIView(APIView):
|
||||
|
||||
# 포폴, 플젝, 작업중, 스크랩 조회(안 읽은 알림 수)
|
||||
def get(self, request, nickname):
|
||||
target_user = get_object_or_404(User, nickname=nickname)
|
||||
user = request.user
|
||||
retreive_type = request.query_params.get('type')
|
||||
data = {}
|
||||
if retreive_type == 'portfolio':
|
||||
portfolios = UserToPortfolioService.get_published_portfolio(target_user)
|
||||
serializer = PortfolioListViewSerializer(portfolios, many=True)
|
||||
data = {
|
||||
"portfolios": serializer.data
|
||||
}
|
||||
elif retreive_type == 'project':
|
||||
solo_projects = UserToProjectService.get_published_solo_project(target_user)
|
||||
team_projects = UserToProjectService.get_published_team_project(target_user)
|
||||
sp_serializer = ProjectListViewSerializer(solo_projects, many=True)
|
||||
tp_serializer = ProjectListViewSerializer(team_projects, many=True)
|
||||
data = {
|
||||
"solo_projects": sp_serializer.data,
|
||||
"team_projects": tp_serializer.data,
|
||||
}
|
||||
elif retreive_type == 'working':
|
||||
if user != target_user:
|
||||
return Response({"message": "Not account owner"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
portfolios = UserToPortfolioService.get_unpublished_portfolio(target_user)
|
||||
solo_projects = UserToProjectService.get_unpublished_solo_project(target_user)
|
||||
team_projects = UserToProjectService.get_unpublished_team_project(target_user)
|
||||
po_serializer = PortfolioListViewSerializer(portfolios, many=True)
|
||||
sp_serializer = ProjectListViewSerializer(solo_projects, many=True)
|
||||
tp_serializer = ProjectListViewSerializer(team_projects, many=True)
|
||||
data = {
|
||||
"portfolios": po_serializer.data,
|
||||
"solo_projects": sp_serializer.data,
|
||||
"team_projects": tp_serializer.data,
|
||||
}
|
||||
elif retreive_type == 'scrap':
|
||||
if user != target_user:
|
||||
return Response({"message": "Not account owner"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
portfolios = UserToPortfolioService.get_scrap_portfolio(target_user)
|
||||
po_serializer = PortfolioListViewSerializer(portfolios, many=True)
|
||||
projects = UserToProjectService.get_scrap_project(target_user)
|
||||
pr_serializer = ProjectListViewSerializer(projects, many=True)
|
||||
data = {
|
||||
"portfolios": po_serializer.data,
|
||||
"projects": pr_serializer.data,
|
||||
}
|
||||
else:
|
||||
return Response({"message": "not allowed retreive_type"}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
data['new_notification_count'] = UserToNotificationService.get_new_notification_count(user)
|
||||
return Response(data, status=status.HTTP_200_OK)
|
||||
|
||||
class MyPageMemberInfoAPIView(APIView):
|
||||
|
||||
# 내 정보 조회(안 읽은 알림 수)
|
||||
def get(self, request):
|
||||
user = request.user
|
||||
serializer = UserMemberInfoSerializer(user)
|
||||
data = serializer.data
|
||||
data['new_notification_count'] = UserToNotificationService.get_new_notification_count(user)
|
||||
return Response(data, status=status.HTTP_200_OK)
|
||||
|
||||
# 내 정보 수정
|
||||
@transaction.atomic
|
||||
def patch(self, request):
|
||||
user = request.user
|
||||
serializer = UserMemberInfoSerializer(user, request.data, partial=True)
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
class NotificationReadViewSet(ReadOnlyModelViewSet):
|
||||
serializer_class = NotificationSerializer
|
||||
|
||||
# 30일 이전 알림만 가져옴
|
||||
def get_queryset(self):
|
||||
return UserToNotificationService.get_all_notification(self.request.user)
|
||||
|
||||
def list(self, request, *args, **kwargs):
|
||||
queryset = self.get_queryset()
|
||||
serializer = self.get_serializer(queryset, many=True)
|
||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
def retrieve(self, request, *args, **kwargs):
|
||||
instance = self.get_object()
|
||||
instance.is_read = True
|
||||
instance.save()
|
||||
serializer = self.get_serializer(instance)
|
||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||
Reference in New Issue
Block a user