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