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
« 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
6from website.models import ACADEMIC_LEVEL, SOCIAL_MEDIA
7from website.models.PostModel import Post
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)
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 )
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 )