Implements Issue #35 with category snippets, article category routing, category-aware templates, and category RSS feeds with tests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
from django.conf import settings
|
|
from django.contrib.syndication.views import Feed
|
|
from django.shortcuts import get_object_or_404
|
|
from taggit.models import Tag
|
|
|
|
from apps.blog.models import ArticlePage, Category
|
|
|
|
|
|
class AllArticlesFeed(Feed):
|
|
title = "No Hype AI"
|
|
link = "/articles/"
|
|
description = "Honest AI coding tool reviews for developers."
|
|
|
|
def get_object(self, request):
|
|
self.request = request
|
|
return None
|
|
|
|
def items(self):
|
|
return ArticlePage.objects.live().order_by("-first_published_at")[:20]
|
|
|
|
def item_title(self, item: ArticlePage):
|
|
return item.title
|
|
|
|
def item_description(self, item: ArticlePage):
|
|
return item.summary
|
|
|
|
def item_pubdate(self, item: ArticlePage):
|
|
return item.first_published_at
|
|
|
|
def item_author_name(self, item: ArticlePage):
|
|
return item.author.name
|
|
|
|
def item_link(self, item: ArticlePage):
|
|
if hasattr(self, "request") and self.request is not None:
|
|
full_url = item.get_full_url(self.request)
|
|
if full_url:
|
|
return full_url
|
|
return f"{settings.WAGTAILADMIN_BASE_URL.rstrip('/')}{item.url}"
|
|
|
|
|
|
class TagArticlesFeed(AllArticlesFeed):
|
|
def get_object(self, request, tag_slug: str):
|
|
self.request = request
|
|
return get_object_or_404(Tag, slug=tag_slug)
|
|
|
|
def title(self, obj):
|
|
return f"No Hype AI — {obj.name}"
|
|
|
|
def items(self, obj):
|
|
return ArticlePage.objects.live().filter(tags=obj).order_by("-first_published_at")[:20]
|
|
|
|
|
|
class CategoryArticlesFeed(AllArticlesFeed):
|
|
def get_object(self, request, category_slug: str):
|
|
self.request = request
|
|
return get_object_or_404(Category, slug=category_slug)
|
|
|
|
def title(self, obj):
|
|
return f"No Hype AI — {obj.name}"
|
|
|
|
def items(self, obj):
|
|
return ArticlePage.objects.live().filter(category=obj).order_by("-first_published_at")[:20]
|