src/cm/views/feeds.py
author gibus
Sat, 14 Sep 2013 10:00:45 +0200
changeset 533 c7aed0340a00
parent 169 132100852cd6
permissions -rw-r--r--
For some reason, when exporting commented text with background colors, angle brackets for html spans are sometimes returned as entities by soup.

from django.conf import settings
from django.core.urlresolvers import reverse
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response
from django.template.loader import render_to_string
from django.utils import feedgenerator
from django.utils.translation import ugettext as _
from django.template import RequestContext
from django.contrib.auth.models import AnonymousUser  
from cm.security import get_viewable_activities
from cm.models import ApplicationConfiguration, Activity, Configuration
import time
from cm.exception import UnauthorizedException
import re
from urlparse import urlparse
# taken from django's feedgenerator.py and changed to support multiple posts in minute
def get_tag_uri(url, date):
    "Creates a TagURI. See http://diveintomark.org/archives/2004/05/28/howto-atom-id"
    parsed_url = urlparse(url)
    time_stp = time.mktime(date.timetuple()) if date is not None else ''
    return u'tag:%s,%s:%s' %(parsed_url.hostname, time_stp, parsed_url.path) # + '/' + parsed_url.fragment


def public_feed(request):
    feed_title = _(u"%(workspace_name)s's public feed" % {'workspace_name' : ApplicationConfiguration['workspace_name']})
    feed_description = _(u"Workspace %(workspace_name)s public activity feed") % {'workspace_name' : ApplicationConfiguration['workspace_name']}
    request.user = AnonymousUser()
    activitites = get_viewable_activities(request, {'view_comments' : 1, 'view_texts' : 1})
    return _feed(request, activitites, feed_title, feed_description)

def private_feed(request, key):
    private_feed_key = Configuration.objects.get_key('private_feed_key', None)
    if private_feed_key != key:
        raise Http404

    feed_title = _(u"%(workspace_name)s's private feed" % {'workspace_name' : ApplicationConfiguration['workspace_name']})
    feed_description = _(u"Workspace %(workspace_name)s private feed") % {'workspace_name' : ApplicationConfiguration['workspace_name']}
    activities = Activity.objects.filter(type__in=Activity.ACTIVITIES_TYPES).order_by('-created')
    return _feed(request, activities, feed_title, feed_description)

def _feed(request, activities, feed_title, feed_description):
    feed = feedgenerator.Atom1Feed(
        title=feed_title,
        link=settings.SITE_URL,
        description=feed_description,
        language='en' # TODO: something better to do?
    )    

    for activity in activities:
        item_data = activity.printable_data()
        item_data_text = activity.printable_data(html=False, link=False)
        item_metadata = activity.created # TODO dateformat
        item_body = render_to_string('feed/feed_item.txt',
                                   { 'title': item_data,
                                     'body' : item_metadata,
                                     }, context_instance = RequestContext(request))
        feed.add_item(title=item_data_text,
               link=settings.SITE_URL,
               description=item_body,
               pubdate=activity.created,
               unique_id=get_tag_uri(settings.SITE_URL, activity.created),
               author_name=activity.user.username if activity.user else '-',
               )
    
    response = HttpResponse(mimetype=feed.mime_type)
    feed.write(response, 'utf-8')
    return response
    
def text_feed(request, key):
    from cm.views import get_text_by_keys_or_404    
    text = get_text_by_keys_or_404(key)
    feed_title = _(u"Text %(text_title)s's public feed" % {'text_title' : text.title})
    feed_description = _(u"Public activity feed for text %(text_title)s") % {'text_title' : text.title}
    request.user = AnonymousUser()
    activitites = get_viewable_activities(request, {'view_comments' : 1, 'view_texts' : 1}, text=text)
    return _feed(request, activitites, feed_title, feed_description)

def text_feed_private(request, key, private_feed_key):
    from cm.views import get_text_by_keys_or_404    
    text = get_text_by_keys_or_404(key)
    if text.private_feed_key != private_feed_key:
        raise Http404

    feed_title = _(u"Text %(text_title)s's private feed" % {'text_title' : text.title})
    feed_description = _(u"Private activity feed for text %(text_title)s") % {'text_title' : text.title}
    activities = Activity.objects.filter(type__in=Activity.ACTIVITIES_TYPES, text=text).order_by('-created')
    return _feed(request, activities, feed_title, feed_description)