Files @ fce05b6f99be
Branch filter:

Location: website/www/conservancy/feeds.py

brett
supporter: Add tabindex to supporter sign-up form.
from django.contrib.syndication.views import Feed
from django.utils.feedgenerator import Rss201rev2Feed 
from conservancy.apps.news.models import PressRelease
from conservancy.apps.blog.models import Entry as BlogEntry
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.conf import settings
from datetime import datetime

import itertools
import operator

class ConservancyFeedBase(Feed):
    def copyright_holder(self): return "Software Freedom Conservancy"

    def license_no_html(self): return "Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License."

    def item_copyright(self, item):
        year = 2008
        for attr in ('pub_date', 'date_created', 'date_last_modified'):
            if hasattr(item, attr):
                if hasattr(getattr(item, attr), 'year'):
                    year = getattr(getattr(item, attr), 'year')
                    break
        return 'Copyright (C) %d, %s.  %s' % (year, self.copyright_holder(), self.license_no_html())

    def item_extra_kwargs(self, item):
        year = 2008
        for attr in ('pub_date', 'date_created', 'date_last_modified'):
            if hasattr(item, attr):
                if hasattr(getattr(item, attr), 'year'):
                    year = getattr(getattr(item, attr), 'year')
                    break
        return { 'year' : year }

class PressReleaseFeed(Feed):
    get_absolute_url = '/feeds/news/'
    title = "Software Freedom Conservancy News"
    link = "/news/"
    description = ""

    def items(self):
        return PressRelease.objects.filter(pub_date__lte=datetime.now(),
                                           sites__id__exact=settings.SITE_ID).order_by('-pub_date')[:10]
    def item_title(self, item):
        return item.headline

    def item_description(self, item):
        return item.summary

    def item_pubdate(self, item):
        return item.pub_date

class OmnibusFeedType(Rss201rev2Feed):
    def root_attributes(self):
        attrs = super(OmnibusFeedType, self).root_attributes()
        attrs['xmlns:itunes'] = 'http://www.itunes.com/dtds/podcast-1.0.dtd'
        attrs['xmlns:atom'] = 'http://www.w3.org/2005/Atom'
        attrs['xmlns:media'] = 'http://search.yahoo.com/mrss/'
        attrs['xmlns:dc'] = "http://purl.org/dc/elements/1.1/"
        return attrs

    def add_root_elements(self, handler):
        super(OmnibusFeedType, self).add_root_elements(handler)

    def add_item_elements(self, handler, item):
        super(OmnibusFeedType, self).add_item_elements(handler, item)
        # Block things that don't have an enclosure from iTunes in
        # case someone uploads this feed there.
        handler.addQuickElement("itunes:block", 'Yes')

class OmnibusFeed(ConservancyFeedBase):
    get_absolute_url = '/feeds/omnibus/'
    feed_type = OmnibusFeedType
    link ="/news/"
    title = "The Software Freedom Conservancy"
    description = "An aggregated feed of all RSS content available from the Software Freedom Conservancy, including both news items and blogs."
    title_template = "feeds/omnibus_title.html"
    description_template = "feeds/omnibus_description.html"
    author_email = "info@sfconservancy.org"
    author_link = "https://sfconservancy.org/"
    author_name = "Software Freedom Conservancy"

    def item_title(self, item):
        return item.headline

    def item_description(self, item):
        return item.summary

    def item_enclosure_mime_type(self): return "audio/mpeg"

    def item_enclosure_url(self, item):
        if hasattr(item, 'mp3_path'):
            return "https://sfconservancy.org" + item.mp3_path
    def item_enclosure_length(self, item):
        if hasattr(item, 'mp3_path'):
            return item.mp3_length

    def item_pubdate(self, item):
        return item.pub_date

    def item_author_name(self, item):
        if item.omnibus_type == "blog":
            return item.author.formal_name
        else:
            return "Software Freedom Conservancy"

    def item_author_link(self, obj):
        return "https://sfconservancy.org"

    def item_author_email(self, item):
        if item.omnibus_type == "news":
            return "info@sfconservancy.org"
        elif hasattr(item, 'author'):
            return "%s@sfconservancy.org" % item.author
        else:
            return "info@sfconservancy.org"

    def item_pubdate(self, item):
        if item.omnibus_type == "event":
            return item.date_created
        else:
            return item.pub_date

    def item_link(self, item):
        return item.get_absolute_url()

