mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
Back-end for river of news. Shows stories from feeds with unread stories. Works on folders and on everything. Doesn't show read status or intelligence classifiers, yet.
This commit is contained in:
parent
97df61d1c7
commit
0fad82c434
5 changed files with 70 additions and 25 deletions
|
@ -11,6 +11,7 @@ urlpatterns = patterns('',
|
|||
url(r'^load_feed_page', views.load_feed_page, name='load-feed-page'),
|
||||
url(r'^load_feeds_iphone', views.load_feeds_iphone, name='load-feeds-iphone'),
|
||||
url(r'^load_feeds', views.load_feeds, name='load-feeds'),
|
||||
url(r'^load_river_stories', views.load_river_stories, name='load-river-storiesw'),
|
||||
url(r'^refresh_feeds', views.refresh_feeds, name='refresh-feeds'),
|
||||
url(r'^load_starred_stories', views.load_starred_stories, name='load-starred-stories'),
|
||||
url(r'^mark_all_as_read', views.mark_all_as_read, name='mark-all-as-read'),
|
||||
|
|
|
@ -397,7 +397,42 @@ def load_starred_stories(request):
|
|||
logging.info(" ---> [%s] ~FCLoading starred stories: ~SB%s stories" % (request.user, len(stories)))
|
||||
|
||||
return dict(stories=stories)
|
||||
|
||||
@json.json_view
|
||||
def load_river_stories(request):
|
||||
user = get_user(request)
|
||||
feed_ids = [int(feed_id) for feed_id in request.POST.getlist('feeds')]
|
||||
offset = int(request.REQUEST.get('offset', 0))
|
||||
limit = int(request.REQUEST.get('limit', 25))
|
||||
page = int(request.REQUEST.get('page', 0))
|
||||
if page: offset = limit * page
|
||||
print feed_ids
|
||||
mstories = MStory.objects(story_feed_id__in=feed_ids)[offset:offset+limit]
|
||||
stories = Feed.format_stories(mstories)
|
||||
|
||||
starred_stories = MStarredStory.objects(user_id=user.pk, story_feed_id__in=feed_ids).only('story_guid', 'starred_date')
|
||||
starred_stories = dict([(story.story_guid, story.starred_date) for story in starred_stories])
|
||||
|
||||
for story in stories:
|
||||
story_date = localtime_for_timezone(story['story_date'], user.profile.timezone)
|
||||
story['short_parsed_date'] = format_story_link_date__short(story_date)
|
||||
story['long_parsed_date'] = format_story_link_date__long(story_date)
|
||||
story['read_status'] = 1
|
||||
if story['id'] in starred_stories:
|
||||
story['starred'] = True
|
||||
starred_date = localtime_for_timezone(starred_stories[story['id']], user.profile.timezone)
|
||||
story['starred_date'] = format_story_link_date__long(starred_date)
|
||||
story['intelligence'] = {
|
||||
'feed': 0,
|
||||
'author': 0,
|
||||
'tags': 0,
|
||||
'title': 0,
|
||||
}
|
||||
|
||||
logging.info(" ---> [%s] ~FCLoading river stories: ~SB%s stories ~SN(%s feeds)" % (
|
||||
request.user, len(stories), len(feed_ids)))
|
||||
|
||||
return dict(stories=stories)
|
||||
@ajax_login_required
|
||||
@json.json_view
|
||||
def mark_all_as_read(request):
|
||||
|
|
|
@ -626,6 +626,7 @@ body.NB-theme-serif #story_pane .NB-feed-story-content {
|
|||
background: #f6a828 url('../theme/images/ui-bg_highlight-hard_35_f6a828_1x100.png') 0 50% repeat-x;
|
||||
border-top: 1px solid #A8A8A8;
|
||||
border-bottom: 1px solid #A8A8A8;
|
||||
text-shadow: 1px 1px 0 #FAC898;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1038,7 +1039,7 @@ background: transparent;
|
|||
line-height: 1em;
|
||||
background: transparent url('../img/icons/silk/bullet_orange.png') no-repeat 14px 50%;
|
||||
}
|
||||
.NB-view-starred #story_titles .story {
|
||||
.NB-view-river #story_titles .story {
|
||||
padding-right: 326px;
|
||||
}
|
||||
|
||||
|
@ -1103,7 +1104,7 @@ background: transparent;
|
|||
color: #707070;
|
||||
overflow: hidden;
|
||||
}
|
||||
.NB-view-starred #story_titles .story .NB-story-feed {
|
||||
.NB-view-river #story_titles .story .NB-story-feed {
|
||||
display: block;
|
||||
}
|
||||
#story_titles .story .NB-story-feed .feed_favicon {
|
||||
|
|
|
@ -203,7 +203,7 @@ NEWSBLUR.AssetModel.Reader.prototype = {
|
|||
},
|
||||
|
||||
load_feed_precallback: function(data, feed_id, callback, first_load) {
|
||||
// NEWSBLUR.log(['pre_callback', data]);
|
||||
// NEWSBLUR.log(['load_feed_precallback', feed_id, first_load]);
|
||||
if ((feed_id != this.feed_id && data) || first_load) {
|
||||
this.stories = data.stories;
|
||||
this.feed_tags = data.feed_tags;
|
||||
|
|
|
@ -45,9 +45,10 @@
|
|||
'feed_view_story_positions': {},
|
||||
'iframe_story_positions_keys': [],
|
||||
'feed_view_story_positions_keys': [],
|
||||
'river_feeds_with_unreads': [],
|
||||
'mouse_position_y': parseInt(this.model.preference('lock_mouse_indicator'), 10)
|
||||
};
|
||||
this.FEED_REFRESH_INTERVAL = (1000 * 60) * 1; // 1 minute
|
||||
this.FEED_REFRESH_INTERVAL = (1000 * 60) * .1; // 1 minute
|
||||
|
||||
// ==================
|
||||
// = Event Handlers =
|
||||
|
@ -1176,6 +1177,7 @@
|
|||
'iframe_story_positions_keys': [],
|
||||
'feed_view_story_positions_keys': [],
|
||||
'previous_stories_stack': [],
|
||||
'river_feeds_with_unreads': [],
|
||||
'mouse_position_y': parseInt(this.model.preference('lock_mouse_indicator'), 10),
|
||||
'prefetch_last_story': 0,
|
||||
'prefetch_iteration': 0
|
||||
|
@ -1189,7 +1191,7 @@
|
|||
this.$s.$starred_header.removeClass('NB-selected');
|
||||
this.$s.$river_header.removeClass('NB-selected');
|
||||
$('.NB-selected', this.$s.$feed_list).removeClass('NB-selected');
|
||||
this.$s.$body.removeClass('NB-view-starred');
|
||||
this.$s.$body.removeClass('NB-view-river');
|
||||
$('.task_view_page', this.$s.$taskbar).removeClass('NB-disabled');
|
||||
},
|
||||
|
||||
|
@ -1374,7 +1376,7 @@
|
|||
this.iframe_scroll = null;
|
||||
this.mark_feed_as_selected(null, null);
|
||||
this.$s.$starred_header.addClass('NB-selected');
|
||||
this.$s.$body.addClass('NB-view-starred');
|
||||
this.$s.$body.addClass('NB-view-river');
|
||||
$('.task_view_page', this.$s.$taskbar).addClass('NB-disabled');
|
||||
var explicit_view_setting = NEWSBLUR.Preferences.view_settings[this.active_feed];
|
||||
if (!explicit_view_setting) {
|
||||
|
@ -1408,14 +1410,15 @@
|
|||
// = River of News =
|
||||
// =================
|
||||
|
||||
open_river_stories: function(feeds, folder_title) {
|
||||
open_river_stories: function($folder, folder_title) {
|
||||
var $story_titles = this.$s.$story_titles;
|
||||
$folder = $folder || this.$s.$feed_list;
|
||||
|
||||
$story_titles.empty().scrollTop('0px');
|
||||
this.reset_feed();
|
||||
this.hide_splash_page();
|
||||
if (!folder_title) {
|
||||
this.active_feed = 'river';
|
||||
this.active_feed = 'river:';
|
||||
this.$s.$river_header.addClass('NB-selected');
|
||||
} else {
|
||||
this.active_feed = 'river:' + folder_title;
|
||||
|
@ -1426,6 +1429,7 @@
|
|||
this.iframe_scroll = null;
|
||||
this.mark_feed_as_selected(null, null);
|
||||
this.$s.$body.addClass('NB-view-river');
|
||||
$folder.addClass('NB-selected');
|
||||
$('.task_view_page', this.$s.$taskbar).addClass('NB-disabled');
|
||||
var explicit_view_setting = NEWSBLUR.Preferences.view_settings[this.active_feed];
|
||||
if (!explicit_view_setting) {
|
||||
|
@ -1438,12 +1442,12 @@
|
|||
this.switch_taskbar_view(this.story_view);
|
||||
this.setup_mousemove_on_views();
|
||||
|
||||
var feeds = this.list_feeds_with_unreads_in_folder($folder);
|
||||
this.model.fetch_river_stories(feeds, 0, _.bind(this.post_open_river_stories, this), true);
|
||||
},
|
||||
|
||||
post_open_river_stories: function(data, first_load) {
|
||||
if (this.active_feed == 'river') {
|
||||
NEWSBLUR.log(['post_open_river_stories', data.stories, first_load]);
|
||||
if (this.active_feed.indexOf('river:') != 01) {
|
||||
this.flags['feed_view_positions_calculated'] = false;
|
||||
this.story_titles_clear_loading_endbar();
|
||||
this.create_story_titles(data.stories, {'river_stories': true});
|
||||
|
@ -1455,15 +1459,20 @@
|
|||
}
|
||||
},
|
||||
|
||||
open_river_stories_for_folder: function($folder, folder_title) {
|
||||
var feeds = this.list_feeds_with_unreads_in_folder($folder);
|
||||
|
||||
this.open_river_stories(feeds, folder_title);
|
||||
$folder.addClass('NB-selected');
|
||||
},
|
||||
|
||||
list_feeds_with_unreads_in_folder: function($folder) {
|
||||
var model = this.model;
|
||||
$folder = $folder || this.$s.$feed_list;
|
||||
|
||||
var $feeds = $('.feed:not(.NB-empty)', $folder);
|
||||
var feeds = _.compact(_.map($('.feed:not(.NB-empty)', $folder), function(o) {
|
||||
var feed_id = $(o).data('feed_id');
|
||||
var feed = model.get_feed(feed_id);
|
||||
return (feed.ps || feed.nt || feed.ng) && feed_id;
|
||||
}));
|
||||
|
||||
this.cache['river_feeds_with_unreads'] = feeds;
|
||||
|
||||
return feeds;
|
||||
},
|
||||
|
||||
// ==========================
|
||||
|
@ -1964,7 +1973,7 @@
|
|||
var score = this.compute_story_score(story);
|
||||
var score_color = 'neutral';
|
||||
var starred = story.starred ? ' NB-story-starred ' : '';
|
||||
if (story.starred) {
|
||||
if (options.river_stories) {
|
||||
var feed = this.model.get_feed(story.story_feed_id);
|
||||
}
|
||||
if (score > 0) score_color = 'positive';
|
||||
|
@ -1983,7 +1992,7 @@
|
|||
$.make('span', { className: 'NB-storytitles-author' }, story.story_authors),
|
||||
$story_tags
|
||||
]),
|
||||
(story.starred && feed && options['river_stories'] &&
|
||||
(options['river_stories'] && feed &&
|
||||
$.make('div', { className: 'NB-story-feed' }, [
|
||||
$.make('img', { className: 'feed_favicon', src: NEWSBLUR.Globals.google_favicon_url + feed.feed_link }),
|
||||
$.make('span', { className: 'feed_title' }, feed.feed_title)
|
||||
|
@ -2219,15 +2228,15 @@
|
|||
var $story_titles = this.$s.$story_titles;
|
||||
var feed_id = $story_titles.data('feed_id');
|
||||
var page = $story_titles.data('page');
|
||||
|
||||
|
||||
if (!this.flags['opening_feed']) {
|
||||
this.show_feedbar_loading();
|
||||
$story_titles.data('page', page+1);
|
||||
if (this.active_feed == 'starred') {
|
||||
this.model.fetch_starred_stories(page+1,
|
||||
_.bind(this.post_open_starred_stories, this), false);
|
||||
} else if (this.active_feed == 'river') {
|
||||
this.model.fetch_river_stories(page+1,
|
||||
} else if (this.active_feed.indexOf('river:') != -1) {
|
||||
this.model.fetch_river_stories(this.cache['river_feeds_with_unreads'], page+1,
|
||||
_.bind(this.post_open_river_stories, this), false);
|
||||
} else {
|
||||
this.model.load_feed(feed_id, page+1, false,
|
||||
|
@ -3914,7 +3923,7 @@
|
|||
stopPropagation = true;
|
||||
var $folder = $t.closest('li.folder');
|
||||
var folder_title = $t.siblings('.folder_title_text').text();
|
||||
self.open_river_stories_for_folder($folder, folder_title);
|
||||
self.open_river_stories($folder, folder_title);
|
||||
});
|
||||
if (stopPropagation) return;
|
||||
$.targetIs(e, { tagSelector: '#feed_list .folder_title' }, function($folder, $p){
|
||||
|
@ -3947,8 +3956,7 @@
|
|||
});
|
||||
$.targetIs(e, { tagSelector: '.NB-feeds-header-river' }, function($t, $p){
|
||||
e.preventDefault();
|
||||
var feeds = self.list_feeds_with_unreads_in_folder($t);
|
||||
self.open_river_stories(feeds);
|
||||
self.open_river_stories();
|
||||
});
|
||||
|
||||
// = Feed Bar =====================================================
|
||||
|
|
Loading…
Add table
Reference in a new issue