Dynamically refreshing feeds in real-time. This is now a real-time service, and there's no looking back.

This commit is contained in:
Samuel Clay 2010-04-14 22:58:00 -04:00
parent b7d7b4b1a0
commit 67cc20c272
4 changed files with 86 additions and 12 deletions

View file

@ -8,6 +8,7 @@ urlpatterns = patterns('',
(r'^load_single_feed', views.load_single_feed),
(r'^load_feed_page', views.load_feed_page),
(r'^load_feeds', views.load_feeds),
(r'^refresh_feeds', views.refresh_feeds),
(r'^mark_story_as_read', views.mark_story_as_read),
(r'^mark_story_as_like', views.mark_story_as_like),
(r'^mark_story_as_dislike', views.mark_story_as_dislike),

View file

@ -78,14 +78,31 @@ def load_feeds(request):
'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,
'ps': sub.unread_count_positive,
'nt': sub.unread_count_neutral,
'ng': sub.unread_count_negative,
}
data = dict(feeds=feeds, folders=json.decode(folders.folders))
return HttpResponse(json.encode(data), mimetype='application/json')
def refresh_feeds(request):
user = get_user(request)
feeds = {}
user_subs = UserSubscription.objects.select_related('feed').filter(user=user)
for sub in user_subs:
if sub.needs_unread_recalc:
sub.calculate_feed_scores()
feeds[sub.feed.pk] = {
'ps': sub.unread_count_positive,
'nt': sub.unread_count_neutral,
'ng': sub.unread_count_negative,
}
return HttpResponse(json.encode(feeds), mimetype='application/json')
def load_single_feed(request):
user = get_user(request)

View file

@ -211,6 +211,30 @@ NEWSBLUR.AssetModel.Reader.prototype = {
}
},
refresh_feeds: function(callback) {
var self = this;
var pre_callback = function(feeds) {
var updated_feeds = [];
for (var f in feeds) {
var feed = feeds[f];
for (var k in feed) {
if (self.feeds[f][k] != feed[k]) {
// NEWSBLUR.log(['New Feed', self.feeds[f][k], feed[k], f, k]);
self.feeds[f][k] = feed[k];
if (!(f in updated_feeds)) {
updated_feeds.push(f);
}
}
}
}
callback(updated_feeds);
};
this.make_request('/reader/refresh_feeds', {}, pre_callback);
},
get_feed: function(feed_id) {
var self = this;

View file

@ -39,6 +39,7 @@
this.handle_keystrokes();
this.setup_feed_page_iframe_load();
this.load_intelligence_slider();
this.setup_feed_refresh();
};
NEWSBLUR.Reader.prototype = {
@ -392,13 +393,13 @@
make_feed_title_line: function(feed, list_item) {
var unread_class = '';
if (feed.unread_count_positive) {
if (feed.ps) {
unread_class += ' unread_positive';
}
if (feed.unread_count_neutral) {
if (feed.nt) {
unread_class += ' unread_neutral';
}
if (feed.unread_count_negative) {
if (feed.ng) {
unread_class += ' unread_negative';
}
var $feed = $.make((list_item?'li':'div'), { className: 'feed ' + unread_class }, [
@ -406,22 +407,22 @@
$.make('div', { className: 'feed_counts_floater' }, [
$.make('span', {
className: 'unread_count unread_count_positive '
+ (feed.unread_count_positive
+ (feed.ps
? "unread_count_full"
: "unread_count_empty")
}, ''+feed.unread_count_positive),
}, ''+feed.ps),
$.make('span', {
className: 'unread_count unread_count_neutral '
+ (feed.unread_count_neutral
+ (feed.nt
? "unread_count_full"
: "unread_count_empty")
}, ''+feed.unread_count_neutral),
}, ''+feed.nt),
$.make('span', {
className: 'unread_count unread_count_negative '
+ (feed.unread_count_negative
+ (feed.ng
? "unread_count_full"
: "unread_count_empty")
}, ''+feed.unread_count_negative)
}, ''+feed.ng)
])
]),
$.make('img', { className: 'feed_favicon', src: this.google_favicon_url + feed.feed_link }),
@ -1704,6 +1705,37 @@
},
// ===================
// = Feed Refreshing =
// ===================
setup_feed_refresh: function() {
var self = this;
var FEED_REFRESH_INTERVAL = 1000 * 60 * 5; // 5 minutes
this.flags.feed_refresh = setInterval(function() {
self.model.refresh_feeds($.rescope(self.post_feed_refresh, self));
}, FEED_REFRESH_INTERVAL);
},
post_feed_refresh: function(e, updated_feeds) {
var feeds = this.model.feeds;
for (var f in updated_feeds) {
var feed_id = updated_feeds[f];
var feed = this.model.get_feed(feed_id);
var $feed = this.make_feed_title_line(feed, true);
var $feed_on_page = this.find_feed_in_feed_list(feed_id);
var selected = $feed_on_page.hasClass('selected');
if (selected) {
$feed.addClass('selected');
}
NEWSBLUR.log(['UPDATING', feed.feed_title, $feed, $feed_on_page]);
$feed_on_page.replaceWith($feed);
$('.unread_count', $feed).corner('4px');
}
},
// ===========
// = Profile =
// ===========