From 0c33bc84cbd1e1a06435d54b141c38bb7acb5a69 Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Thu, 7 Jan 2010 00:04:12 +0000 Subject: [PATCH] Adding intelligence button for feeds. --- apps/analyzer/models.py | 5 +++++ apps/analyzer/views.py | 5 +++++ apps/reader/views.py | 12 +++++++++--- media/css/reader.css | 22 +++++++++++++++------- media/js/newsblur/assetmodel.js | 8 ++++---- media/js/newsblur/reader.js | 11 ++++++++--- 6 files changed, 46 insertions(+), 17 deletions(-) diff --git a/apps/analyzer/models.py b/apps/analyzer/models.py index 589a1e5f5..b5c50cf04 100644 --- a/apps/analyzer/models.py +++ b/apps/analyzer/models.py @@ -25,8 +25,10 @@ class Category(models.Model): def __unicode__(self): return '%s (%s)' % (self.category, self.count) + class ClassifierTitle(models.Model): user = models.ForeignKey(User) + score = models.SmallIntegerField() title = models.CharField(max_length=255) feed = models.ForeignKey(Feed) original_story = models.ForeignKey(Story) @@ -37,6 +39,7 @@ class ClassifierTitle(models.Model): class ClassifierAuthor(models.Model): user = models.ForeignKey(User) + score = models.SmallIntegerField() author = models.ForeignKey(StoryAuthor) feed = models.ForeignKey(Feed) original_story = models.ForeignKey(Story) @@ -47,6 +50,7 @@ class ClassifierAuthor(models.Model): class ClassifierFeed(models.Model): user = models.ForeignKey(User) + score = models.SmallIntegerField() feed = models.ForeignKey(Feed) original_story = models.ForeignKey(Story) creation_date = models.DateTimeField(auto_now=True) @@ -56,6 +60,7 @@ class ClassifierFeed(models.Model): class ClassifierTag(models.Model): user = models.ForeignKey(User) + score = models.SmallIntegerField() tag = models.ForeignKey(Tag) feed = models.ForeignKey(Feed) original_story = models.ForeignKey(Story) diff --git a/apps/analyzer/views.py b/apps/analyzer/views.py index f17a2e8c7..a13347c16 100644 --- a/apps/analyzer/views.py +++ b/apps/analyzer/views.py @@ -31,9 +31,11 @@ def save_classifier(request): payload = {} feed = Feed.objects.get(pk=post['feed_id']) story = Story.objects.get(pk=post['story_id']) + score = int(post['score']) if 'title' in post and 'title' in facets: ClassifierTitle.objects.create(user=request.user, + score=score, title=post['title'], feed=feed, original_story=story) @@ -41,12 +43,14 @@ def save_classifier(request): if 'author' in facets: author = story.story_author ClassifierAuthor.objects.create(user=request.user, + score=score, author=author, feed=feed, original_story=story) if 'publisher' in facets: ClassifierFeed.objects.create(user=request.user, + score=score, feed=feed, original_story=story) @@ -55,6 +59,7 @@ def save_classifier(request): for tag_name in tags: tag = Tag.objects.get(name=tag_name, feed=feed) ClassifierTag.objects.create(user=request.user, + score=score, tag=tag, feed=feed, original_story=story) diff --git a/apps/reader/views.py b/apps/reader/views.py index b219d4272..921768e32 100644 --- a/apps/reader/views.py +++ b/apps/reader/views.py @@ -3,10 +3,11 @@ 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 + from apps.rss_feeds.models import Feed, Story, Tag except: pass from django.core.cache import 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 @@ -115,9 +116,14 @@ def load_single_feed(request): story['read_status'] = 0 # logging.debug("Story: %s" % story) - context = stories + 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) - return HttpResponse(data, mimetype='text/html') + return HttpResponse(data, mimetype='application/json') def refresh_feed(request): feed_id = request.REQUEST['feed_id'] diff --git a/media/css/reader.css b/media/css/reader.css index 1c4c155b4..fba73b992 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -123,7 +123,7 @@ a img { #story_titles .feed_bar { font-weight: bold; font-size: 13px; - padding: 2px 140px 2px 28px; + padding: 2px 28px 2px 4px; background: #dadada url('../theme/images/dadada_40x100_textures_03_highlight_soft_75.png') 0 50% repeat-x; border-bottom: 2px solid #404040; position: relative; @@ -131,18 +131,26 @@ a img { #story_titles .feed_bar .feed_heading { display: block; - text-align: center; } #story_titles .feed_bar .feed_heading .feed_favicon { margin-right: 8px; - vertical-align: middle; + vertical-align: top; +} + +#story_titles .feed_bar .NB-feedbar-intelligence { + position: absolute; + right: 4px; + top: 2px; } #story_titles .feed_bar .unread_count { - position: absolute; - right: 4px; - top: 4px; + float: right; + padding: 0 8px; +} + +#story_titles .feed_bar .NB-button-intelligence { + float: right; } #story_titles .feed_bar .feed_id { @@ -775,4 +783,4 @@ form.opml_import_form input { .simplemodal-wrap { overflow: auto; -} \ No newline at end of file +} diff --git a/media/js/newsblur/assetmodel.js b/media/js/newsblur/assetmodel.js index 3ff2a3ff9..8ea4c92ac 100644 --- a/media/js/newsblur/assetmodel.js +++ b/media/js/newsblur/assetmodel.js @@ -156,14 +156,14 @@ NEWSBLUR.AssetModel.Reader.prototype = { load_feed: function(feed_id, page, first_load, callback) { var self = this; - var pre_callback = function(stories) { + var pre_callback = function(data) { if (feed_id != self.feed_id) { - self.stories = stories; + self.stories = data.stories; self.feed_id = feed_id; } else { - $.merge(self.stories, stories); + $.merge(self.stories, data.stories); } - callback(stories, first_load); + callback(data, first_load); }; this.make_request('/reader/load_single_feed', diff --git a/media/js/newsblur/reader.js b/media/js/newsblur/reader.js index f01f4dc6d..c66d7c5ed 100644 --- a/media/js/newsblur/reader.js +++ b/media/js/newsblur/reader.js @@ -340,12 +340,14 @@ this.switch_taskbar_view($taskbar_view_button); }, - create_story_titles: function(e, stories, first_load) { + create_story_titles: function(e, data, first_load) { var $story_titles = this.$story_titles; + var stories = data.stories; + var tags = data.tags; this.story_titles_clear_loading_endbar(); - NEWSBLUR.log(['Sample story: ', stories[0], stories.length]); + NEWSBLUR.log(['Sample story: ', stories[0], stories.length, tags]); for (s in stories) { var story = stories[s]; var $story_title = this.make_story_title(story); @@ -509,7 +511,10 @@ var feed = this.model.get_feed(feed_id); var $feed_bar = $.make('div', { className: 'feed_bar' }, [ - $.make('span', { className: 'unread_count' }, ''+feed.unread_count), + $.make('div', { className: 'NB-feedbar-intelligence' }, [ + $.make('a', { href: '#', className: 'NB-button-intelligence' }, 'Intelligence'), + $.make('span', { className: 'unread_count' }, ''+feed.unread_count) + ]), $.make('span', { className: 'feed_heading' }, [ $.make('img', { className: 'feed_favicon', src: this.google_favicon_url + feed.feed_link }), $.make('span', { className: 'feed_title' }, feed.feed_title)