src/cm/views/feeds.py
author raph
Wed, 24 Mar 2010 16:14:19 +0100
changeset 228 3a0f8b54a151
parent 169 132100852cd6
permissions -rw-r--r--
add tracking HTML from configuration
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
169
132100852cd6 fix feed unique id generator
raph
parents: 0
diff changeset
    15
from urlparse import urlparse
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
# 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
    17
def get_tag_uri(url, date):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
    "Creates a TagURI. See http://diveintomark.org/archives/2004/05/28/howto-atom-id"
169
132100852cd6 fix feed unique id generator
raph
parents: 0
diff changeset
    19
    parsed_url = urlparse(url)
132100852cd6 fix feed unique id generator
raph
parents: 0
diff changeset
    20
    time_stp = time.mktime(date.timetuple()) if date is not None else ''
132100852cd6 fix feed unique id generator
raph
parents: 0
diff changeset
    21
    return u'tag:%s,%s:%s' %(parsed_url.hostname, time_stp, parsed_url.path) # + '/' + parsed_url.fragment
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
def public_feed(request):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
    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
    26
    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
    27
    request.user = AnonymousUser()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
    activitites = get_viewable_activities(request, {'view_comments' : 1, 'view_texts' : 1})
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
    return _feed(request, activitites, feed_title, feed_description)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
def private_feed(request, key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
    private_feed_key = Configuration.objects.get_key('private_feed_key', None)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
    if private_feed_key != key:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
        raise Http404
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
    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
    37
    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
    38
    activities = Activity.objects.filter(type__in=Activity.ACTIVITIES_TYPES).order_by('-created')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
    return _feed(request, activities, feed_title, feed_description)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
def _feed(request, activities, feed_title, feed_description):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
    feed = feedgenerator.Atom1Feed(
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
        title=feed_title,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
        link=settings.SITE_URL,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
        description=feed_description,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
        language='en' # TODO: something better to do?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
    )    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
    for activity in activities:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
        item_data = activity.printable_data()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
        item_data_text = activity.printable_data(html=False, link=False)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
        item_metadata = activity.created # TODO dateformat
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
        item_body = render_to_string('feed/feed_item.txt',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
                                   { 'title': item_data,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
                                     'body' : item_metadata,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
                                     }, context_instance = RequestContext(request))
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
        feed.add_item(title=item_data_text,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
               link=settings.SITE_URL,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
               description=item_body,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
               pubdate=activity.created,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
               unique_id=get_tag_uri(settings.SITE_URL, activity.created),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
               author_name=activity.user.username if activity.user else '-',
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
               )
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
    response = HttpResponse(mimetype=feed.mime_type)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
    feed.write(response, 'utf-8')
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
    return response
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
def text_feed(request, key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
    from cm.views import get_text_by_keys_or_404    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
    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
    73
    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
    74
    request.user = AnonymousUser()
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
    activitites = get_viewable_activities(request, {'view_comments' : 1, 'view_texts' : 1}, text=text)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
    return _feed(request, activitites, feed_title, feed_description)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
def text_feed_private(request, key, private_feed_key):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
    from cm.views import get_text_by_keys_or_404    
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
    text = get_text_by_keys_or_404(key)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
    if text.private_feed_key != private_feed_key:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
        raise Http404
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
    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
    85
    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
    86
    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
    87
    return _feed(request, activities, feed_title, feed_description)