src/cm/views/feeds.py
author rbernard
Sat, 13 Feb 2010 12:02:23 +0100
changeset 175 4f072edc51a1
parent 0 40c8f766c9b8
child 169 132100852cd6
permissions -rw-r--r--
BUG FIX : handling html
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
from django.conf import settings
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
from django.core.urlresolvers import reverse
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
from django.http import HttpResponse, Http404, HttpResponseRedirect
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
from django.shortcuts import get_object_or_404, render_to_response
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
from django.template.loader import render_to_string
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
from django.utils import feedgenerator
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
from django.utils.translation import ugettext as _
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
from django.template import RequestContext
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
from django.contrib.auth.models import AnonymousUser  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
from cm.security import get_viewable_activities
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
from cm.models import ApplicationConfiguration, Activity, Configuration
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
import time
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
from cm.exception import UnauthorizedException
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
import re
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
# taken from django's feedgenerator.py and changed to support multiple posts in minute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
def get_tag_uri(url, date):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
    "Creates a TagURI. See http://diveintomark.org/archives/2004/05/28/howto-atom-id"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
    tag = re.sub('^http://', '', url)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
    if date is not None:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
        tag = re.sub('/', ',%s:/' % time.mktime(date.timetuple()), tag, 1)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
    tag = re.sub('#', '/', tag)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
    return u'tag:' + tag
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
def public_feed(request):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
    feed_title = _(u"%(workspace_name)s's public feed" % {'workspace_name' : ApplicationConfiguration['workspace_name']})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
    feed_description = _(u"Workspace %(workspace_name)s public activity feed") % {'workspace_name' : ApplicationConfiguration['workspace_name']}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
    request.user = AnonymousUser()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
    activitites = get_viewable_activities(request, {'view_comments' : 1, 'view_texts' : 1})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
    return _feed(request, activitites, feed_title, feed_description)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
def private_feed(request, key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    private_feed_key = Configuration.objects.get_key('private_feed_key', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
    if private_feed_key != key:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
        raise Http404
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
    feed_title = _(u"%(workspace_name)s's private feed" % {'workspace_name' : ApplicationConfiguration['workspace_name']})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
    feed_description = _(u"Workspace %(workspace_name)s private feed") % {'workspace_name' : ApplicationConfiguration['workspace_name']}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
    activities = Activity.objects.filter(type__in=Activity.ACTIVITIES_TYPES).order_by('-created')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
    return _feed(request, activities, feed_title, feed_description)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
def _feed(request, activities, feed_title, feed_description):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
    feed = feedgenerator.Atom1Feed(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
        title=feed_title,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
        link=settings.SITE_URL,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
        description=feed_description,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
        language='en' # TODO: something better to do?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
    )    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
    for activity in activities:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
        item_data = activity.printable_data()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
        item_data_text = activity.printable_data(html=False, link=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
        item_metadata = activity.created # TODO dateformat
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
        item_body = render_to_string('feed/feed_item.txt',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
                                   { 'title': item_data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
                                     'body' : item_metadata,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
                                     }, context_instance = RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
        feed.add_item(title=item_data_text,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
               link=settings.SITE_URL,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
               description=item_body,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
               pubdate=activity.created,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
               unique_id=get_tag_uri(settings.SITE_URL, activity.created),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
               author_name=activity.user.username if activity.user else '-',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
               )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
    response = HttpResponse(mimetype=feed.mime_type)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
    feed.write(response, 'utf-8')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
    return response
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
def text_feed(request, key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
    from cm.views import get_text_by_keys_or_404    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
    feed_title = _(u"Text %(text_title)s's public feed" % {'text_title' : text.title})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
    feed_description = _(u"Public activity feed for text %(text_title)s") % {'text_title' : text.title}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
    request.user = AnonymousUser()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
    activitites = get_viewable_activities(request, {'view_comments' : 1, 'view_texts' : 1}, text=text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
    return _feed(request, activitites, feed_title, feed_description)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
def text_feed_private(request, key, private_feed_key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
    from cm.views import get_text_by_keys_or_404    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
    if text.private_feed_key != private_feed_key:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
        raise Http404
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
    feed_title = _(u"Text %(text_title)s's private feed" % {'text_title' : text.title})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
    feed_description = _(u"Private activity feed for text %(text_title)s") % {'text_title' : text.title}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
    activities = Activity.objects.filter(type__in=Activity.ACTIVITIES_TYPES, text=text).order_by('-created')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
    return _feed(request, activities, feed_title, feed_description)