From 6f0af6ddbc0f25bffaa80444ac3503273ee8e57b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <git@imaniti.org>
Date: Thu, 5 Jan 2023 20:41:18 +0100
Subject: [PATCH] finished rss feed

---
 main/feeds.py                                 | 61 ++++++++++++-------
 main/models.py                                |  9 ++-
 .../templates/main/feed_item_description.html |  2 +
 main/urls.py                                  |  7 ---
 4 files changed, 48 insertions(+), 31 deletions(-)
 delete mode 100644 main/urls.py

diff --git a/main/feeds.py b/main/feeds.py
index 5b052f18..5ce0c266 100644
--- a/main/feeds.py
+++ b/main/feeds.py
@@ -1,76 +1,91 @@
+from datetime import datetime
+
 from django.contrib.syndication.views import Feed
-from django.shortcuts import render
+from django.template.loader import render_to_string
 from django.urls import reverse
-from main.models import MainArticlesPage, MainArticlePage
+
+from .models import MainArticlesPage, MainArticlePage
+
 
 class LatestArticlesFeed(Feed):
     def get_object(
-        self: LatestArticlesFeed,
+        self,
         request,
-        title: str
+        id: int
     ) -> MainArticlesPage:
-        return MainArticlesPage.objects.get(title=title)
+        return MainArticlesPage.objects.get(id=id)
 
     def title(
-        self: LatestArticlesFeed,
+        self,
         obj: MainArticlesPage
     ) -> str:
         return obj.title
 
     def link(
-        self: LatestArticlesFeed,
+        self,
         obj: MainArticlesPage
     ) -> str:
         return obj.get_full_url()
 
     def description(
-        self: LatestArticlesFeed,
+        self,
         obj: MainArticlesPage
     ) -> str:
         return obj.perex
 
     def items(
-        self: LatestArticlesFeed,
+        self,
         obj: MainArticlesPage
     ) -> list:
-        return obj.get_children().type(MainArticlePage)[:32]
+        return MainArticlePage.objects.live().child_of(obj)[:32]
 
     def item_title(
-        self: LatestArticlesFeed,
-        obj: MainArticlePage
+        self,
+        item: MainArticlePage
     ) -> str:
-        return obj.title
+        return item.title
 
     def item_description(
-        self: LatestArticlesFeed,
+        self,
         item: MainArticlePage
-    ):
-        return render(
-            None,
+    ) -> str:
+        return render_to_string(
             "main/feed_item_description.html",
             {"item": item},
         )
 
     def item_pubdate(
-        self: LatestArticlesFeed,
+        self,
         item: MainArticlePage
-    ):
+    ) -> datetime:
         return item.first_published_at
 
     def item_updateddate(
-        self: LatestArticlesFeed,
+        self,
         item: MainArticlePage
-    ):
+    ) -> datetime:
         return item.last_published_at
 
+    def item_author_name(
+        self,
+        item: MainArticlePage
+    ) -> str:
+        if item.author:
+            return item.author
+
+        if item.author_page.title:
+            return item_author_page.title
+
+        return ""
+
     def item_categories(
-        self: LatestArticlesFeed,
+        self,
         item: MainArticlePage
     ) -> list:
         return item.tags.all()
 
     def item_link(
-        self: LatestArticlesFeed,
+        self,
         item: MainArticlePage
     ) -> str:
         return item.get_full_url()
diff --git a/main/models.py b/main/models.py
index 2876ebca..efc8da74 100644
--- a/main/models.py
+++ b/main/models.py
@@ -4,7 +4,7 @@ from dateutil.relativedelta import relativedelta
 from django.conf import settings
 from django.core.paginator import Paginator
 from django.db import models
-from django.http import HttpResponseRedirect, JsonResponse
+from django.http import HttpResponseRedirect, HttpResponse, JsonResponse
 from django.shortcuts import render
 from django.utils import timezone
 from modelcluster.contrib.taggit import ClusterTaggableManager
@@ -301,6 +301,13 @@ class MainHomePage(
                     return HttpResponseRedirect(self.url)
         return HttpResponseRedirect(self.url)
 
+    @route(r"^feeds/atom/$")
+    def view_feed(self, request):
+        # Avoid circular import
+        from .feeds import LatestArticlesFeed  # noqa
+
+        return LatestArticlesFeed()(request, self.articles_page.id)
+
     def _first_subpage_of_type(self, page_type) -> Page or None:
         try:
             return self.get_descendants().type(page_type).live().specific()[0]
diff --git a/main/templates/main/feed_item_description.html b/main/templates/main/feed_item_description.html
index e44f14f7..e01e314b 100644
--- a/main/templates/main/feed_item_description.html
+++ b/main/templates/main/feed_item_description.html
@@ -1,3 +1,5 @@
+{% load wagtailcore_tags %}
+
 {% for block in item.content %}
     {% include_block block %}
 {% endfor %}
diff --git a/main/urls.py b/main/urls.py
deleted file mode 100644
index 69792634..00000000
--- a/main/urls.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from django.urls import path
-from main.feeds import LatestArticlesFeed
-
-
-urlpatterns = [
-    path('feed', LatestArticlesFeed()),
-]
-- 
GitLab