From 030d47af8ab3d6c261dc338aaa35a503156f8b2e Mon Sep 17 00:00:00 2001
From: Parbhat Puri <parbhatpuri17@gmail.com>
Date: Wed, 1 May 2019 07:08:20 +0000
Subject: [PATCH] Use methods to set title, description, link instead of class
 attributes

---
 opentech/public/news/models.py |  6 +++--
 opentech/public/news/views.py  | 49 +++++++++++++++++++++++-----------
 opentech/public/urls.py        |  2 +-
 3 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/opentech/public/news/models.py b/opentech/public/news/models.py
index 1d3e97fc6..d25b7081a 100644
--- a/opentech/public/news/models.py
+++ b/opentech/public/news/models.py
@@ -175,5 +175,7 @@ class NewsFeedSettings(BaseSetting):
     news_title = models.CharField(max_length=255, help_text='The title of the main news feed.')
     news_description = models.CharField(max_length=255, help_text='The description of the main news feed.')
 
-    news_per_type_title = models.CharField(max_length=255, help_text='The title of the news feed by type. Use {news_type} to insert the type name.')
-    news_per_type_description = models.CharField(max_length=255, help_text='The description of the news feed by type. Use {news_type} to insert the type name.')
+    news_per_type_title = models.CharField(
+        max_length=255, help_text='The title of the news feed by type. Use {news_type} to insert the type name.')
+    news_per_type_description = models.CharField(
+        max_length=255, help_text='The description of the news feed by type. Use {news_type} to insert the type name.')
diff --git a/opentech/public/news/views.py b/opentech/public/news/views.py
index 7e9c7ef37..6217bf039 100644
--- a/opentech/public/news/views.py
+++ b/opentech/public/news/views.py
@@ -1,5 +1,6 @@
 from django.contrib.syndication.views import Feed
 from django.db.models.functions import Coalesce
+from django.http import Http404
 
 from wagtail.core.models import Site
 
@@ -7,15 +8,30 @@ from opentech.public.news.models import NewsPage, NewsType, NewsIndex, NewsFeedS
 
 
 class NewsFeed(Feed):
-    site = Site.objects.get(is_default_site=True)
-    news_feed_settings = NewsFeedSettings.for_site(site=site)
-    news_index = NewsIndex.objects.first()
-    link = f"{site.root_url}/{news_index.slug}/"
-    title = news_feed_settings.news_title
-    description = news_feed_settings.news_description
+    def __call__(self, request, *args, **kwargs):
+        try:
+            self.site = Site.objects.get(is_default_site=True)
+            self.news_feed_settings = NewsFeedSettings.for_site(site=self.site)
+        except Site.DoesNotExist:
+            raise Http404
+        return super().__call__(request, *args, **kwargs)
+
+    def title(self):
+        return self.news_feed_settings.news_title
+
+    def description(self):
+        return self.news_feed_settings.news_description
+
+    def link(self):
+        news_index = NewsIndex.objects.live().public().first()
+        if news_index:
+            return news_index.full_url
+        return self.site.root_url
 
     def items(self):
-        return NewsPage.objects.live().public().annotate(date=Coalesce('publication_date', 'first_published_at')).order_by('-date')[:20]
+        return NewsPage.objects.live().public().annotate(
+            date=Coalesce('publication_date', 'first_published_at')
+        ).order_by('-date')[:20]
 
     def item_title(self, item):
         return item.title
@@ -27,22 +43,23 @@ class NewsFeed(Feed):
         return item.display_date
 
 
-class NewsTypesFeed(NewsFeed):
-    site = Site.objects.get(is_default_site=True)
-    news_feed_settings = NewsFeedSettings.for_site(site=site)
-    news_index = NewsIndex.objects.first()
-
+class NewsTypeFeed(NewsFeed):
     def get_object(self, request, news_type):
         return NewsType.objects.get(id=news_type)
 
-    def link(self, obj):
-        return f"{self.site.root_url}/{self.news_index.slug}/?news_type={obj.id}"
-
     def title(self, obj):
         return self.news_feed_settings.news_per_type_title.format(news_type=obj)
 
     def description(self, obj):
         return self.news_feed_settings.news_per_type_description.format(news_type=obj)
 
+    def link(self, obj):
+        news_index = NewsIndex.objects.live().public().first()
+        if news_index:
+            return news_index.full_url + '?news_type={}'.format(obj.id)
+        return self.site.root_url
+
     def items(self, obj):
-        return NewsPage.objects.live().public().filter(news_types__news_type=obj).annotate(date=Coalesce('publication_date', 'first_published_at')).order_by('-date')[:20]
+        return NewsPage.objects.live().public().filter(news_types__news_type=obj).annotate(
+            date=Coalesce('publication_date', 'first_published_at')
+        ).order_by('-date')[:20]
diff --git a/opentech/public/urls.py b/opentech/public/urls.py
index c1c00a526..d4adf9736 100644
--- a/opentech/public/urls.py
+++ b/opentech/public/urls.py
@@ -8,6 +8,6 @@ from .mailchimp import urls as newsletter_urls
 urlpatterns = [
     path('search/', search_views.search, name='search'),
     path('news/feed/', news_views.NewsFeed(), name='news_feed'),
-    path('news/<int:news_type>/feed/', news_views.NewsTypesFeed(), name='news_types_feed'),
+    path('news/<int:news_type>/feed/', news_views.NewsTypeFeed(), name='news_types_feed'),
     path('newsletter/', include(newsletter_urls))
 ]
-- 
GitLab