mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
Showing starred stories in their own feed view.
This commit is contained in:
parent
c69fce03a7
commit
fd88d41f74
5 changed files with 59 additions and 41 deletions
|
@ -110,7 +110,7 @@ class UserSubscription(models.Model):
|
||||||
unread_stories_db.append(story)
|
unread_stories_db.append(story)
|
||||||
elif isinstance(story.id, unicode) and story.id not in read_stories_ids:
|
elif isinstance(story.id, unicode) and story.id not in read_stories_ids:
|
||||||
unread_stories_db.append(story)
|
unread_stories_db.append(story)
|
||||||
stories = self.feed.format_stories(unread_stories_db)
|
stories = Feed.format_stories(unread_stories_db, self.feed.pk)
|
||||||
# if not silent:
|
# if not silent:
|
||||||
# logging.info(' ---> [%s] Format stories: %s' % (self.user, datetime.datetime.now() - now))
|
# logging.info(' ---> [%s] Format stories: %s' % (self.user, datetime.datetime.now() - now))
|
||||||
|
|
||||||
|
|
|
@ -164,7 +164,7 @@ def load_feeds(request):
|
||||||
if 'not_yet_fetched' not in feeds[f]:
|
if 'not_yet_fetched' not in feeds[f]:
|
||||||
feeds[f]['not_yet_fetched'] = False
|
feeds[f]['not_yet_fetched'] = False
|
||||||
|
|
||||||
starred_count = MStarredStory.objects(user_id=request.user.pk).count()
|
starred_count = MStarredStory.objects(user_id=user.pk).count()
|
||||||
|
|
||||||
data = {
|
data = {
|
||||||
'feeds': feeds,
|
'feeds': feeds,
|
||||||
|
@ -286,18 +286,12 @@ def load_single_feed(request):
|
||||||
classifier_titles = MClassifierTitle.objects(user_id=user.pk, feed_id=feed_id)
|
classifier_titles = MClassifierTitle.objects(user_id=user.pk, feed_id=feed_id)
|
||||||
classifier_tags = MClassifierTag.objects(user_id=user.pk, feed_id=feed_id)
|
classifier_tags = MClassifierTag.objects(user_id=user.pk, feed_id=feed_id)
|
||||||
|
|
||||||
try:
|
usersub = UserSubscription.objects.get(user=user, feed=feed)
|
||||||
usersub = UserSubscription.objects.get(user=user, feed=feed)
|
|
||||||
except UserSubscription.DoesNotExist:
|
|
||||||
# FIXME: Why is this happening for `conesus` when logged into another account?!
|
|
||||||
logging.info(" ***> [%s] UserSub DNE, creating: %s" % (user, feed))
|
|
||||||
usersub = UserSubscription.objects.create(user=user, feed=feed)
|
|
||||||
|
|
||||||
userstories = []
|
userstories = []
|
||||||
userstories_db = MUserStory.objects(user_id=user.pk,
|
userstories_db = MUserStory.objects(user_id=user.pk,
|
||||||
feed_id=feed.pk,
|
feed_id=feed.pk,
|
||||||
read_date__gte=usersub.mark_read_date)
|
read_date__gte=usersub.mark_read_date)
|
||||||
starred_stories = MStarredStory.objects(user_id=request.user.pk, story_feed_id=feed_id).only('story_guid')
|
starred_stories = MStarredStory.objects(user_id=user.pk, story_feed_id=feed_id).only('story_guid')
|
||||||
starred_stories = [story.story_guid for story in starred_stories]
|
starred_stories = [story.story_guid for story in starred_stories]
|
||||||
|
|
||||||
for us in userstories_db:
|
for us in userstories_db:
|
||||||
|
@ -380,14 +374,23 @@ def load_starred_stories(request):
|
||||||
page = int(request.REQUEST.get('page', 0))
|
page = int(request.REQUEST.get('page', 0))
|
||||||
if page: offset = limit * page
|
if page: offset = limit * page
|
||||||
|
|
||||||
mstories = MStarredStory.objects(user_id=user.pk).order_by('-story_date')[offset:offset+limit]
|
mstories = MStarredStory.objects(user_id=user.pk).order_by('-starred_date')[offset:offset+limit]
|
||||||
stories = []
|
stories = Feed.format_stories(mstories)
|
||||||
for story in mstories:
|
|
||||||
story_db = dict([(k, v) for k, v in story._data.items()
|
for story in stories:
|
||||||
if k is not None and v is not None])
|
story_date = localtime_for_timezone(story['story_date'], user.profile.timezone)
|
||||||
stories.append(dict(**story_db))
|
story['short_parsed_date'] = format_story_link_date__short(story_date)
|
||||||
print stories
|
story['long_parsed_date'] = format_story_link_date__long(story_date)
|
||||||
return stories
|
story['read_status'] = 1
|
||||||
|
story['starred'] = True
|
||||||
|
story['intelligence'] = {
|
||||||
|
'feed': 0,
|
||||||
|
'author': 0,
|
||||||
|
'tags': 0,
|
||||||
|
'title': 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
return dict(stories=stories)
|
||||||
|
|
||||||
@ajax_login_required
|
@ajax_login_required
|
||||||
@json.json_view
|
@json.json_view
|
||||||
|
@ -755,7 +758,8 @@ def mark_story_as_starred(request):
|
||||||
if story:
|
if story:
|
||||||
story_db = dict([(k, v) for k, v in story[0]._data.items()
|
story_db = dict([(k, v) for k, v in story[0]._data.items()
|
||||||
if k is not None and v is not None])
|
if k is not None and v is not None])
|
||||||
story_values = dict(user_id=request.user.pk, **story_db)
|
now = datetime.datetime.now()
|
||||||
|
story_values = dict(user_id=request.user.pk, starred_date=now, **story_db)
|
||||||
MStarredStory.objects.create(**story_values)
|
MStarredStory.objects.create(**story_values)
|
||||||
else:
|
else:
|
||||||
code = -1
|
code = -1
|
||||||
|
@ -766,10 +770,9 @@ def mark_story_as_starred(request):
|
||||||
@json.json_view
|
@json.json_view
|
||||||
def mark_story_as_unstarred(request):
|
def mark_story_as_unstarred(request):
|
||||||
code = 1
|
code = 1
|
||||||
feed_id = int(request.POST['feed_id'])
|
|
||||||
story_id = request.POST['story_id']
|
story_id = request.POST['story_id']
|
||||||
|
|
||||||
starred_story = MStarredStory.objects(user_id=request.user.pk, story_guid=story_id, story_feed_id=feed_id)
|
starred_story = MStarredStory.objects(user_id=request.user.pk, story_guid=story_id)
|
||||||
if starred_story:
|
if starred_story:
|
||||||
starred_story.delete()
|
starred_story.delete()
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -477,12 +477,13 @@ class Feed(models.Model):
|
||||||
|
|
||||||
if not stories or force:
|
if not stories or force:
|
||||||
stories_db = MStory.objects(story_feed_id=self.pk)[offset:offset+limit]
|
stories_db = MStory.objects(story_feed_id=self.pk)[offset:offset+limit]
|
||||||
stories = self.format_stories(stories_db)
|
stories = Feed.format_stories(stories_db, self.pk)
|
||||||
cache.set('feed_stories:%s-%s-%s' % (self.id, offset, limit), stories)
|
cache.set('feed_stories:%s-%s-%s' % (self.id, offset, limit), stories)
|
||||||
|
|
||||||
return stories
|
return stories
|
||||||
|
|
||||||
def format_stories(self, stories_db):
|
@classmethod
|
||||||
|
def format_stories(cls, stories_db, feed_id=None):
|
||||||
stories = []
|
stories = []
|
||||||
|
|
||||||
for story_db in stories_db:
|
for story_db in stories_db:
|
||||||
|
@ -493,8 +494,10 @@ class Feed(models.Model):
|
||||||
story['story_title'] = story_db.story_title
|
story['story_title'] = story_db.story_title
|
||||||
story['story_content'] = story_db.story_content_z and zlib.decompress(story_db.story_content_z)
|
story['story_content'] = story_db.story_content_z and zlib.decompress(story_db.story_content_z)
|
||||||
story['story_permalink'] = urllib.unquote(urllib.unquote(story_db.story_permalink))
|
story['story_permalink'] = urllib.unquote(urllib.unquote(story_db.story_permalink))
|
||||||
story['story_feed_id'] = self.pk
|
story['story_feed_id'] = feed_id or story_db.story_feed_id
|
||||||
story['id'] = story_db.story_guid
|
story['id'] = story_db.story_guid
|
||||||
|
if hasattr(story_db, 'starred_date'):
|
||||||
|
story['starred_date'] = story_db.starred_date
|
||||||
|
|
||||||
stories.append(story)
|
stories.append(story)
|
||||||
|
|
||||||
|
@ -799,6 +802,7 @@ class MStarredStory(mongo.Document):
|
||||||
"""Like MStory, but not inherited due to large overhead of _cls and _type in
|
"""Like MStory, but not inherited due to large overhead of _cls and _type in
|
||||||
mongoengine's inheritance model on every single row."""
|
mongoengine's inheritance model on every single row."""
|
||||||
user_id = mongo.IntField()
|
user_id = mongo.IntField()
|
||||||
|
starred_date = mongo.DateTimeField()
|
||||||
story_feed_id = mongo.IntField()
|
story_feed_id = mongo.IntField()
|
||||||
story_date = mongo.DateTimeField()
|
story_date = mongo.DateTimeField()
|
||||||
story_title = mongo.StringField(max_length=1024)
|
story_title = mongo.StringField(max_length=1024)
|
||||||
|
@ -814,8 +818,8 @@ class MStarredStory(mongo.Document):
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
'collection': 'starred_stories',
|
'collection': 'starred_stories',
|
||||||
'indexes': [('user_id', '-story_date'), 'story_feed_id'],
|
'indexes': [('user_id', '-starred_date'), 'story_feed_id'],
|
||||||
'ordering': ['-story_date'],
|
'ordering': ['-starred_date'],
|
||||||
'allow_inheritance': False,
|
'allow_inheritance': False,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -133,12 +133,11 @@ NEWSBLUR.AssetModel.Reader.prototype = {
|
||||||
}, callback);
|
}, callback);
|
||||||
},
|
},
|
||||||
|
|
||||||
mark_story_as_unstarred: function(story_id, feed_id, callback) {
|
mark_story_as_unstarred: function(story_id, callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.starred_count -= 1;
|
this.starred_count -= 1;
|
||||||
this.make_request('/reader/mark_story_as_unstarred', {
|
this.make_request('/reader/mark_story_as_unstarred', {
|
||||||
story_id: story_id,
|
story_id: story_id
|
||||||
feed_id: feed_id
|
|
||||||
}, callback);
|
}, callback);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -239,10 +238,16 @@ NEWSBLUR.AssetModel.Reader.prototype = {
|
||||||
$.isFunction(callback) && callback(data, first_load);
|
$.isFunction(callback) && callback(data, first_load);
|
||||||
},
|
},
|
||||||
|
|
||||||
fetch_starred_stories: function(page, callback) {
|
fetch_starred_stories: function(page, callback, first_load) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
var pre_callback = function(data) {
|
||||||
|
return self.load_feed_precallback(data, null, callback, true);
|
||||||
|
};
|
||||||
|
|
||||||
this.make_request('/reader/load_starred_stories', {
|
this.make_request('/reader/load_starred_stories', {
|
||||||
page: page
|
page: page
|
||||||
}, callback, null, {
|
}, pre_callback, null, {
|
||||||
'ajax_group': (page ? 'feed_page' : 'feed')
|
'ajax_group': (page ? 'feed_page' : 'feed')
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
|
@ -1342,8 +1342,18 @@
|
||||||
this.model.fetch_starred_stories(0, _.bind(this.post_open_starred_stories, this));
|
this.model.fetch_starred_stories(0, _.bind(this.post_open_starred_stories, this));
|
||||||
},
|
},
|
||||||
|
|
||||||
post_open_starred_stories: function(stories) {
|
post_open_starred_stories: function(data, first_load) {
|
||||||
NEWSBLUR.log(['stories', stories]);
|
if (this.active_feed == null) {
|
||||||
|
// NEWSBLUR.log(['post_open_starred_stories', data.stories, this.flags]);
|
||||||
|
this.flags['feed_view_positions_calculated'] = false;
|
||||||
|
this.story_titles_clear_loading_endbar();
|
||||||
|
this.create_story_titles(data.stories);
|
||||||
|
this.hover_over_story_titles();
|
||||||
|
this.make_story_feed_entries(data.stories, first_load);
|
||||||
|
this.show_correct_stories_in_page_and_feed_view();
|
||||||
|
// $('.NB-feedbar-last-updated-date').text(data.last_update + ' ago');
|
||||||
|
this.flags['story_titles_loaded'] = true;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// ==========================
|
// ==========================
|
||||||
|
@ -1768,7 +1778,7 @@
|
||||||
$button.removeClass('NB-unstarred');
|
$button.removeClass('NB-unstarred');
|
||||||
});
|
});
|
||||||
$button.closest('.story').removeClass('NB-story-starred');
|
$button.closest('.story').removeClass('NB-story-starred');
|
||||||
this.model.mark_story_as_unstarred(story_id, this.active_feed, function() {
|
this.model.mark_story_as_unstarred(story_id, function() {
|
||||||
|
|
||||||
});
|
});
|
||||||
this.update_starred_count();
|
this.update_starred_count();
|
||||||
|
@ -1837,7 +1847,7 @@
|
||||||
$story_tags.append($tag);
|
$story_tags.append($tag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
var $story_title = $.make('div', { className: 'story' + read + starred + 'NB-story-' + score_color }, [
|
var $story_title = $.make('div', { className: 'story ' + read + starred + 'NB-story-' + score_color }, [
|
||||||
$.make('a', { href: story.story_permalink, className: 'story_title' }, [
|
$.make('a', { href: story.story_permalink, className: 'story_title' }, [
|
||||||
$.make('span', { className: 'NB-storytitles-title' }, story.story_title),
|
$.make('span', { className: 'NB-storytitles-title' }, story.story_title),
|
||||||
$.make('span', { className: 'NB-storytitles-author' }, story.story_authors),
|
$.make('span', { className: 'NB-storytitles-author' }, story.story_authors),
|
||||||
|
@ -2311,7 +2321,7 @@
|
||||||
var $feed_view = this.$s.$feed_view;
|
var $feed_view = this.$s.$feed_view;
|
||||||
var $stories = $('.NB-feed-stories', $feed_view);
|
var $stories = $('.NB-feed-stories', $feed_view);
|
||||||
var $endbar = $.make('div', { className: 'NB-feed-story-endbar' });
|
var $endbar = $.make('div', { className: 'NB-feed-story-endbar' });
|
||||||
$story.find('.NB-feed-story-endbar').remove();
|
$stories.find('.NB-feed-story-endbar').remove();
|
||||||
$stories.append($endbar);
|
$stories.append($endbar);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -2906,7 +2916,7 @@
|
||||||
var $story_titles = this.$s.$story_titles;
|
var $story_titles = this.$s.$story_titles;
|
||||||
var unread_view_name = this.get_unread_view_name();
|
var unread_view_name = this.get_unread_view_name();
|
||||||
var $stories_show, $stories_hide;
|
var $stories_show, $stories_hide;
|
||||||
|
|
||||||
if (unread_view_name == 'positive') {
|
if (unread_view_name == 'positive') {
|
||||||
$stories_show = $('.story,.NB-feed-story').filter('.NB-story-positive');
|
$stories_show = $('.story,.NB-feed-story').filter('.NB-story-positive');
|
||||||
$stories_hide = $('.story,.NB-feed-story')
|
$stories_hide = $('.story,.NB-feed-story')
|
||||||
|
@ -3506,7 +3516,6 @@
|
||||||
|
|
||||||
$.targetIs(e, { tagSelector: '#feed_list .NB-feedlist-manage-icon' }, function($t, $p) {
|
$.targetIs(e, { tagSelector: '#feed_list .NB-feedlist-manage-icon' }, function($t, $p) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
|
||||||
if (!self.flags['sorting_feed']) {
|
if (!self.flags['sorting_feed']) {
|
||||||
stopPropagation = true;
|
stopPropagation = true;
|
||||||
if ($t.parent().hasClass('feed')) {
|
if ($t.parent().hasClass('feed')) {
|
||||||
|
@ -3519,7 +3528,6 @@
|
||||||
if (stopPropagation) return;
|
if (stopPropagation) return;
|
||||||
$.targetIs(e, { tagSelector: '#feed_list .feed.NB-feed-exception' }, function($t, $p){
|
$.targetIs(e, { tagSelector: '#feed_list .feed.NB-feed-exception' }, function($t, $p){
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
|
||||||
if (!self.flags['sorting_feed']) {
|
if (!self.flags['sorting_feed']) {
|
||||||
var feed_id = $t.data('feed_id');
|
var feed_id = $t.data('feed_id');
|
||||||
stopPropagation = true;
|
stopPropagation = true;
|
||||||
|
@ -3937,7 +3945,6 @@
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
self.flags['mousemove_timeout'] = false;
|
self.flags['mousemove_timeout'] = false;
|
||||||
}, 40);
|
}, 40);
|
||||||
|
|
||||||
if (!this.flags['mousemove_timeout']
|
if (!this.flags['mousemove_timeout']
|
||||||
&& !this.flags.scrolling_by_selecting_story_title) {
|
&& !this.flags.scrolling_by_selecting_story_title) {
|
||||||
var from_top = this.cache.mouse_position_y + scroll_top;
|
var from_top = this.cache.mouse_position_y + scroll_top;
|
||||||
|
@ -3945,7 +3952,6 @@
|
||||||
var closest = $.closest(from_top, positions);
|
var closest = $.closest(from_top, positions);
|
||||||
var story = this.cache.iframe_story_positions[positions[closest]];
|
var story = this.cache.iframe_story_positions[positions[closest]];
|
||||||
this.flags['mousemove_timeout'] = true;
|
this.flags['mousemove_timeout'] = true;
|
||||||
// NEWSBLUR.log(['Mousemove iframe', from_top, closest, positions[closest], this.cache.iframe_story_positions[positions[closest]]]);
|
|
||||||
this.navigate_story_titles_to_story(story);
|
this.navigate_story_titles_to_story(story);
|
||||||
// NEWSBLUR.log(['Setting snap back', this.iframe_scroll]);
|
// NEWSBLUR.log(['Setting snap back', this.iframe_scroll]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue