Showing starred stories in their own feed view.

This commit is contained in:
Samuel Clay 2010-12-02 20:18:33 -05:00
parent c69fce03a7
commit fd88d41f74
5 changed files with 59 additions and 41 deletions

View file

@ -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))

View file

@ -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:

View file

@ -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,
}

View file

@ -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')
});
},

View file

@ -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]);
}