diff --git a/badger/feeds.py b/badger/feeds.py index c1538aa..b998e02 100644 --- a/badger/feeds.py +++ b/badger/feeds.py @@ -1,4 +1,5 @@ """Feeds for badge""" +import logging import datetime import hashlib import urllib @@ -28,13 +29,13 @@ DEFAULT_BADGE_IMAGE) -MAX_FEED_ITEMS = getattr(settings, 'BADGER_MAX_FEED_ITEMS', 15) +MAX_FEED_ITEMS = getattr(settings, 'BADGER_MAX_FEED_ITEMS', 50) -class BaseJSONFeedGenerator(SyndicationFeed): - """JSON feed generator""" - # TODO:liberate - Can this class be a generally-useful lib? +class OBIJSONFeedGenerator(SyndicationFeed): + """OBI JSON feed generator""" + serialization_method = 'as_obi_assertion' mime_type = 'application/json' def _encode_complex(self, obj): @@ -42,20 +43,11 @@ def _encode_complex(self, obj): return obj.isoformat() def build_item(self, item): - """Simple base item formatter. - Omit some named keys and any keys with false-y values""" - omit_keys = ('obj', 'unique_id', ) - return dict((k, v) for k, v in item.items() - if v and k not in omit_keys) + request = self.feed['request'] + return getattr(item['obj'], self.serialization_method)(request) def build_feed(self): - """Simple base feed formatter. - Omit some named keys and any keys with false-y values""" - omit_keys = ('obj', 'request', 'id', ) - feed_data = dict((k, v) for k, v in self.feed.items() - if v and k not in omit_keys) - feed_data['items'] = [self.build_item(item) for item in self.items] - return feed_data + return dict(badges=[self.build_item(item) for item in self.items]) def write(self, outfile, encoding): request = self.feed['request'] @@ -80,7 +72,7 @@ class BaseFeed(Feed): and other niceties""" # TODO:liberate - Can this class be a generally-useful lib? - json_feed_generator = BaseJSONFeedGenerator + json_feed_generator = OBIJSONFeedGenerator rss_feed_generator = Rss201rev2Feed atom_feed_generator = Atom1Feed @@ -136,8 +128,8 @@ def item_description(self, obj): ) -class AwardActivityStreamJSONFeedGenerator(BaseJSONFeedGenerator): - pass +class AwardActivityStreamJSONFeedGenerator(OBIJSONFeedGenerator): + serialization_method = 'as_obi_assertion' class AwardActivityStreamAtomFeedGenerator(Atom1Feed): @@ -216,8 +208,8 @@ def items(self, badge): .all()[:MAX_FEED_ITEMS]) -class BadgesJSONFeedGenerator(BaseJSONFeedGenerator): - pass +class BadgesJSONFeedGenerator(OBIJSONFeedGenerator): + serialization_method = 'as_obi_serialization' class BadgesFeed(BaseFeed): diff --git a/badger/tests/test_feeds.py b/badger/tests/test_feeds.py index b56e07b..73c74e1 100644 --- a/badger/tests/test_feeds.py +++ b/badger/tests/test_feeds.py @@ -1,5 +1,6 @@ import logging import feedparser +import json from django.conf import settings @@ -38,12 +39,13 @@ def tearDown(self): Award.objects.all().delete() Badge.objects.all().delete() - def test_award_feeds(self): - """Can view award detail""" + def test_award_atom_feeds(self): + """Can view award atom feeds""" user = self._get_user() user2 = self._get_user(username='tester2') - b1, created = Badge.objects.get_or_create(creator=user, title="Code Badge #1") + b1, created = Badge.objects.get_or_create(creator=user, + title="Code Badge #1") award = b1.award_to(user2) # The award should show up in each of these feeds. @@ -72,6 +74,71 @@ def test_award_feeds(self): ok_(found_it) + def test_badge_json_feeds(self): + user = self._get_user() + user2 = self._get_user(username='tester2') + + b1, created = Badge.objects.get_or_create(creator=user, + title="Code Badge #1") + + # The award should show up in each of these feeds. + feed_urls = ( + reverse('badger.feeds.badges_recent', + args=('json', )), + ) + + # Check each of the feeds + for feed_url in feed_urls: + r = self.client.get(feed_url, follow=True) + + # The feed should be parsed without issues by feedparser + feed = json.loads(r.content) + + ok_('badges' in feed) + b1_url = ('http://testserver%s' % + b1.get_absolute_url()) + found_it = False + for badge in feed['badges']: + if badge['criteria'] == b1_url: + found_it = True + + ok_(found_it) + + def test_award_json_feeds(self): + user = self._get_user() + user2 = self._get_user(username='tester2') + + b1, created = Badge.objects.get_or_create(creator=user, + title="Code Badge #1") + award = b1.award_to(user2) + + # The award should show up in each of these feeds. + feed_urls = ( + reverse('badger.feeds.awards_recent', + args=('json', )), + reverse('badger.feeds.awards_by_badge', + args=('json', b1.slug, )), + reverse('badger.feeds.awards_by_user', + args=('json', user2.username,)), + ) + + # Check each of the feeds + for feed_url in feed_urls: + r = self.client.get(feed_url, follow=True) + + # The feed should be parsed without issues by feedparser + feed = json.loads(r.content) + + ok_('badges' in feed) + b1_url = ('http://testserver%s' % + b1.get_absolute_url(format='json')) + found_it = False + for badge in feed['badges']: + if badge['badge'] == b1_url: + found_it = True + + ok_(found_it) + def _get_user(self, username="tester", email="tester@example.com", password="trustno1"): (user, created) = User.objects.get_or_create(username=username,