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