For #1035: Adding private notes to saved stories.

This commit is contained in:
Samuel Clay 2020-07-16 15:49:28 -04:00
parent acb0531bff
commit aab7f1f49e
3 changed files with 53 additions and 19 deletions

View file

@ -734,6 +734,7 @@ def load_single_feed(request, feed_id):
story['starred_date'] = format_story_link_date__long(starred_date, now)
story['starred_timestamp'] = starred_date.strftime('%s')
story['user_tags'] = starred_story['user_tags']
story['user_notes'] = starred_story['user_notes']
story['highlights'] = starred_story['highlights']
if story['story_hash'] in shared_stories:
story['shared'] = True
@ -1415,7 +1416,8 @@ def load_river_stories__redis(request):
story_hash__in=story_hashes)
starred_stories = dict([(story.story_hash, dict(starred_date=story.starred_date,
user_tags=story.user_tags,
highlights=story.highlights))
highlights=story.highlights,
user_notes=story.user_notes))
for story in starred_stories])
else:
starred_stories = {}
@ -1463,6 +1465,7 @@ def load_river_stories__redis(request):
story['starred_date'] = format_story_link_date__long(starred_date, now)
story['starred_timestamp'] = starred_date.strftime('%s')
story['user_tags'] = starred_stories[story['story_hash']]['user_tags']
story['user_notes'] = starred_stories[story['story_hash']]['user_notes']
story['highlights'] = starred_stories[story['story_hash']]['highlights']
story['intelligence'] = {
'feed': apply_classifier_feeds(classifier_feeds, story['story_feed_id']),
@ -2412,6 +2415,7 @@ def _mark_story_as_starred(request):
story_id = request.REQUEST.get('story_id', None)
story_hash = request.REQUEST.get('story_hash', None)
user_tags = request.REQUEST.getlist('user_tags') or request.REQUEST.getlist('user_tags[]')
user_notes = request.REQUEST.get('user_notes', None)
highlights = request.REQUEST.getlist('highlights') or request.REQUEST.getlist('highlights[]') or []
message = ""
if story_hash:
@ -2425,16 +2429,21 @@ def _mark_story_as_starred(request):
story_db = dict([(k, v) for k, v in story._data.items()
if k is not None and v is not None])
# Pop all existing user-specific fields because we don't want to reuse them from the found story
# in case MStory.find_story uses somebody else's saved/shared story (because the original is deleted)
story_db.pop('user_id', None)
story_db.pop('starred_date', None)
story_db.pop('id', None)
story_db.pop('user_tags', None)
story_db.pop('highlights', None)
story_db.pop('user_notes', None)
now = datetime.datetime.now()
story_values = dict(starred_date=now, user_tags=user_tags, highlights=highlights, **story_db)
story_values = dict(starred_date=now, user_tags=user_tags, highlights=highlights, user_notes=user_notes, **story_db)
params = dict(story_guid=story.story_guid, user_id=request.user.pk)
starred_story = MStarredStory.objects(**params).limit(1)
created = False
changed_user_notes = False
removed_user_tags = []
removed_highlights = []
if not starred_story:
@ -2454,6 +2463,7 @@ def _mark_story_as_starred(request):
story_id=starred_story.story_guid)
new_user_tags = user_tags
new_highlights = highlights
changed_user_notes = bool(user_notes)
MStarredStoryCounts.adjust_count(request.user.pk, feed_id=feed_id, amount=1)
else:
starred_story = starred_story[0]
@ -2461,8 +2471,10 @@ def _mark_story_as_starred(request):
removed_user_tags = list(set(starred_story.user_tags or []) - set(user_tags))
new_highlights = list(set(highlights) - set(starred_story.highlights or []))
removed_highlights = list(set(starred_story.highlights or []) - set(highlights))
changed_user_notes = bool(user_notes != starred_story.user_notes)
starred_story.user_tags = user_tags
starred_story.highlights = highlights
starred_story.user_notes = user_notes
starred_story.save()
if len(highlights) == 1 and len(new_highlights) == 1:
@ -2482,13 +2494,14 @@ def _mark_story_as_starred(request):
if not starred_count and len(starred_counts):
starred_count = MStarredStory.objects(user_id=request.user.pk).count()
r = redis.Redis(connection_pool=settings.REDIS_PUBSUB_POOL)
r.publish(request.user.username, 'story:starred:%s' % story.story_hash)
if not changed_user_notes:
r = redis.Redis(connection_pool=settings.REDIS_PUBSUB_POOL)
r.publish(request.user.username, 'story:starred:%s' % story.story_hash)
if created:
logging.user(request, "~FCStarring: ~SB%s (~FM~SB%s~FC~SN)" % (story.story_title[:32], starred_story.user_tags))
else:
logging.user(request, "~FCUpdating starred:~SN~FC ~SB%s~SN (~FM~SB%s~FC~SN)" % (story.story_title[:32], starred_story.user_tags))
logging.user(request, "~FCUpdating starred:~SN~FC ~SB%s~SN (~FM~SB%s~FC~SN/~FM%s~FC)" % (story.story_title[:32], starred_story.user_tags, starred_story.user_notes))
return {'code': code, 'message': message, 'starred_count': starred_count, 'starred_counts': starred_counts}

