diff --git a/apps/api/views.py b/apps/api/views.py index c5fb40c24..69b50f591 100644 --- a/apps/api/views.py +++ b/apps/api/views.py @@ -406,6 +406,7 @@ def save_story(request, token=None): title = request.POST['title'] content = request.POST.get('content', None) rss_url = request.POST.get('rss_url', None) + user_notes = request.POST.get('user_notes', None) feed_id = request.POST.get('feed_id', None) or 0 feed = None message = None @@ -470,6 +471,7 @@ def save_story(request, token=None): "starred_date": datetime.datetime.now(), "user_id": profile.user.pk, "user_tags": user_tags, + "user_notes": user_notes, } starred_story = MStarredStory.objects.create(**story_db) logging.user(profile.user, "~BM~FCStarring story from site: ~SB%s: %s" % (story_url, user_tags)) @@ -481,6 +483,7 @@ def save_story(request, token=None): starred_story.story_permalink = story_url starred_story.story_guid = story_url starred_story.story_feed_id = feed_id + starred_story.user_notes = user_notes starred_story.save() logging.user(profile.user, "~BM~FC~SBUpdating~SN starred story from site: ~SB%s: %s" % (story_url, user_tags)) message = "Updating saved story from site: %s: %s" % (story_url, user_tags) diff --git a/apps/feed_import/models.py b/apps/feed_import/models.py index eb7a8c70f..30b67762f 100644 --- a/apps/feed_import/models.py +++ b/apps/feed_import/models.py @@ -10,7 +10,7 @@ from django.db import models from django.contrib.auth.models import User from mongoengine.queryset import OperationError import vendor.opml as opml -from apps.rss_feeds.models import Feed, DuplicateFeed, MStarredStory +from apps.rss_feeds.models import Feed, DuplicateFeed from apps.reader.models import UserSubscription, UserSubscriptionFolders from utils import json_functions as json, urlnorm from utils import log as logging diff --git a/apps/feed_import/tasks.py b/apps/feed_import/tasks.py index 6b831ebf4..d0f6c1c7c 100644 --- a/apps/feed_import/tasks.py +++ b/apps/feed_import/tasks.py @@ -2,7 +2,6 @@ from celery.task import Task from django.contrib.auth.models import User from apps.feed_import.models import UploadedOPML, OPMLImporter from apps.reader.models import UserSubscription -from apps.rss_feeds.models import MStarredStory from utils import log as logging diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index 92c71b91b..2a75bf3ab 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -1912,6 +1912,8 @@ class Feed(models.Model): story['starred_date'] = story_db.starred_date if hasattr(story_db, 'user_tags'): story['user_tags'] = story_db.user_tags + if hasattr(story_db, 'user_notes'): + story['user_notes'] = story_db.user_notes if hasattr(story_db, 'highlights'): story['highlights'] = story_db.highlights if hasattr(story_db, 'shared_date'): @@ -2851,6 +2853,7 @@ class MStarredStory(mongo.DynamicDocument): story_guid = mongo.StringField() story_hash = mongo.StringField() story_tags = mongo.ListField(mongo.StringField(max_length=250)) + user_notes = mongo.StringField() user_tags = mongo.ListField(mongo.StringField(max_length=128)) highlights = mongo.ListField(mongo.StringField(max_length=1024)) image_urls = mongo.ListField(mongo.StringField(max_length=1024)) diff --git a/media/css/reader.css b/media/css/reader.css index 47cc9bd8a..56cacbff8 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -4103,6 +4103,15 @@ body { text-shadow: 0 1px 0 #FBFBFB; line-height: 16px; } +.NB-sideoption-save .NB-sideoption-save-message { + float: right; + opacity: 0; + transition: opacity 1s ease-out; +} +.NB-sideoption-save .NB-sideoption-save-message.NB-active { + opacity: 1; +} +.NB-sideoption-save .NB-sideoption-save-comments, .NB-sideoption-share .NB-sideoption-share-comments { width: 100%; -webkit-box-sizing: border-box; diff --git a/media/js/newsblur/common/assetmodel.js b/media/js/newsblur/common/assetmodel.js index 31a620af2..997f4d3f3 100644 --- a/media/js/newsblur/common/assetmodel.js +++ b/media/js/newsblur/common/assetmodel.js @@ -246,7 +246,8 @@ NEWSBLUR.AssetModel = Backbone.Router.extend({ this.make_request('/reader/mark_story_hash_as_starred', { story_hash: story.get('story_hash'), user_tags: story.get('user_tags'), - highlights: story.get('highlights') + highlights: story.get('highlights'), + user_notes: story.get('user_notes') }, pre_callback); }, diff --git a/media/js/newsblur/models/stories.js b/media/js/newsblur/models/stories.js index c132ecfff..a69657ea1 100644 --- a/media/js/newsblur/models/stories.js +++ b/media/js/newsblur/models/stories.js @@ -8,6 +8,7 @@ NEWSBLUR.Models.Story = Backbone.Model.extend({ this.bind('change:user_tags', this.change_user_tags); this.bind('change:selected', this.select_story); this.bind('change:highlights', this.update_highlights); + this.bind('change:user_notes', this.update_notes); this.populate_comments(); this.story_permalink = this.get('story_permalink'); this.story_title = this.get('story_title'); @@ -270,7 +271,6 @@ NEWSBLUR.Models.Story = Backbone.Model.extend({ }, update_highlights: function() { - this.set('user_tags', this.existing_tags(), {silent: true}); console.log(['update_highlights', this.get('highlights')]); if (!this.get('starred')) { NEWSBLUR.assets.starred_count += 1; @@ -281,6 +281,10 @@ NEWSBLUR.Models.Story = Backbone.Model.extend({ NEWSBLUR.reader.update_starred_count(); }, + update_notes: function() { + NEWSBLUR.assets.mark_story_as_starred(this.id); + }, + change_starred: function() { if (this.get('starred')) { NEWSBLUR.assets.mark_story_as_starred(this.id); diff --git a/media/js/newsblur/views/story_save_view.js b/media/js/newsblur/views/story_save_view.js index 57c683771..eb5140f26 100644 --- a/media/js/newsblur/views/story_save_view.js +++ b/media/js/newsblur/views/story_save_view.js @@ -1,11 +1,13 @@ NEWSBLUR.Views.StorySaveView = Backbone.View.extend({ events: { - "click .NB-sideoption-save-populate" : "populate_story_tags" + "click .NB-sideoption-save-populate" : "populate_story_tags", + "keypress .NB-sideoption-save-notes" : "autosize", + "keypress .NB-sideoption-save-notes" : "save_user_notes", }, initialize: function() { - _.bindAll(this, 'toggle_feed_story_save_dialog'); + _.bindAll(this, 'toggle_feed_story_save_dialog', 'save_user_notes', 'autosize'); this.sideoptions_view = this.options.sideoptions_view; this.model.story_save_view = this; this.model.bind('change:starred', this.toggle_feed_story_save_dialog); @@ -38,6 +40,9 @@ NEWSBLUR.Views.StorySaveView = Backbone.View.extend({
  • <%= tag %>
  • \ <% }) %>\ \ +
    Saved
    \ +
    Private notes:
    \ + \ \ \ '), @@ -238,6 +243,23 @@ NEWSBLUR.Views.StorySaveView = Backbone.View.extend({ var user_tags = $tag_input.tagit('assignedTags'); this.model.set('user_tags', user_tags); + }, + + save_user_notes: function(options) { + var $notes = this.$('.NB-sideoption-save-notes'); + var $saved = this.$('.NB-sideoption-save-message'); + var user_notes = $notes.val(); + + this.model.set('user_notes', user_notes); + + $saved.addClass('NB-active'); + if (this.saved_defer) { + clearTimeout(this.saved_defer); + } + this.saved_defer = _.defer(_.bind(function() { + $saved.removeClass('NB-active'); + this.saved_defer = null; + }, this)); } - + }); \ No newline at end of file diff --git a/templates/static/api.yml b/templates/static/api.yml index d0f0f69c5..e6b64ad8a 100644 --- a/templates/static/api.yml +++ b/templates/static/api.yml @@ -503,7 +503,17 @@ desc: "Story to save, specified by hash." required: true example: "64:a295ed" - + - key: user_tags + desc: "Tags for the saved story" + optional: true + example: "['cooking', 'blogs']" + - key: highlights + desc: "Strings to highlight" + optional: true + example: "['For example', 'this sentence is highlighted.']" + tips: + - "You can send a list for user_tags and highlights. user_tags[]=blog&user_tags[]=cooking" + - url: /reader/mark_story_as_unstarred method: POST short_desc: "Mark a story as unstarred (unsaved)."