2021-12-28 23:33:50 +01:00
|
|
|
from datetime import datetime
|
|
|
|
from typing import Iterable
|
|
|
|
|
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.core.handlers.wsgi import WSGIRequest
|
|
|
|
from django.db.models import QuerySet
|
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"]
|
|
|
|
|
2021-12-28 23:33:50 +01:00
|
|
|
def item_description(self, item: Article) -> str: # type: ignore[override]
|
|
|
|
return item.get_formatted_content
|
|
|
|
|
|
|
|
def item_pubdate(self, item: Article) -> datetime | None:
|
|
|
|
return item.published_at
|
|
|
|
|
|
|
|
def _get_queryset(self) -> QuerySet[Article]:
|
2020-12-24 17:49:47 +01:00
|
|
|
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):
|
|
|
|
def get_object( # type: ignore[override]
|
|
|
|
self, request: WSGIRequest, *args, **kwargs
|
|
|
|
) -> 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]
|