diff -r 000000000000 -r 40c8f766c9b8 src/cm/views/feeds.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cm/views/feeds.py Mon Nov 23 15:14:29 2009 +0100 @@ -0,0 +1,88 @@ +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 +# 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" + tag = re.sub('^http://', '', url) + if date is not None: + tag = re.sub('/', ',%s:/' % time.mktime(date.timetuple()), tag, 1) + tag = re.sub('#', '/', tag) + return u'tag:' + tag + + +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)