diff --git a/apps/reader/models.py b/apps/reader/models.py index be9416dd2..ce36a71ff 100644 --- a/apps/reader/models.py +++ b/apps/reader/models.py @@ -594,8 +594,11 @@ class MUserStory(mongo.Document): if self.story: return self.story.id elif self.found_story: - return self.found_story['_ref'].id - + if '_ref' in self.found_story: + return self.found_story['_ref'].id + elif hasattr(self.found_story, 'id'): + return self.found_story.id + story, found_original = MStory.find_story(self.feed_id, self.story_id) if story: if found_original: diff --git a/apps/reader/views.py b/apps/reader/views.py index 2c79f851d..8911d0fd3 100644 --- a/apps/reader/views.py +++ b/apps/reader/views.py @@ -1400,7 +1400,7 @@ def send_story_email(request): code = -1 message = 'You need to provide your name.' else: - story = MStory.find_story(story_feed_id=feed_id, story_guid=story_id) + story = MStory.find_story(feed_id, story_id) story = Feed.format_story(story, feed_id, text=True) feed = Feed.objects.get(pk=story['story_feed_id']) text = render_to_string('mail/email_story_text.xhtml', locals()) diff --git a/media/css/reader.css b/media/css/reader.css index 06fe77366..b744351b5 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -7216,6 +7216,33 @@ form.opml_import_form input { .NB-modal-preferences .NB-preference-story-share label[for=NB-preference-story-share-instapaper] { background: transparent url('/media/embed/reader/instapaper.png') no-repeat 0 0; } +.NB-modal-preferences .segmented-control { + display: block; + margin: 4px 0 12px 24px; + float: left; +/* height: 14px;*/ + width: auto; + color: white; + overflow: hidden; + text-align: center; + text-transform: uppercase; + line-height: 18px; +} +.NB-modal-preferences .segmented-control:last-child { +} +.NB-modal-preferences .segmented-control li { + clear: none; + padding: 1px 12px 0; + font-size: 12px; + color: #E0E0E0; +} +.NB-modal-preferences .segmented-control li:hover { + background-color: #639510; +} +.NB-modal-preferences .segmented-control li.NB-active { + color: white; + background-color: transparent; +} /* ================== */ /* = Account Dialog = */ diff --git a/media/js/newsblur/reader/reader_preferences.js b/media/js/newsblur/reader/reader_preferences.js index 8dd837f23..43f809a33 100644 --- a/media/js/newsblur/reader/reader_preferences.js +++ b/media/js/newsblur/reader/reader_preferences.js @@ -163,6 +163,22 @@ _.extend(NEWSBLUR.ReaderPreferences.prototype, { $.make('div', { className: 'NB-preference-sublabel' }, 'You can override this on a per-site basis.') ]) ]), + $.make('div', { className: 'NB-preference NB-preference-view-setting' }, [ + $.make('div', { className: 'NB-preference-options' }, [ + $.make('ul', { className: 'segmented-control NB-preference-view-setting-order' }, [ + $.make('li', { className: 'NB-preference-view-setting-order-newest NB-active' }, 'Newest first'), + $.make('li', { className: 'NB-preference-view-setting-order-oldest' }, 'Oldest') + ]), + $.make('ul', { className: 'segmented-control NB-preference-view-setting-read-filter' }, [ + $.make('li', { className: 'NB-preference-view-setting-read-filter-all NB-active' }, 'All stories'), + $.make('li', { className: 'NB-preference-view-setting-read-filter-unread' }, 'Unread only') + ]) + ]), + $.make('div', { className: 'NB-preference-label'}, [ + 'Default story order', + $.make('div', { className: 'NB-preference-sublabel' }, 'You can override this on a per-site and per-folder basis.') + ]) + ]), $.make('div', { className: 'NB-preference NB-preference-story-pane-position' }, [ $.make('div', { className: 'NB-preference-options' }, [ $.make('div', [ @@ -663,6 +679,12 @@ _.extend(NEWSBLUR.ReaderPreferences.prototype, { return false; } }); + var order = NEWSBLUR.Preferences['default_order']; + var read_filter = NEWSBLUR.Preferences['default_read_filter']; + $('.NB-preference-view-setting-order-oldest', $modal).toggleClass('NB-active', order == 'oldest'); + $('.NB-preference-view-setting-order-newest', $modal).toggleClass('NB-active', order != 'oldest'); + $('.NB-preference-view-setting-read-filter-unread', $modal).toggleClass('NB-active', read_filter == 'unread'); + $('.NB-preference-view-setting-read-filter-all', $modal).toggleClass('NB-active', read_filter != 'unread'); var share_preferences = _.select(_.keys(NEWSBLUR.Preferences), function(p) { return p.indexOf('story_share') != -1; @@ -707,6 +729,8 @@ _.extend(NEWSBLUR.ReaderPreferences.prototype, { $('input[type=checkbox]', this.$modal).each(function() { preferences[$(this).attr('name')] = $(this).is(':checked'); }); + preferences['default_order'] = $('.NB-preference-view-setting-order li.NB-active', this.$modal).hasClass('NB-preference-view-setting-order-oldest') ? 'oldest' : 'newest'; + preferences['default_read_filter'] = $('.NB-preference-view-setting-read-filter li.NB-active', this.$modal).hasClass('NB-preference-view-setting-read-filter-unread') ? 'unread' : 'all'; return preferences; }, @@ -760,6 +784,20 @@ _.extend(NEWSBLUR.ReaderPreferences.prototype, { }); }, + change_view_setting: function(view, setting) { + if (view == 'order') { + $('.NB-preference-view-setting-order-oldest').toggleClass('NB-active', setting == 'oldest'); + $('.NB-preference-view-setting-order-newest').toggleClass('NB-active', setting != 'oldest'); + } else if (view == 'read_filter') { + $('.NB-preference-view-setting-read-filter-unread').toggleClass('NB-active', setting == 'unread'); + $('.NB-preference-view-setting-read-filter-all').toggleClass('NB-active', setting != 'unread'); + } + + this.enable_save(); + }, + + + // =========== // = Actions = // =========== @@ -782,6 +820,16 @@ _.extend(NEWSBLUR.ReaderPreferences.prototype, { self.close(); }); + $.targetIs(e, { tagSelector: '.segmented-control.NB-preference-view-setting-order li' }, function($t, $p) { + e.preventDefault(); + var order = $t.hasClass('NB-preference-view-setting-order-oldest') ? 'oldest' : 'newest'; + self.change_view_setting('order', order); + }); + $.targetIs(e, { tagSelector: '.segmented-control.NB-preference-view-setting-read-filter li' }, function($t, $p) { + e.preventDefault(); + var read_filter = $t.hasClass('NB-preference-view-setting-read-filter-unread') ? 'unread' : 'all'; + self.change_view_setting('read_filter', read_filter); + }); }, handle_change: function() { diff --git a/utils/log.py b/utils/log.py index f5abc1c7f..1aa33caad 100644 --- a/utils/log.py +++ b/utils/log.py @@ -116,11 +116,9 @@ def colorize(msg): for k, v in params.items(): msg = re.sub(k, v, msg) msg = msg + '~ST~FW~BT' - msg = re.sub(r'(~[A-Z]{2})', r'%(\1)s', msg) - try: - msg = msg % colors - except (TypeError, ValueError, KeyError): - pass + # msg = re.sub(r'(~[A-Z]{2})', r'%(\1)s', msg) + for k, v in colors.items(): + msg = msg.replace(k, v) return msg '''