# http://groups.google.ca/group/django-users/browse_thread/thread/d22e8a8f378cf0e2

    def items(self):
        blogs = BlogEntry.objects.filter(pub_date__lte=datetime.now()).order_by('-pub_date')[:25]
        for bb in blogs:
            bb.omnibus_type = "blog"
            bb.omnibus_feed_description_template = "feeds/blog_description.html"
            bb.omnibus_feed_title_template = "feeds/blog_title.html"

        news = PressRelease.objects.filter(pub_date__lte=datetime.now(),
                                           sites__id__exact=settings.SITE_ID).order_by('-pub_date')[:25]
        for nn in news:
            nn.omnibus_type = "news"
            nn.omnibus_feed_description_template = "feeds/news_description.html"
            nn.omnibus_feed_title_template = "feeds/news_title.html"

        a  = [ ii for ii in itertools.chain(blogs, news)]
        a.sort(key=operator.attrgetter('pub_date'), reverse=True)
        return a


    def item_extra_kwargs(self, item):
        return super(OmnibusFeed, self).item_extra_kwargs(item)

class BlogFeed(ConservancyFeedBase):
    link = "/blog/"
    get_absolute_url = '/feeds/blog/'

    def get_object(self, request):
        return request

    def title(self, obj):
        answer = "The Software Freedom Conservancy Blog"

        GET = obj.GET
        tags = []
        if 'author' in GET:
            tags = GET.getlist('author')
        if 'tag' in GET:
            tags += GET.getlist('tag')

        if len(tags) == 1:
            answer += " (" + tags[0] + ")"
        elif len(tags) > 1:
            firstTime = True
            done = {}
            for tag in tags:
                if done.has_key(tag): continue
                if firstTime:
                    answer += " ("
                    firstTime = False
                else:
                    answer += ", "
                answer += tag
                done[tag] = tag
            answer += ")"
        else:
            answer += "."
        return answer
        
    def description(self, obj):
        answer = "Blogs at the Software Freedom Conservancy"

        GET = obj.GET
        tags = []
        if 'author' in GET: tags = GET.getlist('author')
        if 'tag' in GET:    tags += GET.getlist('tag')

        done = {}
        if len(tags) == 1:
            answer += " tagged with " + tags[0]
        elif len(tags) > 1:
            firstTime = True
            for tag in tags:
                if done.has_key(tag): continue
                if firstTime:
                    answer += " tagged with "
                    firstTime = False
                else:
                    answer += " or "
                answer += tag
                done[tag] = tag
        else:
            answer = "All blogs at the Software Freedom Conservancy"
        answer += "."

        return answer
        
    def item_title(self, item):
        return item.headline

    def item_description(self, item):
        return item.summary

    def item_author_name(self, item):
        return item.author.formal_name

    def item_author_email(self, item):
        return "%s@sfconservancy.org" % item.author

    def item_pubdate(self, item):
        return item.pub_date

    def items(self, obj):
        GET = obj.GET

        def OR_filter(field_name, subfield_name, objs):
            from django.db.models import Q
            return reduce(lambda x, y: x | y,
                          [Q(**{'%s__%s' % (field_name, subfield_name): x})
                           for x in objs])

        queryset = BlogEntry.objects.filter(pub_date__lte=datetime.now())

        if 'author' in GET:
            authors = GET.getlist('author')
            queryset = queryset.filter(OR_filter('author', 'username', authors))

        if 'tag' in GET:
            tags = GET.getlist('tag')
            queryset = queryset.filter(OR_filter('tags', 'slug', tags))

        return queryset.order_by('-pub_date')[:10]


def view(request):
    """Listing of all available feeds
    """

    feeds = (PressReleaseFeed, BlogFeed, OmnibusFeed)
    return render_to_response("feeds.html", {'feeds': feeds}, context_instance=RequestContext(request))