✨ Feat: [#41] 팀원 초대 수락/거절 로직 구현
This commit is contained in:
@@ -12,10 +12,12 @@ from rest_framework.generics import ListAPIView
|
|||||||
from .serializers import ProjectListViewSerializer, ProjectCreateSerializer, ProjectTeamSerializer
|
from .serializers import ProjectListViewSerializer, ProjectCreateSerializer, ProjectTeamSerializer
|
||||||
from .paginations import ProjectPagination
|
from .paginations import ProjectPagination
|
||||||
from .filters import ProjectFilter
|
from .filters import ProjectFilter
|
||||||
from .services import ProjectStateChangeService, ProjectBeforeRelCheckService
|
from .services import *
|
||||||
|
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
|
||||||
|
from notifications.services import *
|
||||||
|
|
||||||
|
|
||||||
class ProjectListView(ListAPIView):
|
class ProjectListView(ListAPIView):
|
||||||
queryset = Project.objects.filter(is_published=True).order_by('-created_at')
|
queryset = Project.objects.filter(is_published=True).order_by('-created_at')
|
||||||
@@ -29,6 +31,7 @@ class ProjectListView(ListAPIView):
|
|||||||
class ProjectCreateAPIView(APIView):
|
class ProjectCreateAPIView(APIView):
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
|
user = request.user
|
||||||
serializer = ProjectCreateSerializer(data=request.data, context={"request": request})
|
serializer = ProjectCreateSerializer(data=request.data, context={"request": request})
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
serializer.save()
|
serializer.save()
|
||||||
@@ -36,7 +39,7 @@ class ProjectCreateAPIView(APIView):
|
|||||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
class ProjectTeamManageAPIView(APIView):
|
class ProjectTeamManageAPIView(APIView):
|
||||||
# 팀원 초대
|
# 팀원 초대 및 알림
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def post(self, request, pk):
|
def post(self, request, pk):
|
||||||
user = request.user
|
user = request.user
|
||||||
@@ -47,11 +50,14 @@ class ProjectTeamManageAPIView(APIView):
|
|||||||
new_member = get_object_or_404(User, nickname=nickname)
|
new_member = get_object_or_404(User, nickname=nickname)
|
||||||
if ProjectTeamList.objects.filter(project=project, user=new_member).exists():
|
if ProjectTeamList.objects.filter(project=project, user=new_member).exists():
|
||||||
return Response({"message": "already team member"}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"message": "already team member"}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
serializer = ProjectTeamSerializer(data={'user':new_member.id, 'project':project.id})
|
new_notification = NotifiationService.create_notification(user=new_member, note_type=NotificationType.INVITE)
|
||||||
if serializer.is_valid():
|
ProjectInvitationService.create_project_invitation(
|
||||||
serializer.save()
|
project=project,
|
||||||
return Response({"message": "invite success"}, status=status.HTTP_200_OK)
|
from_user=user,
|
||||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
to_user=new_member,
|
||||||
|
notification=new_notification
|
||||||
|
)
|
||||||
|
return Response({"message": "invite success"}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
# 팀원 추방
|
# 팀원 추방
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
@@ -140,4 +146,27 @@ class ProjectChangeState(APIView):
|
|||||||
return Response({
|
return Response({
|
||||||
'message': f'{action_type} {"added" if add else "removed"}'
|
'message': f'{action_type} {"added" if add else "removed"}'
|
||||||
}, status=status.HTTP_200_OK)
|
}, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class ProjectInvitationAPIView(APIView):
|
||||||
|
# 팀원 초대 수락/거절
|
||||||
|
@transaction.atomic
|
||||||
|
def post(self, request):
|
||||||
|
accept = request.data['accept']
|
||||||
|
project_invitation = get_object_or_404(ProjectInvitation, id=request.data['project_invitation_id'])
|
||||||
|
new_member = project_invitation.to_user
|
||||||
|
project = project_invitation.project
|
||||||
|
if request.user != new_member:
|
||||||
|
return Response({"message": "Not account owner"}, status=status.HTTP_403_FORBIDDEN)
|
||||||
|
if project_invitation.status != InvitationStatus.PENDING:
|
||||||
|
return Response({"message": "already handled invitation"}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
if accept:
|
||||||
|
project_invitation.status = InvitationStatus.ACCEPTED
|
||||||
|
project_invitation.save()
|
||||||
|
serializer = ProjectTeamSerializer(data={'user':new_member.id, 'project':project.id})
|
||||||
|
if serializer.is_valid():
|
||||||
|
serializer.save()
|
||||||
|
return Response({"message": "invitation accepted"}, status=status.HTTP_200_OK)
|
||||||
|
else:
|
||||||
|
project_invitation.status = InvitationStatus.REJECTED
|
||||||
|
project_invitation.save()
|
||||||
|
return Response({"message": "invitation rejected"}, status=status.HTTP_200_OK)
|
||||||
Reference in New Issue
Block a user