diff --git a/opentech/public/news/feeds.py b/opentech/public/news/feeds.py index ae79a1ee652ea8aa88e068fcb1460bdd1e44405d..b8cb442c8123fec60dcce7e872ed48662211fd31 100644 --- a/opentech/public/news/feeds.py +++ b/opentech/public/news/feeds.py @@ -1,4 +1,6 @@ +from django.conf import settings from django.contrib.syndication.views import Feed +from django.core.cache import cache from django.db.models.functions import Coalesce from django.http import Http404 @@ -14,7 +16,21 @@ class NewsFeed(Feed): except Site.DoesNotExist: raise Http404 self.news_feed_settings = NewsFeedSettings.for_site(site=self.site) - return super().__call__(request, *args, **kwargs) + + cache_key = self.get_cache_key(*args, **kwargs) + response = cache.get(cache_key) + + if response is None: + response = super().__call__(request, *args, **kwargs) + cache.set(cache_key, response, settings.FEED_CACHE_TIMEOUT) + + return response + + def get_cache_key(self, *args, **kwargs): + tag = '' + for key, value in kwargs.items(): + tag += f"-{key}-{value}" + return f"{self.__class__.__module__}{tag}" def title(self): return self.news_feed_settings.news_title @@ -56,7 +72,7 @@ class NewsTypeFeed(NewsFeed): 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 f"{news_index.full_url}?news_type={obj.id}" return self.site.root_url def items(self, obj): diff --git a/opentech/settings/base.py b/opentech/settings/base.py index 3cd070b03e2cbf966a8522acd4bff4b995710a42..bef78cd4291e5fbeb0cb6f331de95aaaaa24a279 100644 --- a/opentech/settings/base.py +++ b/opentech/settings/base.py @@ -214,6 +214,9 @@ except ValueError: # Set wagtail cache timeout (automatic cache refresh). WAGTAIL_CACHE_TIMEOUT = CACHE_CONTROL_MAX_AGE +# Set feed cache timeout (automatic cache refresh). +FEED_CACHE_TIMEOUT = 600 + if 'REDIS_URL' in env: CACHES = { "default": {