Coverage for website/views/PostView.py: 68%

47 statements  

« prev     ^ index     » next       coverage.py v7.5.0, created at 2025-09-13 15:29 -0300

1from django.http import HttpResponseForbidden, JsonResponse 

2from django.shortcuts import get_object_or_404, render 

3from django.views.decorators.clickjacking import xframe_options_exempt 

4from django.views.decorators.http import require_POST 

5 

6from website.models import ACADEMIC_LEVEL, SOCIAL_MEDIA 

7from website.models.PostModel import Post 

8 

9 

10@xframe_options_exempt 

11def post_detail(request, url_slug): 

12 # Get the post by its URL slug or return 404 if not found 

13 post = get_object_or_404(Post, url_slug=url_slug) 

14 context = {"post": post} 

15 context["author_connected"] = request.user == post.author.user 

16 context["graduations_level"] = ACADEMIC_LEVEL 

17 context["social_media_index"] = SOCIAL_MEDIA 

18 # whether the current authenticated user already liked/loved this post 

19 if request.user.is_authenticated: 

20 context["user_liked"] = post.likes.filter(pk=request.user.pk).exists() 

21 context["user_loved"] = post.loves.filter(pk=request.user.pk).exists() 

22 else: 

23 context["user_liked"] = False 

24 context["user_loved"] = False 

25 return render(request, "post/post_detail.html", context) 

26 

27 

28@require_POST 

29def toggle_like(request, url_slug): 

30 if not request.user.is_authenticated: 

31 return HttpResponseForbidden("Authentication required") 

32 post = get_object_or_404(Post, url_slug=url_slug) 

33 user = request.user 

34 if user in post.likes.all(): 

35 post.likes.remove(user) 

36 liked = False 

37 else: 

38 post.likes.add(user) 

39 liked = True 

40 # ensure user can't both like and love simultaneously (optional) 

41 if user in post.loves.all(): 

42 post.loves.remove(user) 

43 return JsonResponse( 

44 { 

45 "liked": liked, 

46 "loved": post.loves.filter(pk=user.pk).exists(), 

47 "likes_count": post.likes.count(), 

48 "loves_count": post.loves.count(), 

49 } 

50 ) 

51 

52 

53@require_POST 

54def toggle_love(request, url_slug): 

55 if not request.user.is_authenticated: 

56 return HttpResponseForbidden("Authentication required") 

57 post = get_object_or_404(Post, url_slug=url_slug) 

58 user = request.user 

59 if user in post.loves.all(): 

60 post.loves.remove(user) 

61 loved = False 

62 else: 

63 post.loves.add(user) 

64 loved = True 

65 if user in post.likes.all(): 

66 post.likes.remove(user) 

67 return JsonResponse( 

68 { 

69 "loved": loved, 

70 "liked": post.likes.filter(pk=user.pk).exists(), 

71 "loves_count": post.loves.count(), 

72 "likes_count": post.likes.count(), 

73 } 

74 )