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
« 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
7from website.forms.PostForm import PostForm
8from website.models.AuthorModel import Author
9from website.models.PostModel import Post
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
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")
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")
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()
69 return render(
70 request,
71 "post/edit_post.html",
72 {"form": form, "post": post, "is_creating": is_creating},
73 )