카테고리 없음
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()