Skip to content
This repository has been archived by the owner on Feb 13, 2019. It is now read-only.

Commit

Permalink
special coverage rss feed
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaelButkovic committed Oct 6, 2015
1 parent 9413994 commit 1abe4f1
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 2 deletions.
5 changes: 3 additions & 2 deletions bulbs/feeds/urls.py
@@ -1,8 +1,9 @@
from django.conf.urls import url, patterns

from .views import RSSView
from .views import RSSView, SpecialCoverageRSSView


urlpatterns = patterns("",
url(r"^rss", RSSView.as_view(), name="rss-feed") # noqa
url(r"^rss", RSSView.as_view(), name="rss-feed"), # noqa
url(r"^sc-rss", SpecialCoverageRSSView.as_view(), name="sc-rss-feed") # noqa
)
52 changes: 52 additions & 0 deletions bulbs/feeds/views.py
Expand Up @@ -2,7 +2,10 @@
from django.utils.timezone import now
from django.views.decorators.cache import cache_control

from elasticsearch_dsl.filter import Ids

from bulbs.content.views import ContentListView
from bulbs.special_coverage.models import SpecialCoverage


class RSSView(ContentListView):
Expand Down Expand Up @@ -40,3 +43,52 @@ def get_context_data(self, *args, **kwargs):
content.feed_url = self.request.build_absolute_uri(feed_path)

return RequestContext(self.request, context)


class SpecialCoverageRSSView(ContentListView):
"""Really simply, this syndicates Content."""
template_name = "feeds/rss.xml"
paginate_by = 20
feed_title = "Special Coverage RSS Feed"
utm_params = "utm_medium=RSS&utm_campaign=feeds"

def get_template_names(self):
return ["feeds/rss.xml", "feeds/_rss.xml"]

@cache_control(max_age=600)
def get(self, request, *args, **kwargs):
response = super(SpecialCoverageRSSView, self).get(request, *args, **kwargs)
response["Content-Type"] = "application/rss+xml"
return response

def get_queryset(self):
sc_id = self.request.GET.get("id")
sc_slug = self.request.GET.get("slug")

if sc_id and sc_slug:
sc_ids = SpecialCoverage.objects.get(id=sc_id, slug=sc_slug).query["included_ids"]
elif sc_id:
sc_ids = SpecialCoverage.objects.get(id=sc_id).query["included_ids"]
elif sc_slug:
sc_ids = SpecialCoverage.objects.get(slug=sc_slug).query["included_ids"]
else:
sc_ids = []

return super(SpecialCoverageRSSView, self).get_queryset().filter(Ids(values=sc_ids))[:self.paginate_by]

def get_context_data(self, *args, **kwargs):
context = super(SpecialCoverageRSSView, self).get_context_data(*args, **kwargs)
context["full"] = (self.request.GET.get("full", "false").lower() == "true")
context["images"] = (self.request.GET.get("images", "false").lower() == "true")
context["build_date"] = now()
context["title"] = self.feed_title
context["feed_url"] = self.request.build_absolute_uri()
context["search_url"] = self.request.build_absolute_uri(
u"/search?%s" % self.request.META["QUERY_STRING"])

# OK, so this is kinda brutal. Stay with me here.
for content in context["page_obj"].object_list:
feed_path = content.get_absolute_url() + "?" + self.utm_params
content.feed_url = self.request.build_absolute_uri(feed_path)

return RequestContext(self.request, context)
50 changes: 50 additions & 0 deletions tests/test_rss_feeds.py
Expand Up @@ -4,6 +4,8 @@
from django.test.client import Client
from django.utils import timezone

from bulbs.special_coverage.models import SpecialCoverage

from bulbs.utils.test import BaseIndexableTestCase, make_content

from example.testcontent.models import TestContentObj
Expand All @@ -25,3 +27,51 @@ def test_rss_feed(self):

first_item = response.context["page_obj"].object_list[0]
self.assertTrue(hasattr(first_item, "feed_url"))

def test_special_coverage_rss_feed(self):
# make content
c1 = TestContentObj.objects.create(title="Content1", published=timezone.now())
c2 = TestContentObj.objects.create(title="Content2", published=timezone.now())
TestContentObj.objects.create(title="Content3", published=timezone.now())
TestContentObj.search_objects.refresh()

# make Special Coverage & add c1 & c2 to it
sc = SpecialCoverage.objects.create(
name="Coverage",
description="Test coverage",
query={
'excluded_ids': [],
'groups': [],
'included_ids': [c1.pk, c2.pk],
'pinned_ids': []
}
)

# test slug w/ sc-rss-feed
sc_rss = reverse("sc-rss-feed")
client = Client()
response = client.get("{0}?slug={1}".format(sc_rss, sc.slug))

self.assertEqual(response.status_code, 200)

# verify stuff is in sc-rss-feed response
self.assertTrue("Content1" in response.content)
self.assertTrue("Content2" in response.content)
self.assertTrue("Content3" not in response.content)

# test id w/ sc-rss-feed
response = client.get("{0}?id={1}".format(sc_rss, sc.id))
self.assertEqual(response.status_code, 200)

# verify stuff is in sc-rss-feed response
self.assertTrue("Content1" in response.content)
self.assertTrue("Content2" in response.content)
self.assertTrue("Content3" not in response.content)

# test w/o id or slug
response = client.get("{0}".format(sc_rss))
self.assertEqual(response.status_code, 200)

# verify nothing is returned
object_list = response.context["page_obj"].object_list
self.assertEqual(len(object_list), 0)

0 comments on commit 1abe4f1

Please sign in to comment.