pulseapi/utility/syndication.py (54 lines of code) (raw):

""" Provide RSS and Atom feeds for Pulse. """ from django.contrib.syndication.views import Feed from django.utils.feedgenerator import Atom1Feed from pulseapi import settings from pulseapi.entries.models import Entry # The creator(s) name can be found in the `EntryCreator` class from the `creators` models. def get_entry_creators(entry): # Since `creators` is an optional field and can be empty, we return the publisher name instead. entry_creators = entry.related_entry_creators.all() if len(entry_creators) >= 1: return ', '.join( entry_creator.profile.name for entry_creator in entry_creators ) else: return entry.published_by.name # Generic class for RSS feeds class RSSFeedFromPulse(Feed): def item_author_name(self, entry): return get_entry_creators(entry) def item_title(self, entry): return entry.title def item_pubdate(self, entry): return entry.created def item_description(self, entry): return entry.description def item_enclosure_url(self, entry): if entry.thumbnail: if settings.USE_S3: return entry.thumbnail.url # Provide an absolute URL for local dev purposes else: return settings.ALLOWED_HOSTS[0] + ':8000' + entry.thumbnail.url def item_enclosure_length(self, entry): return '' def item_enclosure_mime_type(self, entry): return 'image/jpeg' def item_link(self, entry): return entry.frontend_entry_url() def item_categories(self, entry): return list(entry.tags.values_list('name', flat=True)) + list(entry.issues.values_list('name', flat=True)) # RSS feed for latest entries class RSSFeedLatestFromPulse(RSSFeedFromPulse): title = 'Latest from Mozilla Pulse' link = '{frontend_url}/latest'.format(frontend_url=settings.PULSE_FRONTEND_HOSTNAME) description = 'Subscribe to get the latest entries from Mozilla Pulse.' def items(self): return Entry.objects.public().with_related().order_by('-created')[:20] # RSS feed for featured entries class RSSFeedFeaturedFromPulse(RSSFeedFromPulse): title = 'Latest from Mozilla Pulse' link = '{frontend_url}/featured'.format(frontend_url=settings.PULSE_FRONTEND_HOSTNAME) description = 'Subscribe to get the latest featured entries from Mozilla Pulse.' def items(self): return Entry.objects.filter(featured=True).order_by('-created')[:20] # Atom feed for latest entries class AtomFeedLatestFromPulse(RSSFeedLatestFromPulse): feed_type = Atom1Feed subtitle = RSSFeedLatestFromPulse.description # Atom feed for featured entries class AtomFeedFeaturedFromPulse(RSSFeedFeaturedFromPulse): feed_type = Atom1Feed subtitle = RSSFeedLatestFromPulse.description