NewsBlur/apps/reader/views.py

230 lines
8.4 KiB
Python

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:
from apps.rss_feeds.models import Feed, Story, Tag, StoryAuthor
except:
pass
from django.core.cache import cache
from django.views.decorators.cache import never_cache
from django.db.models.aggregates import Count
from apps.reader.models import UserSubscription, UserSubscriptionFolders, UserStory
from utils import json
from utils.user_functions import get_user
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import authenticate, login
from django.http import HttpResponse, HttpRequest, HttpResponseRedirect
from django.core import serializers
from django.utils.safestring import mark_safe
from djangologging.decorators import suppress_logging_output
from apps.analyzer.models import ClassifierFeed, ClassifierAuthor, ClassifierTag, ClassifierTitle
from apps.analyzer.models import apply_classifier_titles, apply_classifier_feeds, apply_classifier_authors, apply_classifier_tags
import logging
import datetime
import threading
import random
SINGLE_DAY = 60*60*24
@never_cache
def index(request):
print "User: %s" % request.user
form = AuthenticationForm(request.POST)
return render_to_response('reader/feeds.xhtml', {'form': form},
context_instance=RequestContext(request))
@never_cache
def login(request):
if request.method == "POST":
form = AuthenticationForm(data=request.POST)
if form.is_valid():
from django.contrib.auth import login
login(request, form.get_user())
return HttpResponseRedirect(reverse('index'))
return index(request)
@never_cache
def logout(request):
print "Logout: %s" % request.user
from django.contrib.auth import logout
logout(request)
return HttpResponseRedirect(reverse('index'))
def load_feeds(request):
user = get_user(request)
feeds = {}
folders = UserSubscriptionFolders.objects.get(user=user)
user_subs = UserSubscription.objects.select_related('feed').filter(user=user)
for sub in user_subs:
feeds[sub.feed.pk] = {
'id': sub.feed.pk,
'feed_title': sub.feed.feed_title,
'feed_link': sub.feed.feed_link,
'unread_count_positive': sub.unread_count_positive,
'unread_count_neutral': sub.unread_count_neutral,
'unread_count_negative': sub.unread_count_negative,
}
data = dict(feeds=feeds, folders=json.decode(folders.folders))
return HttpResponse(json.encode(data), mimetype='application/json')
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
feed_id = request.REQUEST['feed_id']
feed = Feed.objects.get(id=feed_id)
force_update = request.GET.get('force_update', False)
stories = feed.get_stories(offset, limit)
if force_update:
feed.update(force_update)
# Get intelligence classifier for user
classifier_feeds = ClassifierFeed.objects.filter(user=user, feed=feed)
classifier_authors = ClassifierAuthor.objects.filter(user=user, feed=feed)
classifier_titles = ClassifierTitle.objects.filter(user=user, feed=feed)
classifier_tags = ClassifierTag.objects.filter(user=user, feed=feed)
usersub = UserSubscription.objects.get(user=user, feed=feed)
# print "Feed: %s %s" % (feed, usersub)
logging.debug("Feed: " + feed.feed_title)
userstory = UserStory.objects.filter(
user=user,
feed=feed.id,
read_date__gt=usersub.mark_read_date
).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
story['intelligence'] = {
'feed': apply_classifier_feeds(classifier_feeds, feed),
'author': apply_classifier_authors(classifier_authors, story),
'tags': apply_classifier_tags(classifier_tags, story),
'title': apply_classifier_titles(classifier_titles, story),
}
# logging.debug("Story: %s" % story)
# Intelligence
all_tags = Tag.objects.filter(feed=feed)\
.annotate(stories_count=Count('story'))\
.order_by('-stories_count')[:20]
feed_tags = [(tag.name, tag.stories_count) for tag in all_tags if tag.stories_count > 1]
all_authors = StoryAuthor.objects.filter(feed=feed)\
.annotate(stories_count=Count('story'))\
.order_by('-stories_count')[:20]
feed_authors = [(author.author_name, author.stories_count) for author in all_authors\
if author.stories_count > 1]
context = dict(stories=stories, feed_tags=feed_tags, feed_authors=feed_authors)
data = json.encode(context)
return HttpResponse(data, mimetype='application/json')
@suppress_logging_output
def load_feed_page(request):
feed = Feed.objects.get(id=request.REQUEST.get('feed_id'))
if feed.page_data:
data = feed.page_data
else:
data = "Give it 10 minutes..."
return HttpResponse(data, mimetype='text/html')
@login_required
def mark_story_as_read(request):
story_id = int(request.REQUEST['story_id'])
feed_id = int(request.REQUEST['feed_id'])
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))
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)
code = 0
us = UserSubscription.objects.get(feed=feed, user=request.user)
try:
us.mark_feed_read()
except IntegrityError, e:
code = -1
else:
code = 1
data = json.encode(dict(code=code))
# UserStory.objects.filter(user=request.user, feed=feed_id).delete()
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)
@login_required
def get_read_feed_items(request, username):
feeds = get_list_or_404(Feed)
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')
}
}