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
|
2009-09-08 04:27:27 +00:00
|
|
|
from django.db import IntegrityError
|
2009-08-29 19:34:42 +00:00
|
|
|
try:
|
2010-01-12 01:19:37 +00:00
|
|
|
from apps.rss_feeds.models import Feed, Story, Tag, StoryAuthor
|
2009-08-29 19:34:42 +00:00
|
|
|
except:
|
|
|
|
pass
|
2009-07-25 15:24:27 +00:00
|
|
|
from django.core.cache import cache
|
2010-01-24 22:53:46 -05:00
|
|
|
from django.views.decorators.cache import never_cache
|
2010-01-07 00:04:12 +00:00
|
|
|
from django.db.models.aggregates import Count
|
2009-07-28 02:27:27 +00:00
|
|
|
from apps.reader.models import UserSubscription, UserSubscriptionFolders, UserStory
|
2009-08-29 19:34:42 +00:00
|
|
|
from utils import json
|
2009-06-16 03:08:55 +00:00
|
|
|
from utils.user_functions import get_user
|
2010-01-24 22:53:46 -05:00
|
|
|
from django.core.urlresolvers import reverse
|
2009-06-16 03:08:55 +00:00
|
|
|
from django.contrib.auth.models import User
|
2010-01-17 20:00:12 -05:00
|
|
|
from django.contrib.auth.forms import AuthenticationForm
|
|
|
|
from django.contrib.auth import authenticate, login
|
|
|
|
from django.http import HttpResponse, HttpRequest, HttpResponseRedirect
|
2009-06-16 03:08:55 +00:00
|
|
|
from django.core import serializers
|
|
|
|
from django.utils.safestring import mark_safe
|
2009-08-13 03:26:12 +00:00
|
|
|
from djangologging.decorators import suppress_logging_output
|
2010-01-21 13:12:29 -05:00
|
|
|
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
|
2009-07-19 16:55:08 +00:00
|
|
|
import logging
|
2009-06-16 03:08:55 +00:00
|
|
|
import datetime
|
|
|
|
import threading
|
2009-08-29 19:34:42 +00:00
|
|
|
import random
|
2009-06-16 03:08:55 +00:00
|
|
|
|
2009-07-28 02:27:27 +00:00
|
|
|
SINGLE_DAY = 60*60*24
|
2009-08-08 16:52:11 +00:00
|
|
|
|
2010-01-24 22:53:46 -05:00
|
|
|
@never_cache
|
2009-06-16 03:08:55 +00:00
|
|
|
def index(request):
|
2010-01-24 22:53:46 -05:00
|
|
|
print "User: %s" % request.user
|
2010-01-17 20:00:12 -05:00
|
|
|
form = AuthenticationForm(request.POST)
|
|
|
|
return render_to_response('reader/feeds.xhtml', {'form': form},
|
2009-06-16 03:08:55 +00:00
|
|
|
context_instance=RequestContext(request))
|
|
|
|
|
2010-01-24 22:53:46 -05:00
|
|
|
@never_cache
|
2010-01-17 20:00:12 -05:00
|
|
|
def login(request):
|
2010-01-24 22:53:46 -05:00
|
|
|
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)
|
2010-01-17 20:00:12 -05:00
|
|
|
|
2010-01-24 22:53:46 -05:00
|
|
|
@never_cache
|
|
|
|
def logout(request):
|
|
|
|
print "Logout: %s" % request.user
|
|
|
|
from django.contrib.auth import logout
|
|
|
|
logout(request)
|
|
|
|
|
|
|
|
return HttpResponseRedirect(reverse('index'))
|
|
|
|
|
2009-06-16 03:08:55 +00:00
|
|
|
def load_feeds(request):
|
|
|
|
user = get_user(request)
|
2010-02-11 01:28:47 -05:00
|
|
|
feeds = {}
|
|
|
|
|
|
|
|
folders = UserSubscriptionFolders.objects.get(user=user)
|
|
|
|
user_subs = UserSubscription.objects.select_related('feed').filter(user=user)
|
2009-07-19 00:39:59 +00:00
|
|
|
|
2010-02-11 01:28:47 -05:00
|
|
|
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,
|
|
|
|
}
|
2009-07-28 02:27:27 +00:00
|
|
|
|
2010-02-11 01:28:47 -05:00
|
|
|
data = dict(feeds=feeds, folders=json.decode(folders.folders))
|
|
|
|
return HttpResponse(json.encode(data), mimetype='application/json')
|
2009-06-16 03:08:55 +00:00
|
|
|
|
|
|
|
def load_single_feed(request):
|
|
|
|
user = get_user(request)
|
|
|
|
|
|
|
|
offset = int(request.REQUEST.get('offset', 0))
|
2009-08-01 04:26:57 +00:00
|
|
|
limit = int(request.REQUEST.get('limit', 50))
|
2009-07-05 21:45:46 +00:00
|
|
|
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)
|
2009-08-01 04:26:57 +00:00
|
|
|
force_update = request.GET.get('force_update', False)
|
2009-06-16 03:08:55 +00:00
|
|
|
|
2010-02-17 03:22:45 -05:00
|
|
|
stories = feed.get_stories(offset, limit)
|
2009-07-05 21:45:46 +00:00
|
|
|
|
2009-06-16 03:08:55 +00:00
|
|
|
if force_update:
|
2009-08-01 04:26:57 +00:00
|
|
|
feed.update(force_update)
|
2009-06-16 03:08:55 +00:00
|
|
|
|
2010-01-21 13:12:29 -05:00
|
|
|
# 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)
|
2009-07-28 02:27:27 +00:00
|
|
|
|
|
|
|
# print "Feed: %s %s" % (feed, usersub)
|
|
|
|
logging.debug("Feed: " + feed.feed_title)
|
|
|
|
userstory = UserStory.objects.filter(
|
|
|
|
user=user,
|
2010-01-21 13:12:29 -05:00
|
|
|
feed=feed.id,
|
|
|
|
read_date__gt=usersub.mark_read_date
|
2009-07-28 02:27:27 +00:00
|
|
|
).values()
|
|
|
|
for story in stories:
|
|
|
|
for o in userstory:
|
2009-09-08 04:27:27 +00:00
|
|
|
if o['story_id'] == story.get('id'):
|
2009-07-28 02:27:27 +00:00
|
|
|
story['opinion'] = o['opinion']
|
2009-08-01 04:26:57 +00:00
|
|
|
story['read_status'] = (o['read_date'] is not None)
|
2009-07-28 02:27:27 +00:00
|
|
|
break
|
2009-09-08 04:27:27 +00:00
|
|
|
if not story.get('read_status') and story['story_date'] < usersub.mark_read_date:
|
2009-07-28 02:27:27 +00:00
|
|
|
story['read_status'] = 1
|
2009-09-08 04:27:27 +00:00
|
|
|
elif not story.get('read_status') and story['story_date'] > usersub.last_read_date:
|
2009-07-28 02:27:27 +00:00
|
|
|
story['read_status'] = 0
|
2010-01-21 13:12:29 -05:00
|
|
|
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),
|
|
|
|
}
|
2009-07-28 02:27:27 +00:00
|
|
|
# logging.debug("Story: %s" % story)
|
2009-06-16 03:08:55 +00:00
|
|
|
|
2010-01-21 13:12:29 -05:00
|
|
|
# Intelligence
|
|
|
|
|
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]
|
2010-01-12 01:19:37 +00:00
|
|
|
feed_tags = [(tag.name, tag.stories_count) for tag in all_tags if tag.stories_count > 1]
|
2010-01-07 00:04:12 +00:00
|
|
|
|
2010-01-12 01:19:37 +00:00
|
|
|
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]
|
|
|
|
|
2010-01-21 13:12:29 -05:00
|
|
|
context = dict(stories=stories, feed_tags=feed_tags, feed_authors=feed_authors)
|
2009-08-29 19:34:42 +00:00
|
|
|
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
|
|
|
|
2009-08-13 03:26:12 +00:00
|
|
|
@suppress_logging_output
|
|
|
|
def load_feed_page(request):
|
|
|
|
feed = Feed.objects.get(id=request.REQUEST.get('feed_id'))
|
2010-01-27 16:28:57 -05:00
|
|
|
if feed.page_data:
|
|
|
|
data = feed.page_data
|
|
|
|
else:
|
|
|
|
data = "Give it 10 minutes..."
|
2009-08-13 03:26:12 +00:00
|
|
|
|
|
|
|
return HttpResponse(data, mimetype='text/html')
|
2009-06-16 03:08:55 +00:00
|
|
|
|
|
|
|
@login_required
|
|
|
|
def mark_story_as_read(request):
|
2010-02-17 03:22:45 -05:00
|
|
|
story_ids = request.REQUEST['story_id'].split(',')
|
2009-08-29 19:34:42 +00:00
|
|
|
feed_id = int(request.REQUEST['feed_id'])
|
2010-02-17 03:22:45 -05:00
|
|
|
|
|
|
|
data = dict(code=0, payload=story_ids)
|
|
|
|
|
|
|
|
for story_id in story_ids:
|
|
|
|
logging.debug("Marked Read: %s (%s)" % (story_id, feed_id))
|
|
|
|
m = UserStory(story_id=int(story_id), user=request.user, feed_id=feed_id)
|
|
|
|
try:
|
|
|
|
m.save()
|
|
|
|
data.update({'code': 1})
|
|
|
|
except IntegrityError, e:
|
|
|
|
data.update({'code': -1})
|
2009-06-16 03:08:55 +00:00
|
|
|
|
2010-02-17 03:22:45 -05:00
|
|
|
return HttpResponse(json.encode(data))
|
2009-06-16 03:08:55 +00:00
|
|
|
|
|
|
|
@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()
|
2009-09-08 04:27:27 +00:00
|
|
|
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)
|
|
|
|
|
2009-07-05 21:45:46 +00:00
|
|
|
@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)
|
|
|
|
|
2009-08-29 19:34:42 +00:00
|
|
|
previous_opinion = UserStory.objects.get(story=story,
|
2009-07-28 02:27:27 +00:00
|
|
|
user=request.user,
|
|
|
|
feed=story.story_feed)
|
2009-07-05 21:45:46 +00:00
|
|
|
if previous_opinion and previous_opinion.opinion != opinion:
|
|
|
|
previous_opinion.opinion = opinion
|
2009-08-29 19:34:42 +00:00
|
|
|
data = json.encode(dict(code=0))
|
2009-07-05 21:45:46 +00:00
|
|
|
previous_opinion.save()
|
2009-07-19 16:55:08 +00:00
|
|
|
logging.debug("Changed Opinion: " + str(previous_opinion.opinion) + ' ' + str(opinion))
|
2009-07-05 21:45:46 +00:00
|
|
|
else:
|
2009-07-19 16:55:08 +00:00
|
|
|
logging.debug("Marked Opinion: " + str(story_id) + ' ' + str(opinion))
|
2009-08-29 19:34:42 +00:00
|
|
|
m = UserStory(story=story, user=request.user, feed=story.story_feed, opinion=opinion)
|
|
|
|
data = json.encode(dict(code=0))
|
2009-07-05 21:45:46 +00:00
|
|
|
try:
|
|
|
|
m.save()
|
|
|
|
except:
|
2009-08-29 19:34:42 +00:00
|
|
|
data = json.encode(dict(code=2))
|
2009-07-05 21:45:46 +00:00
|
|
|
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-08-29 19:34:42 +00:00
|
|
|
|
2009-06-16 03:08:55 +00:00
|
|
|
def _parse_user_info(user):
|
|
|
|
return {
|
|
|
|
'user_info': {
|
2009-08-29 19:34:42 +00:00
|
|
|
'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
|
|
|
}
|