Speeding up All Site Stories. Also beta-ing river with read_filter of all (not just unread).

This commit is contained in:
Samuel Clay 2013-01-10 12:06:57 -08:00
parent 4d8920ce9b
commit 6470c2ee08
6 changed files with 84 additions and 55 deletions

View file

@ -742,6 +742,17 @@ def load_river_stories__redis(request):
# Find starred stories
if found_feed_ids:
if read_filter == 'all':
story_ids = [story['id'] for story in stories]
userstories_db = MUserStory.objects(user_id=user.pk,
feed_id__in=found_feed_ids,
story_id__in=story_ids
).only('story_id').hint([('user_id', 1),
('feed_id', 1),
('story_id', 1)])
userstories = set(us.story_id for us in userstories_db)
else:
userstories = []
starred_stories = MStarredStory.objects(
user_id=user.pk,
story_feed_id__in=found_feed_ids
@ -749,6 +760,7 @@ def load_river_stories__redis(request):
starred_stories = dict([(story.story_guid, story.starred_date)
for story in starred_stories])
else:
userstories = []
starred_stories = {}
# Intelligence classifiers for all feeds involved
@ -772,9 +784,13 @@ def load_river_stories__redis(request):
classifier_titles=classifier_titles,
classifier_tags=classifier_tags)
# Just need to format stories
for story in stories:
story['read_status'] = 0
if read_filter == 'all' and story['id'] in userstories:
story['read_status'] = 1
else:
story['read_status'] = 0
story_date = localtime_for_timezone(story['story_date'], user.profile.timezone)
story['short_parsed_date'] = format_story_link_date__short(story_date, now)
story['long_parsed_date'] = format_story_link_date__long(story_date, now)

View file

