From e01bb9eb747e51184d58a4044ab97c42d4f11c5b Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Wed, 25 Aug 2010 10:18:08 -0400 Subject: [PATCH] Exception modal now has delete and retry options that work. Change feed link/address are still in the works, but they show up. (Buttons don't do anything yet.) --- apps/reader/views.py | 2 + apps/rss_feeds/urls.py | 1 + apps/rss_feeds/views.py | 13 ++- media/css/reader.css | 31 +++++- media/js/newsblur/assetmodel.js | 18 +++- media/js/newsblur/reader.js | 20 ++-- media/js/newsblur/reader_feed_exception.js | 112 ++++++++++++++++++--- 7 files changed, 169 insertions(+), 28 deletions(-) diff --git a/apps/reader/views.py b/apps/reader/views.py index 39fb1076d..2239926b4 100644 --- a/apps/reader/views.py +++ b/apps/reader/views.py @@ -117,6 +117,7 @@ def load_feeds(request): feeds[sub.feed.pk]['not_yet_fetched'] = True if sub.feed.has_exception: feeds[sub.feed.pk]['has_exception'] = True + feeds[sub.feed.pk]['feed_address'] = sub.feed.feed_address if not_yet_fetched: for f in feeds: @@ -195,6 +196,7 @@ def refresh_feeds(request): } if sub.feed.has_exception: feeds[sub.feed.pk]['has_exception'] = True + feeds[sub.feed.pk]['feed_address'] = sub.feed.feed_address if request.POST.get('check_fetch_status', False): feeds[sub.feed.pk]['not_yet_fetched'] = not sub.feed.fetched_once diff --git a/apps/rss_feeds/urls.py b/apps/rss_feeds/urls.py index 2a0ad1bb9..d19dc2f78 100644 --- a/apps/rss_feeds/urls.py +++ b/apps/rss_feeds/urls.py @@ -3,4 +3,5 @@ from apps.rss_feeds import views urlpatterns = patterns('', url(r'^statistics', views.load_feed_statistics, name='statistics'), + url(r'^exception_retry', views.exception_retry, name='exception-retry'), ) diff --git a/apps/rss_feeds/views.py b/apps/rss_feeds/views.py index 24bcc325f..d67181f99 100644 --- a/apps/rss_feeds/views.py +++ b/apps/rss_feeds/views.py @@ -28,4 +28,15 @@ def load_feed_statistics(request): logging.info(" ---> [%s] Statistics: %s" % (request.user, feed)) - return stats \ No newline at end of file + return stats + +@json.json_view +def exception_retry(request): + feed_id = request.POST['feed_id'] + feed = get_object_or_404(Feed, pk=feed_id) + + feed.has_exception = False + feed.fetched_once = False + feed.save() + + return {'code': 1} \ No newline at end of file diff --git a/media/css/reader.css b/media/css/reader.css index ec050e5ea..6c66a3b2e 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -406,6 +406,9 @@ a img { top: 2px; } +#feed_list .feed.NB-feed-unfetched .feed_counts { + display: none; +} #feed_list .feed.NB-feed-unfetched .feed_favicon { opacity: .5; } @@ -2622,11 +2625,11 @@ background: transparent; } .NB-menu-manage .NB-menu-manage-feed .NB-menu-manage-image { - margin-left: 18px; +/* margin-left: 18px; */ } .NB-menu-manage .NB-menu-manage-feed { - padding-left: 54px; +/* padding-left: 54px;*/ } /* ==================== */ @@ -2708,4 +2711,28 @@ background: transparent; color: #606060; font-size: 12px; margin: 24px 0; +} + +.NB-modal-exception .NB-exception-option-option { + color: #A0A0A0; + padding: 0 8px 0 0; +} + +.NB-modal-exception .NB-exception-option-meta { + float: right; + font-size: 11px; + font-weight: bold; + padding: 2px 0 0 0; +} + +.NB-modal-exception .NB-exception-option-meta-recommended { + color: #4A9937; +} + +.NB-modal-exception .NB-exception-option-address { + opacity: .2; +} + +.NB-modal-exception .NB-modal-submit input.NB-modal-submit-save { + margin-bottom: 6px; } \ No newline at end of file diff --git a/media/js/newsblur/assetmodel.js b/media/js/newsblur/assetmodel.js index 776530b02..55a4e9c76 100644 --- a/media/js/newsblur/assetmodel.js +++ b/media/js/newsblur/assetmodel.js @@ -229,6 +229,11 @@ NEWSBLUR.AssetModel.Reader.prototype = { updated = true; } } + if ((feed['has_exception'] && !self.feeds[f]['has_exception']) || + (self.feeds[f]['has_exception'] && !feed['has_exception'])) { + updated = true; + self.feeds[f]['has_exception'] = !!feed['has_exception']; + } if (updated && !(f in updated_feeds)) { updated_feeds.push(f); } @@ -442,8 +447,19 @@ NEWSBLUR.AssetModel.Reader.prototype = { start_import_from_google_reader: function(callback) { this.make_request('/import/import_from_google_reader/', {}, callback); + }, + + save_exception_retry: function(feed_id, callback) { + var self = this; + if (NEWSBLUR.Globals.is_authenticated) { + this.make_request('/rss_feeds/exception_retry', {'feed_id': feed_id}, function() { + if ($.isFunction(callback)) callback(); + }); + } else { + if ($.isFunction(callback)) callback(); + } } - + }; diff --git a/media/js/newsblur/reader.js b/media/js/newsblur/reader.js index 00ec0f9a9..373c4171f 100644 --- a/media/js/newsblur/reader.js +++ b/media/js/newsblur/reader.js @@ -562,7 +562,7 @@ var item = items[i]; if (typeof item == "number") { - var feed = this.model.feeds[item]; + var feed = this.model.get_feed(item); if (!feed) continue; var $feed = this.make_feed_title_line(feed, true, 'feed'); $feeds.append($feed); @@ -641,7 +641,7 @@ ]), $.make('img', { className: 'feed_favicon', src: this.google_favicon_url + feed.feed_link }), $.make('span', { className: 'feed_title' }, feed.feed_title), - $.make('div', { className: 'NB-feedbar-manage-feed', title: 'Manage Opinions' }), + $.make('div', { className: 'NB-feedbar-manage-feed', title: 'Manage Intelligence' }), (type == 'story' && $.make('div', { className: 'NB-feedbar-statistics', title: 'Statistics' })), (type == 'story' && $.make('div', { className: 'NB-feedbar-last-updated' }, [ $.make('span', { className: 'NB-feedbar-last-updated-label' }, 'Updated: '), @@ -1993,7 +1993,7 @@ ]), $.make('li', { className: 'NB-menu-manage-trainer' }, [ $.make('div', { className: 'NB-menu-manage-image' }), - $.make('div', { className: 'NB-menu-manage-title' }, 'Train intelligence'), + $.make('div', { className: 'NB-menu-manage-title' }, 'Intelligence Trainer'), $.make('div', { className: 'NB-menu-manage-subtitle' }, 'Accurate filters are happy filters.') ]), $.make('li', { className: 'NB-menu-manage-preferences' }, [ @@ -2016,16 +2016,16 @@ $.make('div', { className: 'NB-menu-manage-image' }), $.make('div', { className: 'NB-menu-manage-title' }, 'Really delete?') ]), - $.make('li', { className: 'NB-menu-manage-feed NB-menu-manage-feed-manage' }, [ - $.make('div', { className: 'NB-menu-manage-image' }), - $.make('div', { className: 'NB-menu-manage-title' }, 'Manage opinions'), - $.make('div', { className: 'NB-menu-manage-subtitle' }, 'What you like and don\'t like.') - ]), $.make('li', { className: 'NB-menu-manage-feed NB-menu-manage-feed-train' }, [ $.make('div', { className: 'NB-menu-manage-image' }), - $.make('div', { className: 'NB-menu-manage-title' }, 'Train intelligence'), + $.make('div', { className: 'NB-menu-manage-title' }, 'Site intelligence trainer'), $.make('div', { className: 'NB-menu-manage-subtitle' }, 'Choose classifiers for this site.') ]), + $.make('li', { className: 'NB-menu-manage-feed NB-menu-manage-feed-manage' }, [ + $.make('div', { className: 'NB-menu-manage-image' }), + $.make('div', { className: 'NB-menu-manage-title' }, 'Site intelligence manager'), + $.make('div', { className: 'NB-menu-manage-subtitle' }, 'What you like and don\'t like.') + ]), $.make('li', { className: 'NB-menu-manage-feed NB-menu-manage-feed-stats' }, [ $.make('div', { className: 'NB-menu-manage-image' }), $.make('div', { className: 'NB-menu-manage-title' }, 'Site statistics'), @@ -2337,7 +2337,7 @@ delete this.cache.refresh_callback; } - this.model.refresh_feeds($.rescope(this.post_feed_refresh, this)); + this.model.refresh_feeds($.rescope(this.post_feed_refresh, this), this.flags['has_unfetched_feeds']); }, post_feed_refresh: function(e, updated_feeds) { diff --git a/media/js/newsblur/reader_feed_exception.js b/media/js/newsblur/reader_feed_exception.js index eaf2e94a6..747416752 100644 --- a/media/js/newsblur/reader_feed_exception.js +++ b/media/js/newsblur/reader_feed_exception.js @@ -13,6 +13,7 @@ NEWSBLUR.ReaderFeedException.prototype = { runner: function() { this.make_modal(); + this.change_retry_option_meta(); this.handle_cancel(); this.open_modal(); @@ -28,21 +29,79 @@ NEWSBLUR.ReaderFeedException.prototype = { $.make('img', { className: 'NB-modal-feed-image feed_favicon', src: this.google_favicon_url + this.feed.feed_link }), $.make('span', { className: 'NB-modal-feed-title' }, this.feed.feed_title) ]), - $.make('div', { className: 'NB-exception-explanation' }, 'Not much to do yet. Soon you will be able to fix the URL, delete the feed, or force a retry.'), - $.make('form', { className: 'NB-exception-form' }, [ - $.make('div', { className: 'NB-modal-submit' }, [ - $.make('input', { type: 'submit', disabled: 'true', className: 'NB-disabled', value: 'Fill out proposed changes...' }), - ' or ', - $.make('a', { href: '#', className: 'NB-modal-cancel' }, 'cancel') + $.make('div', { className: 'NB-fieldset NB-exception-option NB-exception-option-retry NB-modal-submit' }, [ + $.make('h5', [ + $.make('div', { className: 'NB-exception-option-meta' }), + $.make('span', { className: 'NB-exception-option-option' }, 'Option 1:'), + 'Retry' + ]), + $.make('div', { className: 'NB-fieldset-fields' }, [ + $.make('div', [ + $.make('div', { className: 'NB-loading' }), + $.make('input', { type: 'submit', value: 'Retry fetching and parsing', className: 'NB-modal-submit-save NB-modal-submit-retry' }), + $.make('div', { className: 'NB-error' }) + ]) ]) - ]).bind('submit', function(e) { - e.preventDefault(); - self.save_preferences(); - return false; - }) + ]), + $.make('div', { className: 'NB-fieldset NB-exception-option NB-exception-option-address NB-modal-submit' }, [ + $.make('h5', [ + $.make('span', { className: 'NB-exception-option-option' }, 'Option 2:'), + 'Change Website Address' + ]), + $.make('div', { className: 'NB-fieldset-fields' }, [ + $.make('div', [ + $.make('div', { className: 'NB-loading' }), + $.make('label', { 'for': 'NB-exception-input-link' }, [ + $.make('div', { className: 'NB-folder-icon' }), + 'Website URL: ' + ]), + $.make('input', { type: 'text', id: 'NB-exception-input-link', className: 'NB-exception-input-link', name: 'feed_link', value: this.feed['feed_link'] }), + $.make('input', { type: 'submit', value: 'Fetch Feed From Website', className: 'NB-modal-submit-save NB-modal-submit-fetch' }), + $.make('div', { className: 'NB-error' }) + ]) + ]) + ]), + $.make('div', { className: 'NB-fieldset NB-exception-option NB-exception-option-address NB-modal-submit' }, [ + $.make('h5', [ + $.make('span', { className: 'NB-exception-option-option' }, 'Option 2:'), + 'Change RSS Feed Address' + ]), + $.make('div', { className: 'NB-fieldset-fields' }, [ + $.make('div', [ + $.make('div', { className: 'NB-loading' }), + $.make('label', { 'for': 'NB-exception-input-address' }, [ + $.make('div', { className: 'NB-folder-icon' }), + 'RSS/XML URL: ' + ]), + $.make('input', { type: 'text', id: 'NB-exception-input-address', className: 'NB-exception-input-address', name: 'feed_address', value: this.feed['feed_address'] }), + $.make('input', { type: 'submit', value: 'Parse this RSS/XML Feed', className: 'NB-modal-submit-save NB-modal-submit-parse' }), + $.make('div', { className: 'NB-error' }) + ]) + ]) + ]), + $.make('div', { className: 'NB-fieldset NB-exception-option NB-exception-option-delete NB-modal-submit' }, [ + $.make('h5', [ + $.make('span', { className: 'NB-exception-option-option' }, 'Option 3:'), + 'Just Delete This Feed' + ]), + $.make('div', { className: 'NB-fieldset-fields' }, [ + $.make('div', [ + $.make('div', { className: 'NB-loading' }), + $.make('input', { type: 'submit', value: 'Delete It. It Just Won\'t Work!', className: 'NB-modal-submit-save NB-modal-submit-delete' }), + $.make('div', { className: 'NB-error' }) + ]) + ]) + ]) ]); }, + change_retry_option_meta: function() { + var $meta = $('.NB-exception-option-retry .NB-exception-option-meta', this.$modal); + + $meta.addClass('NB-exception-option-meta-recommended'); + $meta.text('Recommended'); + }, + open_modal: function() { var self = this; @@ -79,6 +138,26 @@ NEWSBLUR.ReaderFeedException.prototype = { $.modal.close(); }); }, + + save_retry_feed: function() { + var self = this; + this.model.save_exception_retry(this.feed_id, function() { + NEWSBLUR.reader.flags['has_unfetched_feeds'] = true; + NEWSBLUR.reader.force_feed_refresh(); + $.modal.close(); + }); + }, + + delete_feed: function() { + var $loading = $('.NB-modal-loading', this.$model); + $loading.addClass('NB-active'); + var feed_id = this.feed_id; + + this.model.delete_publisher(feed_id, function() { + NEWSBLUR.reader.delete_feed(feed_id); + $.modal.close(); + }); + }, // =========== // = Actions = @@ -86,11 +165,16 @@ NEWSBLUR.ReaderFeedException.prototype = { handle_click: function(elem, e) { var self = this; - - $.targetIs(e, { tagSelector: '.NB-add-url-submit' }, function($t, $p) { + + $.targetIs(e, { tagSelector: '.NB-modal-submit-retry' }, function($t, $p) { e.preventDefault(); - self.save_add_url(); + self.save_retry_feed(); + }); + $.targetIs(e, { tagSelector: '.NB-modal-submit-delete' }, function($t, $p) { + e.preventDefault(); + + self.delete_feed(); }); }