View file

@ -3986,7 +3986,7 @@ body {
}
.NB-sideoption-save .NB-sideoption-save-icon {
float: left;
margin: 2px 2px 0 0;
margin: 11px 2px 0 0;
width: 16px;
height: 16px;
background: transparent url("/media/embed/reader/tag.png") no-repeat 0 0;
@ -3998,6 +3998,7 @@ body {
text-align: left;
text-shadow: 0 1px 0 #F6F6F6;
color: #202020;
margin: 12px 0 4px;
}
.NB-sideoption-save .NB-sideoption-save-tag {
@ -4014,7 +4015,7 @@ body {
line-height: 11px;
text-transform: uppercase;
padding: 2px 4px;
margin: 0 0 2px 0;
margin: 10px 0 2px 0;
border-radius: 2px;
background-color: rgba(205, 205, 205, .5);
color: white;
@ -4107,11 +4108,15 @@ body {
float: right;
opacity: 0;
transition: opacity 1s ease-out;
margin-top: 12px;
text-transform: uppercase;
font-size: 10px;
color: yellowgreen;
}
.NB-sideoption-save .NB-sideoption-save-message.NB-active {
opacity: 1;
}
.NB-sideoption-save .NB-sideoption-save-comments,
.NB-sideoption-save .NB-sideoption-save-notes,
.NB-sideoption-share .NB-sideoption-share-comments {
width: 100%;
-webkit-box-sizing: border-box;
@ -4120,6 +4125,7 @@ body {
height: 52px;
border-color: #C6C6C6;
border-radius: 4px;
margin: 0 0 4px;
}
.NB-sideoption-share .NB-sideoption-share-save {
font-size: 10px;
@ -7445,6 +7451,7 @@ form.opml_import_form input {
text-align: center;
margin: 4px 0 0;
}
.NB-menu-manage .NB-menu-manage-confirm .NB-sideoption-save-notes,
.NB-menu-manage .NB-menu-manage-confirm .NB-sideoption-share-comments {
height: 28px;
}

View file

@ -2,12 +2,14 @@ NEWSBLUR.Views.StorySaveView = Backbone.View.extend({
events: {
"click .NB-sideoption-save-populate" : "populate_story_tags",
"keypress .NB-sideoption-save-notes" : "autosize",
"keypress .NB-sideoption-save-notes" : "save_user_notes",
// "keypress .NB-sideoption-save-notes" : "autosize",
"keyup .NB-sideoption-save-notes" : "debounced_save_user_notes",
"change .NB-sideoption-save-notes" : "save_user_notes"
},
initialize: function() {
_.bindAll(this, 'toggle_feed_story_save_dialog', 'save_user_notes', 'autosize');
this.debounced_save_user_notes = _.debounce(this.save_user_notes, 1000);
_.bindAll(this, 'toggle_feed_story_save_dialog', 'save_user_notes', 'autosize', 'debounced_save_user_notes');
this.sideoptions_view = this.options.sideoptions_view;
this.model.story_save_view = this;
this.model.bind('change:starred', this.toggle_feed_story_save_dialog);
@ -130,7 +132,11 @@ NEWSBLUR.Views.StorySaveView = Backbone.View.extend({
this.resize(options);
}
},
autosize: function() {
this.resize({duration: 100});
},
resize: function(options) {
options = options || {};
var $sideoption_container = this.$('.NB-feed-story-sideoptions-container');
@ -247,19 +253,27 @@ NEWSBLUR.Views.StorySaveView = Backbone.View.extend({
save_user_notes: function(options) {
var $notes = this.$('.NB-sideoption-save-notes');
var $saved = this.$('.NB-sideoption-save-message');
var $message = this.$('.NB-sideoption-save-message');
var user_notes = $notes.val();
this.model.set('user_notes', user_notes);
$saved.addClass('NB-active');
if (this.model.get('user_notes') == user_notes) return;
console.log('save_user_notes', user_notes);
this.model.set('user_notes', user_notes, {silent: true});
$message.removeClass('NB-active');
if (this.saved_defer) {
clearTimeout(this.saved_defer);
}
this.saved_defer = _.defer(_.bind(function() {
$saved.removeClass('NB-active');
this.saved_defer = null;
NEWSBLUR.assets.mark_story_as_starred(this.model.id, _.bind(function() {
$message.addClass('NB-active');
if (this.saved_defer) {
clearTimeout(this.saved_defer);
}
this.saved_defer = _.delay(_.bind(function() {
$message.removeClass('NB-active');
this.saved_defer = null;
}, this), 3000);
}, this));
}
});