src/cm/views/feeds.py
author Simon Descarpentries <sid@sopinspace.com>
Mon, 21 Oct 2013 16:37:07 +0200
changeset 553 bf26fb47a14c
parent 169 132100852cd6
permissions -rw-r--r--
To allow scrolling in Safari mobile, we set the content of text_view_comments frame in a jQuery UI layout. So the automated scrolling operations in c_sync.js must be adjustable to the right part to scroll. Also, if a comment have to be shown outside of the current viewport, we scroll the correct part to that viewport and then set the comment top Y offset to juste what it needs to avoid the "Add comment" button after scrolling operation. If not in Safari mobile, we add an offset here to avoid comment to display under the "Add comment" button.
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)