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

48 lines
1.3 KiB
Python
Raw Normal View History

2021-12-28 23:33:50 +01:00
from datetime import datetime
2021-12-31 12:08:03 +01:00
from typing import Any, Iterable
2021-12-28 23:33:50 +01:00
2020-08-16 19:24:31 +02:00
from django.contrib.syndication.views import Feed
2021-12-28 23:33:50 +01:00
from django.db.models import QuerySet
2021-12-31 12:08:03 +01:00
from django.http import HttpRequest
2020-08-16 19:24:31 +02:00
2021-03-04 18:48:48 +01:00
from articles.models import Article, Tag
2020-08-16 19:24:31 +02:00
from blog import settings
2021-12-28 23:33:50 +01:00
class BaseFeed(Feed):
2020-12-03 21:34:40 +01:00
FEED_LIMIT = 15
2020-08-16 19:24:31 +02:00
description = settings.BLOG["description"]
def item_description(self, item: Article) -> str:
2021-12-28 23:33:50 +01:00
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(
2020-08-16 19:24:31 +02:00
"-published_at"
2021-03-04 18:48:48 +01:00
)
2020-08-16 19:24:31 +02:00
2021-12-28 23:33:50 +01:00
class CompleteFeed(BaseFeed):
title = settings.BLOG["title"]
link = settings.BLOG["base_url"]
2020-08-16 19:24:31 +02:00
2021-12-28 23:33:50 +01:00
def items(self) -> Iterable[Article]:
return self._get_queryset()[: self.FEED_LIMIT]
2021-03-04 18:48:48 +01:00
2021-12-28 23:33:50 +01:00
class TagFeed(BaseFeed):
2021-12-31 12:08:03 +01:00
def get_object(self, request: HttpRequest, *args: Any, **kwargs: Any) -> Tag:
2021-03-04 18:48:48 +01:00
return Tag.objects.get(slug=kwargs.get("slug"))
2021-12-28 23:33:50 +01:00
def title(self, tag: Tag) -> str:
2021-03-04 19:33:43 +01:00
return tag.get_feed_title()
2021-12-28 23:33:50 +01:00
def link(self, tag: Tag) -> str:
2021-03-04 19:33:43 +01:00
return tag.get_absolute_url()
2021-12-28 23:33:50 +01:00
def items(self, tag: Tag) -> Iterable[Article]:
return self._get_queryset().filter(tags=tag)[: self.FEED_LIMIT]