Skip to content

Commit 73e0a8a

Browse files
Merge pull request #11 from RustamovAkrom/main
Main
2 parents e826529 + 83bb8a5 commit 73e0a8a

19 files changed

+257
-131
lines changed

apps/blog/choices.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.db.models import TextChoices
2+
3+
4+
class StatusChoice(TextChoices):
5+
DRAFT = 'df', 'Draft'
6+
PUBLISHED = 'pb', 'Published'

apps/blog/forms.py

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,56 +11,40 @@
1111
}
1212

1313

14-
class PostCreateForm(forms.ModelForm):
14+
class PostCreateUpdateForm(forms.ModelForm):
1515

1616
class Meta:
1717
model = Post
18-
fields = ("title", "content", "is_active")
18+
fields = ("title", "description", "content", "status")
1919

2020
widgets = {
2121
"title": forms.TextInput(
2222
attrs={
2323
"class": "form-control",
24+
"name": "title",
2425
"placeholder": "Enter you`r post title...",
2526
}
2627
),
27-
"content": forms.Textarea(
28+
"description": forms.Textarea(
2829
attrs={
2930
"class": "form-control",
30-
"placeholder": "Enter you`r post content...",
31+
"name": "description",
32+
"placeholder": "Enter you`r post description...",
3133
}
3234
),
33-
"is_active": forms.CheckboxInput(
34-
attrs={"name": "is_active", "class": "form-check-input"}
35-
),
36-
}
37-
38-
39-
class PostUpdateForm(forms.ModelForm):
40-
41-
class Meta:
42-
model = Post
43-
fields = ("title", "content", "is_active")
44-
45-
widgets = {
46-
"title": forms.TextInput(
47-
attrs={
48-
"name": "title",
49-
"class": "form-control",
50-
"placeholder": "Title....",
51-
},
52-
),
5335
"content": forms.Textarea(
5436
attrs={
55-
"name": "content",
56-
"cols": "40",
57-
"rows": "10",
5837
"class": "form-control",
59-
"placeholder": "Content....",
60-
},
38+
"name": "content",
39+
"placeholder": "Enter you`r post content...",
40+
}
6141
),
62-
"is_active": forms.CheckboxInput(
63-
attrs={"name": "is_active", "class": "form-check-input"}
42+
"status": forms.Select(
43+
attrs={
44+
"class": "form-select",
45+
"name": "status",
46+
"placeholder": "Enter you`r post status...",
47+
}
6448
),
6549
}
6650

apps/blog/managers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from django.db import models
2+
from .choices import StatusChoice
3+
4+
5+
class PublishedManager(models.Manager):
6+
def get_queryset(self) -> models.QuerySet:
7+
return (
8+
super().get_queryset().filter(status=StatusChoice.PUBLISHED, is_active=True)
9+
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 5.1.1 on 2024-11-13 09:52
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('blog', '0001_initial'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='post',
15+
name='description',
16+
field=models.CharField(default=1, max_length=300, verbose_name='description'),
17+
preserve_default=False,
18+
),
19+
migrations.AddField(
20+
model_name='post',
21+
name='status',
22+
field=models.CharField(choices=[('df', 'Draft'), ('pb', 'Published')], default='df', max_length=2, verbose_name='status'),
23+
),
24+
]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.1.1 on 2024-11-13 10:00
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('blog', '0002_post_description_post_status'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='post',
15+
name='description',
16+
field=models.CharField(blank=True, max_length=300, null=True, verbose_name='description'),
17+
),
18+
]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.1.1 on 2024-11-13 10:34
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('blog', '0003_alter_post_description'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='post',
15+
name='is_active',
16+
field=models.BooleanField(default=True, verbose_name='active'),
17+
),
18+
]

apps/blog/models.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,30 @@
44
from django.utils.text import slugify
55
from apps.shared.models import TimestempedAbstractModel
66
from apps.shared.utils import get_random_text
7+
from .managers import PublishedManager
8+
from .choices import StatusChoice
79

810

911
class Post(TimestempedAbstractModel):
12+
1013
title = models.CharField(_("title"), max_length=120, db_index=True)
1114
slug = models.SlugField(_("slug"), max_length=255, unique=True, db_index=True)
15+
status = models.CharField(
16+
_("status"),
17+
max_length=2,
18+
choices=StatusChoice.choices,
19+
default=StatusChoice.DRAFT.value
20+
)
21+
description = models.CharField(_("description"), max_length=300, blank=True, null=True)
1222
content = models.TextField(_("content"))
1323
publisher_at = models.DateField(_("publisher at"))
14-
is_active = models.BooleanField(_("active"), default=False)
24+
is_active = models.BooleanField(_("active"), default=True)
1525
author = models.ForeignKey("users.User", models.CASCADE, "posts", db_index=True)
1626
watching = models.BigIntegerField(_("watching"), default=0)
1727

28+
objects = models.Manager()
29+
published = PublishedManager()
30+
1831
def delete(self, *args, **kwargs):
1932
print(self.post_comments.all().delete())
2033
return super().delete(*args, **kwargs)

apps/blog/utils.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from django.db.models import QuerySet
2-
from django.core.paginator import Paginator, Page
2+
from django.core.paginator import Paginator, Page, EmptyPage, PageNotAnInteger
33

