This repository has been archived on 2023-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
python-blog/src/articles/views/feeds.py
2021-12-31 12:08:35 +01:00

48 lines
1.3 KiB
Python

from datetime import datetime
from typing import Any, Iterable
from django.contrib.syndication.views import Feed
from django.db.models import QuerySet
from django.http import HttpRequest
from articles.models import Article, Tag
from blog import settings
class BaseFeed(Feed):
FEED_LIMIT = 15
description = settings.BLOG["description"]
def item_description(self, item: Article) -> str:
return item.get_formatted_content
def item_pubdate(self, item: Article) -> datetime | None:
return item.published_at
def _get_queryset(self) -> QuerySet[Article]:
return Article.objects.filter(status=Article.PUBLISHED).order_by(
"-published_at"
)
class CompleteFeed(BaseFeed):
title = settings.BLOG["title"]
link = settings.BLOG["base_url"]
def items(self) -> Iterable[Article]:
return self._get_queryset()[: self.FEED_LIMIT]
class TagFeed(BaseFeed):
def get_object(self, request: HttpRequest, *args: Any, **kwargs: Any) -> Tag:
return Tag.objects.get(slug=kwargs.get("slug"))
def title(self, tag: Tag) -> str:
return tag.get_feed_title()
def link(self, tag: Tag) -> str:
return tag.get_absolute_url()
def items(self, tag: Tag) -> Iterable[Article]:
return self._get_queryset().filter(tags=tag)[: self.FEED_LIMIT]