Coverage for website/views/PostCreateView.py: 79%

48 statements  

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

1from django.contrib import messages 

2from django.contrib.auth.decorators import login_required 

3from django.shortcuts import redirect, render 

4from django.utils import timezone 

5from django.views.decorators.clickjacking import xframe_options_exempt 

6 

7from website.forms.PostForm import PostForm 

8from website.models.AuthorModel import Author 

9from website.models.PostModel import Post 

10 

11 

12@xframe_options_exempt 

13@login_required 

14def edit_post(request, url_slug=None): 

15 """Unified view for editing an existing blog post or creating a new one""" 

16 post = None 

17 is_creating = url_slug is None 

18 author = None 

19 

20 if not is_creating: 

21 try: 

22 post = Post.objects.get(url_slug=url_slug) 

23 except Post.DoesNotExist: 

24 messages.error(request, "Post not found.") 

25 return redirect("home") 

26 

27 # Check if the user is the author of the post 

28 if post.author.user != request.user: 

29 messages.error(request, "You do not have permission to edit this post.") 

30 return redirect("post_detail", url_slug=post.url_slug) 

31 else: 

32 # Check if the user has an author profile for creating posts 

33 try: 

34 author = Author.objects.get(user=request.user) 

35 except Author.DoesNotExist: 

36 messages.error(request, "You need an author profile to create posts.") 

37 return redirect("home") 

38 

39 if request.method == "POST": 

40 if is_creating: 

41 form = PostForm(request.POST) 

42 if form.is_valid(): 

43 # Create post but don't save to DB yet 

44 new_post = form.save(commit=False) 

45 # Set additional fields 

46 new_post.author = author 

47 new_post.published_date = timezone.now() 

48 new_post.updated_date = timezone.now() 

49 # Save to DB 

50 new_post.save() 

51 messages.success( 

52 request, "Your blog post has been created successfully!" 

53 ) 

54 return redirect("post_detail", url_slug=new_post.url_slug) 

55 else: 

56 form = PostForm(request.POST, instance=post) 

57 if form.is_valid(): 

58 # Update the post 

59 updated_post = form.save(commit=False) 

60 updated_post.updated_date = timezone.now() 

61 updated_post.save() 

62 messages.success( 

63 request, "Your blog post has been updated successfully!" 

64 ) 

65 return redirect("post_detail", url_slug=updated_post.url_slug) 

66 else: 

67 form = PostForm(instance=post) if post else PostForm() 

68 

69 return render( 

70 request, 

71 "post/edit_post.html", 

72 {"form": form, "post": post, "is_creating": is_creating}, 

73 )