44
from .models import PostLike, PostDislike, Post, PostComment
55

@@ -23,7 +23,18 @@ def get_search_model_queryset(
2323

2424

2525
def get_pagination_obj(model_queryset: QuerySet, page: int = 1, size: int = 4) -> Page:
26-
return Paginator(model_queryset.order_by("id"), size).page(page)
26+
paginator = Paginator(model_queryset.order_by("id"), size)
27+
28+
try:
29+
page_obj = paginator.page(page)
30+
31+
except PageNotAnInteger:
32+
page_obj = paginator.page(1)
33+
34+
except EmptyPage:
35+
page_obj = paginator.page(paginator.num_pages)
36+
37+
return page_obj
2738

2839

2940
def set_post_like(user, slug) -> None:

apps/blog/views.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99

1010
from apps.users.models import User
1111
from .forms import (
12-
PostUpdateForm,
13-
PostCreateForm,
12+
PostCreateUpdateForm,
1413
SettingsUserForm,
1514
SettingsUserProfileForm,
1615
)
@@ -42,9 +41,9 @@ class HomePageView(TemplateView):
4241

4342
def get(self, request):
4443
if request.user is not None and request.user.is_authenticated:
45-
posts = Post.objects.exclude(author=request.user)
44+
posts = Post.published.exclude(author=request.user)
4645
else:
47-
posts = Post.objects.all()
46+
posts = Post.published.all()
4847

4948
search_query = request.GET.get("search_query", None)
5049
page = request.GET.get("page", 1)
@@ -74,6 +73,7 @@ class PostDetailPageView(View):
7473

7574
def get(self, request, slug):
7675
post = get_object_or_404(Post, slug=slug)
76+
7777
post_comments = post.post_comments.all().order_by("-created_at")
7878
post.watching += 1
7979
post.save()
@@ -88,17 +88,18 @@ class PostCreatePageView(LoginRequiredMixin, TemplateView):
8888
template_name = "blog/post_create.html"
8989

9090
def get(self, request):
91-
return render(request, "blog/post_create.html", {"form": PostCreateForm()})
91+
return render(request, "blog/post_create.html", {"form": PostCreateUpdateForm()})
9292

9393
def post(self, request):
94-
form = PostCreateForm(request.POST)
94+
form = PostCreateUpdateForm(request.POST)
9595

9696
if form.is_valid():
9797
cd = form.cleaned_data
9898
post = Post.objects.create(
9999
title=cd.get("title"),
100+
status=cd.get("status"),
101+
description=cd.get("description"),
100102
content=cd.get("content"),
101-
is_active=cd.get("is_active"),
102103
author=request.user,
103104
publisher_at=datetime.datetime.now().strftime("%Y-%m-%d"),
104105
)
@@ -122,7 +123,7 @@ def get(self, request):
122123
search_query_for_user_posts = request.GET.get(
123124
"search_query_for_user_posts", None
124125
)
125-
posts = Post.objects.filter(author=request.user)
126+
posts = Post.objects.filter(author=request.user, is_active=True)
126127

127128
if search_query_for_user_posts is not None:
128129
posts = get_search_model_queryset(posts, search_query_for_user_posts)
@@ -134,13 +135,14 @@ class PostUpdateView(LoginRequiredMixin, View):
134135
template_name = "blog/post_update.html"
135136

136137
def get(self, request, slug):
137-
post = get_object_or_404(Post, slug=slug)
138-
form = PostUpdateForm(instance=post)
138+
post = get_object_or_404(Post, slug=slug, is_active=True)
139+
140+
form = PostCreateUpdateForm(instance=post)
139141
return render(request, "blog/post_update.html", {"form": form, "post": post})
140142

141143
def post(self, request, slug):
142144
post = get_object_or_404(Post, slug=slug)
143-
form = PostUpdateForm(request.POST, instance=post)
145+
form = PostCreateUpdateForm(request.POST, instance=post)
144146
if form.is_valid():
145147
form.save()
146148
messages.success(request, "Post succsessfully updated")
@@ -156,8 +158,8 @@ class PostDeletePageView(LoginRequiredMixin, DeleteView):
156158

157159
def post(self, request, slug):
158160
post = get_object_or_404(Post, slug=slug)
159-
messages.success(request, "post successfully deleted")
160161
post.delete()
162+
messages.success(request, "post successfully deleted")
161163
return redirect("blog:user_posts")
162164

163165

@@ -214,7 +216,6 @@ def post_message(request, slug):
214216
return redirect(reverse("users:login"))
215217

216218
post_message_input = request.GET.get("post_message_input", None)
217-
print(post_message_input)
218219

219220
if post_message_input is not None:
220221
set_post_comment(request.user, slug, post_message_input)

apps/users/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class UserProfilePageView(View):
8484

8585
def get(self, request, username):
8686
user = get_object_or_404(User, username=username)
87-
posts = Post.objects.filter(author=user, is_active=True).all().order_by("id")
87+
posts = Post.published.filter(author=user).all().order_by("-created_at")
8888

8989
search_query = request.GET.get("search_query_for_user_profile", None)
9090

0 commit comments

Comments
 (0)