@ -1707,11 +1707,11 @@ background: transparent;
position: absolute;
}
#story_pane .NB-story-iframe {
#story_pane .NB-text-view {
left: 200%;
top: 0;
}
#story_pane .NB-text-view {
#story_pane .NB-story-iframe {
left: 300%;
top: 0;
}
@ -3226,7 +3226,7 @@ background: transparent;
.NB-taskbar .NB-task-view-switch-arrow {
position: absolute;
top: 8px;
right: -8px;
left: -8px;
width: 16px;
height: 16px;
background: transparent url('/media/embed/icons/silk/arrow_switch.png') no-repeat center 0px;

View file

@ -536,8 +536,8 @@ NEWSBLUR.AssetModel = Backbone.Router.extend({
this.make_request('/reader/river_stories', {
feeds: feeds,
page: page,
order: this.view_setting(feed_id, 'order')
// read_filter: this.view_setting(feed_id, 'read_filter')
order: this.view_setting(feed_id, 'order'),
read_filter: this.view_setting(feed_id, 'read_filter')
}, pre_callback, error_callback, {
'ajax_group': (page ? 'feed_page' : 'feed'),
'request_type': 'GET'

View file

@ -228,6 +228,18 @@ NEWSBLUR.Collections.Folders = Backbone.Collection.extend({
}
});
},
feeds_with_unreads: function(options) {
options = options || {};
return _.compact(_.flatten(this.map(function(item) {
if (item.is_feed()) {
return item.feed.has_unreads(options) && item.feed;
} else if (item.is_folder()) {
return item.folders.feeds_with_unreads(options);
}
})));
},
propagate_feed_selected: function() {
if (this.parent_folder) {

View file

@ -1404,7 +1404,7 @@
}
}
var feeds = this.list_feeds_with_unreads_in_folder($folder, false, true);
var feeds = this.list_feeds_with_unreads_in_folder(this.active_folder.folders, false, true);
this.cache['river_feeds_with_unreads'] = feeds;
this.hide_stories_error();
this.show_stories_progress_bar(feeds.length);
@ -1452,29 +1452,28 @@
}
},
list_feeds_with_unreads_in_folder: function($folder, counts_only, visible_only) {
list_feeds_with_unreads_in_folder: function(folder, counts_only, visible_only) {
var model = this.model;
var unread_view = this.get_unread_view_name();
$folder = $folder || this.$s.$feed_list;
folder = folder || this.active_folder.folders;
var $feeds = $('.feed:not(.NB-empty)', $folder);
var feeds = _.compact(_.map($('.feed:not(.NB-empty)', $folder), function(o) {
var feed_id = parseInt($(o).data('id'), 10);
var feed = model.get_feed(feed_id);
if (!feed) {
return;
} else if (counts_only && !visible_only) {
if (!folder || folder.get('fake')) {
folder = NEWSBLUR.assets.folders;
}
var feeds = _.compact(_.map(folder.feeds_with_unreads(), function(feed) {
if (counts_only && !visible_only) {
return feed.get('ps') + feed.get('nt') + feed.get('ng');
} else if (counts_only && visible_only) {
if (unread_view == 'positive') return feed.get('ps');
if (unread_view == 'neutral') return feed.get('ps') + feed.get('nt');
if (unread_view == 'negative') return feed.get('ps') + feed.get('nt') + feed.get('ng');
} else if (!counts_only && visible_only) {
if (unread_view == 'positive') return feed.get('ps') && feed_id;
if (unread_view == 'neutral') return (feed.get('ps') || feed.get('nt')) && feed_id;
if (unread_view == 'negative') return (feed.get('ps') || feed.get('nt') || feed.get('ng')) && feed_id;
if (unread_view == 'positive') return feed.get('ps') && feed.id;
if (unread_view == 'neutral') return (feed.get('ps') || feed.get('nt')) && feed.id;
if (unread_view == 'negative') return (feed.get('ps') || feed.get('nt') || feed.get('ng')) && feed.id;
} else {
return (feed.get('ps') || feed.get('nt') || feed.get('ng')) && feed_id;
return (feed.get('ps') || feed.get('nt') || feed.get('ng')) && feed.id;
}
}));
@ -1759,7 +1758,10 @@
NEWSBLUR.app.original_tab_view.iframe_not_busting();
this.model.flags['no_more_stories'] = true;
message = message || "Oh no! <br> There was an error!";
if (!message || message == 'error') {
message = "Oh no! <br> There was an error!";
}
if (data && data.status) {
if (data.status == 502) {
message = "NewsBlur is down right now. <br> Try again soon.";
@ -2345,8 +2347,8 @@
var $taskbar_buttons = $('.NB-taskbar .task_button_view');
var $feed_view = this.$s.$feed_view;
var $feed_iframe = this.$s.$feed_iframe;
var $page_to_feed_arrow = $('.NB-taskbar .NB-task-view-page-to-feed-arrow');
var $feed_to_story_arrow = $('.NB-taskbar .NB-task-view-feed-to-story-arrow');
var $to_feed_arrow = $('.NB-taskbar .NB-task-view-to-feed-arrow');
var $to_story_arrow = $('.NB-taskbar .NB-task-view-to-story-arrow');
var $to_text_arrow = $('.NB-taskbar .NB-task-view-to-text-arrow');
if (!options.skip_save_type && this.story_view != view) {
@ -2354,17 +2356,17 @@
}
this.hide_stories_error();
$page_to_feed_arrow.hide();
$feed_to_story_arrow.hide();
$to_feed_arrow.hide();
$to_story_arrow.hide();
$to_text_arrow.hide();
this.flags['page_view_showing_feed_view'] = false;
this.flags['feed_view_showing_story_view'] = false;
this.flags['temporary_story_view'] = false;
if (options.skip_save_type == 'page') {
$page_to_feed_arrow.show();
$to_feed_arrow.show();
this.flags['page_view_showing_feed_view'] = true;
} else if (options.skip_save_type == 'story') {
$feed_to_story_arrow.show();
$to_story_arrow.show();
this.flags['feed_view_showing_story_view'] = true;
} else if (options.skip_save_type == 'text') {
$to_text_arrow.show();
@ -2413,7 +2415,7 @@
});
NEWSBLUR.app.story_list.reset_story_positions();
} else if (view == 'story') {
} else if (view == 'text') {
$story_pane.animate({
'left': -2 * $feed_iframe.width()
}, {
@ -2421,11 +2423,11 @@
'duration': this.model.preference('animations') ? 550 : 0,
'queue': false
});
NEWSBLUR.app.story_tab_view.load_story_iframe();
NEWSBLUR.app.text_tab_view.load_story();
if (!this.active_story) {
this.show_next_story(1);
}
} else if (view == 'text') {
} else if (view == 'story') {
$story_pane.animate({
'left': -3 * $feed_iframe.width()
}, {
@ -2433,7 +2435,7 @@
'duration': this.model.preference('animations') ? 550 : 0,
'queue': false
});
NEWSBLUR.app.text_tab_view.load_story();
NEWSBLUR.app.story_tab_view.load_story_iframe();
if (!this.active_story) {
this.show_next_story(1);
}
@ -2451,20 +2453,20 @@
// view = 'page';
} else if ($active.hasClass('task_view_feed')) {
view = 'page';
} else if ($active.hasClass('task_view_story')) {
view = 'feed';
} else if ($active.hasClass('task_view_text')) {
view = 'story';
view = 'feed';
} else if ($active.hasClass('task_view_story')) {
view = 'text';
}
} else if (direction == 1) {
if ($active.hasClass('task_view_page')) {
view = 'feed';
} else if ($active.hasClass('task_view_feed')) {
view = 'story';
} else if ($active.hasClass('task_view_story')) {
view = 'text';
} else if ($active.hasClass('task_view_text')) {
// view = 'story';
view = 'story';
} else if ($active.hasClass('task_view_story')) {
// view = 'text';
}
}
@ -2834,7 +2836,11 @@
$.make('ul', { className: 'segmented-control NB-menu-manage-view-setting-order' }, [
$.make('li', { className: 'NB-view-setting-order-newest NB-active' }, 'Newest first'),
$.make('li', { className: 'NB-view-setting-order-oldest' }, 'Oldest')
])
]),
(NEWSBLUR.Globals.is_admin && $.make('ul', { className: 'segmented-control NB-menu-manage-view-setting-readfilter' }, [
$.make('li', { className: 'NB-view-setting-readfilter-all NB-active' }, 'All stories'),
$.make('li', { className: 'NB-view-setting-readfilter-unread' }, 'Unread only')
]))
]),
$.make('li', { className: 'NB-menu-separator' }),
$.make('li', { className: 'NB-menu-item NB-menu-manage-move NB-menu-manage-folder-move' }, [
@ -3698,7 +3704,6 @@
get_unread_count: function(visible_only, feed_id) {
var total = 0;
var $folder;
feed_id = feed_id || this.active_feed;
var feed = this.model.get_feed(feed_id);
@ -3719,12 +3724,7 @@
}
return total;
} else if (this.flags['river_view'] && !this.flags['social_view']) {
if (feed_id == 'river:') {
$folder = this.$s.$feed_list;
} else {
$folder = $('li.folder.NB-selected');
}
var counts = this.list_feeds_with_unreads_in_folder($folder, true, visible_only);
var counts = this.list_feeds_with_unreads_in_folder(this.active_folder.folders, true, visible_only);
return _.reduce(counts, function(m, c) { return m + c; }, 0);
} else if (this.flags['river_view'] && this.flags['social_view']) {
var unread_score = this.get_unread_view_score();

View file

@ -166,15 +166,7 @@
<div class="task_button_background"></div>
<div class="NB-task-image"></div>
<span class="NB-task-title">Feed</span>
<div class="NB-task-view-switch-arrow NB-task-view-feed-to-story-arrow"></div>
</div>
</li>
<li class="task_button task_button_view task_view_story">
<div class="NB-task-button-wrapper">
<div class="task_button_background"></div>
<div class="NB-task-image"></div>
<span class="NB-task-title">Story</span>
<div class="NB-task-view-switch-arrow NB-task-view-to-text-arrow"></div>
<div class="NB-task-view-switch-arrow NB-task-view-to-feed-arrow"></div>
</div>
</li>
<li class="task_button task_button_view task_view_text">
@ -182,6 +174,15 @@
<div class="task_button_background"></div>
<div class="NB-task-image"></div>
<span class="NB-task-title">Text</span>
<div class="NB-task-view-switch-arrow NB-task-view-to-text-arrow"></div>
</div>
</li>
<li class="task_button task_button_view task_view_story">
<div class="NB-task-button-wrapper">
<div class="task_button_background"></div>
<div class="NB-task-image"></div>
<span class="NB-task-title">Story</span>
<div class="NB-task-view-switch-arrow NB-task-view-to-story-arrow"></div>
</div>
</li>
</ul>
@ -233,10 +234,10 @@
<div class="NB-feed-story-view-floater"></div>
<ul class="NB-feed-stories"></ul>
</div>
<iframe id="story_iframe" class="NB-story-iframe"></iframe>
<div class="NB-text-view">
<div class="NB-text-view-detail"></div>
</div>
<iframe id="story_iframe" class="NB-story-iframe"></iframe>
</div>
</div>