src/cm/views/feeds.py
author raph
Fri, 26 Mar 2010 12:19:38 +0100
changeset 235 b23aee4dd81d
parent 169 132100852cd6
permissions -rw-r--r--
use lazy i18n for edit form

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)