Skip to content

Commit

Permalink
thinner views, fatter models
Browse files Browse the repository at this point in the history
  • Loading branch information
pj-simpson committed Dec 27, 2020
1 parent d9711e8 commit ec3faa4
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 36 deletions.
20 changes: 20 additions & 0 deletions blog/migrations/0006_auto_20201227_2244.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 3.0.7 on 2020-12-27 22:44

from django.db import migrations
import django.db.models.manager


class Migration(migrations.Migration):

dependencies = [
('blog', '0005_auto_20201222_1930'),
]

operations = [
migrations.AlterModelManagers(
name='post',
managers=[
('live_posts', django.db.models.manager.Manager()),
],
),
]
18 changes: 18 additions & 0 deletions blog/migrations/0007_auto_20201227_2254.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.0.7 on 2020-12-27 22:54

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('blog', '0006_auto_20201227_2244'),
]

operations = [
migrations.AlterModelManagers(
name='post',
managers=[
],
),
]
19 changes: 18 additions & 1 deletion blog/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
from django.utils.translation import ugettext_lazy as _
from taggit.managers import TaggableManager
from taggit.models import GenericUUIDTaggedItemBase, TaggedItemBase
from django.db.models import Count



class UUIDTaggedItem(GenericUUIDTaggedItemBase, TaggedItemBase):
Expand All @@ -18,6 +20,14 @@ class Meta:
verbose_name = _("Tag")
verbose_name_plural = _("Tags")

class DraftPostsManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(draft=True).order_by("-created")

class LivePostsManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(draft=False).order_by("-created")


class Post(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
Expand All @@ -29,9 +39,16 @@ class Post(models.Model):
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
tags = TaggableManager(through=UUIDTaggedItem)
objects = models.Manager()
live_posts = LivePostsManager()
draft_posts = DraftPostsManager()

def __str__(self):
return self.title
return self.title

def get_absolute_url(self):
return reverse("post_detail", args=[str(self.id)])

def get_tag_ids(self):
return self.tags.values_list("id", flat=True)

69 changes: 34 additions & 35 deletions blog/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,6 @@ def about_page_view(request):
def home_page_view(request):
return render(request, "home.html")


@user_passes_test(lambda u: u.is_superuser)
def post_create_view(request):

if request.method == "POST":
new_post_form = PostForm(request.POST)
if new_post_form.is_valid():
tagslist = new_post_form.cleaned_data["tags"]
new_post = new_post_form.save(commit=False)
user = get_user_model()
new_post.author = user.objects.get(username=request.user.username)
new_post.tags.add(*tagslist)
new_post.save()
return redirect("post_list")
else:
new_post_form = PostForm()
return TemplateResponse(request, "blog/post_form.html", {"form": new_post_form})


def _post_list_displayer(request, posts, context=None):

if context is None:
Expand All @@ -51,14 +32,14 @@ def _post_list_displayer(request, posts, context=None):

def post_list_view(request):

posts = Post.objects.all().filter(draft=False).order_by("-created")
posts = Post.live_posts.all()
return _post_list_displayer(request, posts)


def post_list_view_by_tag(request, tag_slug: str):

tag = get_object_or_404(Tag, slug=tag_slug.lower())
posts = Post.objects.all().order_by("-created").filter(tags__in=[tag])
posts = Post.live_posts.filter(tags__in=[tag])
context = {"tag": tag_slug}

return _post_list_displayer(request, posts, context)
Expand All @@ -67,39 +48,57 @@ def post_list_view_by_tag(request, tag_slug: str):
@user_passes_test(lambda u: u.is_superuser)
def drafts_list_view(request):

posts = Post.objects.all().filter(draft=True).order_by("-created")
posts = Post.draft_posts.all()
return _post_list_displayer(request, posts)


def _similar_post_retriver(post,tag_ids_list):
similar_posts = Post.objects.filter(tags__in=tag_ids_list).exclude(id=post.id)
return similar_posts.annotate(same_tags=Count("tags")).order_by(
"-same_tags", "-created"
)[:2]


def post_detail_view(request, pk: int):

post = get_object_or_404(Post, id=pk)

post_tags_ids = post.tags.values_list("id", flat=True)
similar_posts = Post.objects.filter(tags__in=post_tags_ids).exclude(id=pk)
similar_posts = similar_posts.annotate(same_tags=Count("tags")).order_by(
"-same_tags", "-created"
)[:2]
tags = post.get_tag_ids()
similar_posts = _similar_post_retriver(post,tags)

return TemplateResponse(
request, "blog/post_detail.html", {"post": post, "similar_posts": similar_posts}
)


def _post_form_process(form,request):
tagslist = form.cleaned_data["tags"]
new_post = form.save(commit=False)
user = get_user_model()
new_post.author = user.objects.get(username=request.user.username)
new_post.tags.add(*tagslist)
new_post.save()
return redirect("post_list")

@user_passes_test(lambda u: u.is_superuser)
def post_create_view(request):

if request.method == "POST":
new_post_form = PostForm(request.POST)
if new_post_form.is_valid():
return _post_form_process(new_post_form,request)
else:
new_post_form = PostForm()
return TemplateResponse(request, "blog/post_form.html", {"form": new_post_form})


@user_passes_test(lambda u: u.is_superuser)
def post_update_view(request, pk: int):
post = get_object_or_404(Post, pk=pk)

if request.method == "POST":
new_post_form = PostForm(request.POST, instance=post)
if new_post_form.is_valid():
tagslist = new_post_form.cleaned_data["tags"]
new_post = new_post_form.save(commit=False)
user = get_user_model()
new_post.author = user.objects.get(username=request.user.username)
new_post.tags.set(*tagslist)
new_post.save()
return redirect("post_list")
return _post_form_process(new_post_form,request)
else:
new_post_form = PostForm(instance=post)
return TemplateResponse(
Expand Down

0 comments on commit ec3faa4

Please sign in to comment.