NewsBlur/apps/reader/views.py

240 lines
8.2 KiB
Python
Raw Normal View History

2009-06-16 03:08:55 +00:00
from django.shortcuts import render_to_response, get_list_or_404, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.template import RequestContext
from django.db import IntegrityError
try:
2010-01-07 00:04:12 +00:00
from apps.rss_feeds.models import Feed, Story, Tag
except:
pass
from django.core.cache import cache
2010-01-07 00:04:12 +00:00
from django.db.models.aggregates import Count
from apps.reader.models import UserSubscription, UserSubscriptionFolders, UserStory
from utils import json
2009-06-16 03:08:55 +00:00
from utils.user_functions import get_user
from django.contrib.auth.models import User
from django.http import HttpResponse, HttpRequest
from django.core import serializers
from django.utils.safestring import mark_safe
from django.views.decorators.cache import cache_page
from djangologging.decorators import suppress_logging_output
import logging
2009-06-16 03:08:55 +00:00
import datetime
import threading
import random
2009-06-16 03:08:55 +00:00
SINGLE_DAY = 60*60*24
2009-06-16 03:08:55 +00:00
def index(request):
# feeds = Feed.objects.filter(usersubscription__user=request.user)
# for f in feeds:
# f.update()
# context = feeds
context = {}
print request.user
2009-06-16 03:08:55 +00:00
user = request.user
2009-06-22 15:28:20 +00:00
user_info = _parse_user_info(user)
2009-06-16 03:08:55 +00:00
context.update(user_info)
return render_to_response('reader/feeds.xhtml', context,
context_instance=RequestContext(request))
def load_feeds(request):
user = get_user(request)
feeds = cache.get('usersub:%s' % user)
if feeds is None:
us = UserSubscriptionFolders.objects.select_related('feed', 'user_sub').filter(
user=user
)
# logging.info('UserSubs: %s' % us)
feeds = []
folders = []
for sub in us:
# logging.info("UserSub Scores: %s" % sub.user_sub.scores)
feed_scores = sub.user_sub.scores or "[]"
sub.feed.scores = json.decode(feed_scores)
try:
sub.feed.unread_count = sub.user_sub.unread_count
except:
logging.warn("Subscription %s does not exist outside of Folder." % (sub.feed))
sub.delete()
else:
if sub.folder not in folders:
folders.append(sub.folder)
feeds.append({'folder': sub.folder, 'feeds': []})
for folder in feeds:
if folder['folder'] == sub.folder:
folder['feeds'].append(sub.feed)
# Alphabetize folders, then feeds inside folders
feeds.sort(lambda x, y: cmp(x['folder'].lower(), y['folder'].lower()))
for feed in feeds:
feed['feeds'].sort(lambda x, y: cmp(x.feed_title.lower(), y.feed_title.lower()))
for f in feed['feeds']:
f.feed_address = mark_safe(f.feed_address)
f.page_data = None
cache.set('usersub:%s' % user, feeds, SINGLE_DAY)
data = json.encode(feeds)
return HttpResponse(data, mimetype='text/html')
2009-06-16 03:08:55 +00:00
def load_single_feed(request):
user = get_user(request)
offset = int(request.REQUEST.get('offset', 0))
limit = int(request.REQUEST.get('limit', 50))
page = int(request.REQUEST.get('page', 0))
if page:
offset = limit * page
2009-06-16 03:08:55 +00:00
feed_id = request.REQUEST['feed_id']
feed = Feed.objects.get(id=feed_id)
force_update = request.GET.get('force_update', False)
2009-06-16 03:08:55 +00:00
stories = feed.get_stories(offset, limit)
2009-06-16 03:08:55 +00:00
if force_update:
feed.update(force_update)
2009-06-16 03:08:55 +00:00
usersub = UserSubscription.objects.get(user=user, feed=feed.id)
# print "Feed: %s %s" % (feed, usersub)
logging.debug("Feed: " + feed.feed_title)
userstory = UserStory.objects.filter(
user=user,
feed=feed.id
).values()
for story in stories:
for o in userstory:
if o['story_id'] == story.get('id'):
story['opinion'] = o['opinion']
story['read_status'] = (o['read_date'] is not None)
break
if not story.get('read_status') and story['story_date'] < usersub.mark_read_date:
story['read_status'] = 1
elif not story.get('read_status') and story['story_date'] > usersub.last_read_date:
story['read_status'] = 0
# logging.debug("Story: %s" % story)
2009-06-16 03:08:55 +00:00
2010-01-07 00:04:12 +00:00
all_tags = Tag.objects.filter(feed=feed)\
.annotate(stories_count=Count('story'))\
.order_by('-stories_count')[:20]
tags = [(tag.name, tag.stories_count) for tag in all_tags if tag.stories_count > 1]
context = dict(stories=stories, tags=tags, intelligence={})
data = json.encode(context)
2010-01-07 00:04:12 +00:00
return HttpResponse(data, mimetype='application/json')
2009-06-16 03:08:55 +00:00
def refresh_feed(request):
feed_id = request.REQUEST['feed_id']
force_update = request.GET.get('force', False)
feeds = Feed.objects.filter(id=feed_id)
feeds = refresh_feeds(feeds, force_update)
context = {}
user = request.user
user_info = _parse_user_info(user)
context.update(user_info)
return render_to_response('reader/feeds.xhtml', context,
context_instance=RequestContext(request))
def refresh_feeds(feeds, force=False):
for f in feeds:
logging.debug('Feed Updating: %s' % f)
f.update(force)
usersubs = UserSubscription.objects.filter(
feed=f.id
)
for us in usersubs:
us.count_unread()
logging.info('Deleteing user sub cache: %s' % us.user_id)
cache.delete('usersub:%s' % us.user_id)
return
@suppress_logging_output
def load_feed_page(request):
feed = Feed.objects.get(id=request.REQUEST.get('feed_id'))
data = feed.page_data
return HttpResponse(data, mimetype='text/html')
2009-06-16 03:08:55 +00:00
@login_required
def mark_story_as_read(request):
story_id = int(request.REQUEST['story_id'])
feed_id = int(request.REQUEST['feed_id'])
2009-06-16 03:08:55 +00:00
logging.debug("Marked Read: %s (%s)" % (story_id, feed_id))
m = UserStory(story_id=story_id, user=request.user, feed_id=feed_id)
data = json.encode(dict(code=0))
try:
m.save()
except IntegrityError, e:
data = json.encode(dict(code=2))
2009-06-16 03:08:55 +00:00
return HttpResponse(data)
@login_required
def mark_feed_as_read(request):
feed_id = int(request.REQUEST['feed_id'])
feed = Feed.objects.get(id=feed_id)
2009-09-08 04:37:38 +00:00
code = 0
2009-06-16 03:08:55 +00:00
us = UserSubscription.objects.get(feed=feed, user=request.user)
try:
2009-09-08 04:37:38 +00:00
us.mark_feed_read()
except IntegrityError, e:
2009-09-08 04:37:38 +00:00
code = -1
else:
code = 1
data = json.encode(dict(code=code))
# UserStory.objects.filter(user=request.user, feed=feed_id).delete()
2009-06-16 03:08:55 +00:00
return HttpResponse(data)
@login_required
def mark_story_as_like(request):
return mark_story_with_opinion(request, 1)
@login_required
def mark_story_as_dislike(request):
return mark_story_with_opinion(request, -1)
@login_required
def mark_story_with_opinion(request, opinion):
story_id = request.REQUEST['story_id']
story = Story.objects.select_related("story_feed").get(id=story_id)
previous_opinion = UserStory.objects.get(story=story,
user=request.user,
feed=story.story_feed)
if previous_opinion and previous_opinion.opinion != opinion:
previous_opinion.opinion = opinion
data = json.encode(dict(code=0))
previous_opinion.save()
logging.debug("Changed Opinion: " + str(previous_opinion.opinion) + ' ' + str(opinion))
else:
logging.debug("Marked Opinion: " + str(story_id) + ' ' + str(opinion))
m = UserStory(story=story, user=request.user, feed=story.story_feed, opinion=opinion)
data = json.encode(dict(code=0))
try:
m.save()
except:
data = json.encode(dict(code=2))
return HttpResponse(data)
2009-06-16 03:08:55 +00:00
@login_required
def get_read_feed_items(request, username):
feeds = get_list_or_404(Feed)
2009-06-16 03:08:55 +00:00
def _parse_user_info(user):
return {
'user_info': {
'is_anonymous': json.encode(user.is_anonymous()),
'is_authenticated': json.encode(user.is_authenticated()),
'username': json.encode(user.username if user.is_authenticated() else 'Anonymous')
2009-06-16 03:08:55 +00:00
}
2009-06-22 15:28:20 +00:00
}