카테고리 없음

2023-06-29 신고기능 #3

jung1911 2023. 6. 29. 22:24

이제 모델과 url 준비는 끝났다.

view에서 어떻게 표현해서 할 건지 생각해서 구현했다.

 

1. 처음으로 나 자신을 신고할 수 없게 구현을 했다.(상태 코드 403 권한이 없다)

class ReportView(APIView):
    def post(self, request, user_id):
        reporter = request.user
        reported_user = get_object_or_404(User, id=user_id)

        if reporter == reported_user:
            return Response('자신을 신고할 수 없습니다.', status=status.HTTP_403_FORBIDDEN)

 

 

2. 처음에 말 했던 대로 유저는 한 명의 유저에게 한 번만 신고가능

https://jjung23.tistory.com/106

# 한 번에 한 명의 유저만 신고 가능
        if Report.objects.filter(user=reporter, reported_user=reported_user).exists():
            return Response('이미 신고한 유저입니다.', status=status.HTTP_400_BAD_REQUEST)

 

 

3. 이제 모델에서 지우고 다시하고 반복하던 이유가 횟수가 잘 안됐기 때문에 그랬다.

객체를 생성(신고할 유저 당할 유저)

  # Report 객체 생성
        report = Report(user=reporter, reported_user=reported_user,)
        report.save()

        # 신고된 유저의 신고 횟수 증가
        reported_user.report_count += 1
        reported_user.save()

 

 

4.횟수를 초과시 정지 유저 비활성화 (테스트를 위해서 2번이상 당할 시 정지)

  # k번 이상 신고된 유저인 경우 정지
        if reported_user.report_count >= 2:
            # 신고당한 유저 정지 처리
            reported_user.is_active = False
            reported_user.save()

 

 

5.정지를 당하면 유저 비활성화, 댓글,게시글 삭제

# 관련된 신고 내역 삭제
            Report.objects.filter(reported_user=reported_user).delete()
            Article.objects.filter(user=reported_user).delete()
            Comment.objects.filter(user=reported_user).delete()

            # 정지된 유저에게 메일 전송
            subject = "[Nurriggun] 계정 정지 안내"
            message = f"안녕하세요, {reported_user.nickname}님!\n\n계정이 정지되었습니다.\n문의 사항이 있으신 경우, 홈페이지의 '문의하기' 채팅을 이용해 주세요."
            to_email = reported_user.email

            email = EmailThread(subject, message, to_email)
            email.start()

            return Response('정지된 악질 유저입니다.', status=status.HTTP_200_OK)
        
        return Response('신고가 접수되었습니다.', status=status.HTTP_200_OK)

 

6. 이제 마무리하고 오류가 있는지 확인해보니 ... 알림메세지 및 문구가 2~3초후에 발생 해결을 위해 비동기식 Thead 사용 동기식으로 사용 했을땐 한참 뒤에 이메일이 전송 되었지만 비동기식으로 코드를 변경하고 메세지및 문구가  90% 개선

# 신고 알림
<views.py>
class EmailThread(threading.Thread):
    def __init__(self, subject, message, to_email):
        self.subject = subject
        self.message = message
        self.to_email = to_email
        threading.Thread.__init__(self)

    def run(self):
        email = EmailMessage(
            subject=self.subject,
            body=self.message,
            to=[self.to_email],
            from_email=settings.DEFAULT_FROM_EMAIL,
        )
        email.send()

 

전 문구가 늦게 뜨는걸 후 90% 성능 개선
이메일 정상적으로 전송 완료 / 전 문구가 2~3초후에 발생 후 성능 90% 개선