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)
|
||||
elif isinstance(story.id, unicode) and story.id not in read_stories_ids:
|
||||
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:
|
||||
# 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]:
|
||||
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 = {
|
||||
'feeds': feeds,
|
||||
|
@ -286,18 +286,12 @@ def load_single_feed(request):
|
|||
classifier_titles = MClassifierTitle.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)
|
||||
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)
|
||||
|
||||
usersub = UserSubscription.objects.get(user=user, feed=feed)
|
||||
userstories = []
|
||||
userstories_db = MUserStory.objects(user_id=user.pk,
|
||||
feed_id=feed.pk,
|
||||
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]
|
||||
|
||||
for us in userstories_db:
|
||||
|
@ -380,14 +374,23 @@ def load_starred_stories(request):
|
|||
page = int(request.REQUEST.get('page', 0))
|
||||
if page: offset = limit * page
|
||||
|
||||
mstories = MStarredStory.objects(user_id=user.pk).order_by('-story_date')[offset:offset+limit]
|
||||
stories = []
|
||||
for story in mstories:
|
||||
story_db = dict([(k, v) for k, v in story._data.items()
|
||||
if k is not None and v is not None])
|
||||
stories.append(dict(**story_db))
|
||||
print stories
|
||||
return stories
|
||||
mstories = MStarredStory.objects(user_id=user.pk).order_by('-starred_date')[offset:offset+limit]
|
||||
stories = Feed.format_stories(mstories)
|
||||
|
||||
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
|
||||
story['starred'] = True
|
||||
story['intelligence'] = {
|
||||
'feed': 0,
|
||||
'author': 0,
|
||||
'tags': 0,
|
||||
'title': 0,
|
||||
}
|
||||
|
||||
return dict(stories=stories)
|
||||
|
||||
@ajax_login_required
|
||||
@json.json_view
|
||||
|
@ -755,7 +758,8 @@ def mark_story_as_starred(request):
|
|||
if story:
|
||||
story_db = dict([(k, v) for k, v in story[0]._data.items()
|
||||
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)
|
||||
else:
|
||||
code = -1
|
||||
|
@ -766,10 +770,9 @@ def mark_story_as_starred(request):
|
|||
@json.json_view
|
||||
def mark_story_as_unstarred(request):
|
||||
code = 1
|
||||
feed_id = int(request.POST['feed_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:
|
||||
starred_story.delete()
|
||||
else:
|
||||
|
|
|
@ -477,12 +477,13 @@ class Feed(models.Model):
|
|||
|
||||
if not stories or force:
|
||||
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)
|
||||
|
||||
return stories
|
||||
|
||||
def format_stories(self, stories_db):
|
||||
@classmethod
|
||||
def format_stories(cls, stories_db, feed_id=None):
|
||||
stories = []
|
||||
|
||||
for story_db in stories_db:
|
||||
|
@ -493,8 +494,10 @@ class Feed(models.Model):
|
|||
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_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
|
||||
if hasattr(story_db, 'starred_date'):
|
||||
story['starred_date'] = story_db.starred_date
|
||||
|
||||
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
|
||||
mongoengine's inheritance model on every single row."""
|
||||
user_id = mongo.IntField()
|
||||
starred_date = mongo.DateTimeField()
|
||||
story_feed_id = mongo.IntField()
|
||||
story_date = mongo.DateTimeField()
|
||||
story_title = mongo.StringField(max_length=1024)
|
||||
|
@ -814,8 +818,8 @@ class MStarredStory(mongo.Document):
|
|||
|
||||
meta = {
|
||||
'collection': 'starred_stories',
|
||||
'indexes': [('user_id', '-story_date'), 'story_feed_id'],
|
||||
'ordering': ['-story_date'],
|
||||
'indexes': [('user_id', '-starred_date'), 'story_feed_id'],
|
||||
'ordering': ['-starred_date'],
|
||||
'allow_inheritance': False,
|
||||
}
|
||||
|
||||
|
|
|
@ -133,12 +133,11 @@ NEWSBLUR.AssetModel.Reader.prototype = {
|
|||
}, callback);
|
||||
},
|
||||
|
||||
mark_story_as_unstarred: function(story_id, feed_id, callback) {
|
||||
mark_story_as_unstarred: function(story_id, callback) {
|
||||
var self = this;
|
||||
this.starred_count -= 1;
|
||||
this.make_request('/reader/mark_story_as_unstarred', {
|
||||
story_id: story_id,
|
||||
feed_id: feed_id
|
||||
story_id: story_id
|
||||
}, callback);
|
||||
},
|
||||
|
||||
|
@ -239,10 +238,16 @@ NEWSBLUR.AssetModel.Reader.prototype = {
|
|||
$.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', {
|
||||
page: page
|
||||
}, callback, null, {
|
||||
}, pre_callback, null, {
|
||||
'ajax_group': (page ? 'feed_page' : 'feed')
|
||||
});
|
||||
},
|
||||
|
|
|
@ -1342,8 +1342,18 @@
|
|||
this.model.fetch_starred_stories(0, _.bind(this.post_open_starred_stories, this));
|
||||
},
|
||||
|
||||
post_open_starred_stories: function(stories) {
|
||||
NEWSBLUR.log(['stories', stories]);
|
||||
post_open_starred_stories: function(data, first_load) {
|
||||
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.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();
|
||||
|
@ -1837,7 +1847,7 @@
|
|||
$story_tags.append($tag);
|
||||
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('span', { className: 'NB-storytitles-title' }, story.story_title),
|
||||
$.make('span', { className: 'NB-storytitles-author' }, story.story_authors),
|
||||
|
@ -2311,7 +2321,7 @@
|
|||
var $feed_view = this.$s.$feed_view;
|
||||
var $stories = $('.NB-feed-stories', $feed_view);
|
||||
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);
|
||||
},
|
||||
|
||||
|
@ -2906,7 +2916,7 @@
|
|||
var $story_titles = this.$s.$story_titles;
|
||||
var unread_view_name = this.get_unread_view_name();
|
||||
var $stories_show, $stories_hide;
|
||||
|
||||
|
||||
if (unread_view_name == 'positive') {
|
||||
$stories_show = $('.story,.NB-feed-story').filter('.NB-story-positive');
|
||||
$stories_hide = $('.story,.NB-feed-story')
|
||||
|
@ -3506,7 +3516,6 @@
|
|||
|
||||
$.targetIs(e, { tagSelector: '#feed_list .NB-feedlist-manage-icon' }, function($t, $p) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
if (!self.flags['sorting_feed']) {
|
||||
stopPropagation = true;
|
||||
if ($t.parent().hasClass('feed')) {
|
||||
|
@ -3519,7 +3528,6 @@
|
|||
if (stopPropagation) return;
|
||||
$.targetIs(e, { tagSelector: '#feed_list .feed.NB-feed-exception' }, function($t, $p){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
if (!self.flags['sorting_feed']) {
|
||||
var feed_id = $t.data('feed_id');
|
||||
stopPropagation = true;
|
||||
|
@ -3937,7 +3945,6 @@
|
|||
setTimeout(function() {
|
||||
self.flags['mousemove_timeout'] = false;
|
||||
}, 40);
|
||||
|
||||
if (!this.flags['mousemove_timeout']
|
||||
&& !this.flags.scrolling_by_selecting_story_title) {
|
||||
var from_top = this.cache.mouse_position_y + scroll_top;
|
||||
|
@ -3945,7 +3952,6 @@
|
|||
var closest = $.closest(from_top, positions);
|
||||
var story = this.cache.iframe_story_positions[positions[closest]];
|
||||
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);
|
||||
// NEWSBLUR.log(['Setting snap back', this.iframe_scroll]);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue