From 41b68b32eb7aa31495efb17f317cfac70ba6f0ae Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Mon, 12 Mar 2012 12:33:54 -0700 Subject: [PATCH] Automatically loading intro or chooser dialog based on progress of new user. --- apps/feed_import/models.py | 6 +++ apps/rss_feeds/models.py | 8 ++-- media/css/reader.css | 29 ++++++-------- media/js/newsblur/common/assetmodel.js | 11 ++++- media/js/newsblur/reader/reader.js | 40 +++++++++---------- .../js/newsblur/reader/reader_feedchooser.js | 12 +++--- media/js/newsblur/reader/reader_intro.js | 9 +++-- 7 files changed, 62 insertions(+), 53 deletions(-) diff --git a/apps/feed_import/models.py b/apps/feed_import/models.py index f1c505572..65028e19f 100644 --- a/apps/feed_import/models.py +++ b/apps/feed_import/models.py @@ -151,6 +151,9 @@ class OPMLImporter(Importer): if self.user.profile.is_premium and not us.active: us.active = True us.save() + if not us.needs_unread_recalc: + us.needs_unread_recalc = True + us.save() folders.append(feed_db.pk) return folders @@ -245,6 +248,9 @@ class GoogleReaderImporter(Importer): 'active': self.user.profile.is_premium, } ) + if not us.needs_unread_recalc: + us.needs_unread_recalc = True + us.save() if not category: category = "Root" folders[category].append(feed_db.pk) except Exception, e: diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index 6663405d8..0ae9bf1c1 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -142,10 +142,10 @@ class Feed(models.Model): try: super(Feed, self).save(*args, **kwargs) return self - except IntegrityError, e: + except IntegrityError: duplicate_feed = Feed.objects.filter(feed_address=self.feed_address, feed_link=self.feed_link) logging.debug("%s: %s" % (self.feed_address, duplicate_feed)) - logging.debug(' ***> [%-30s] Feed deleted. Could not save: %s' % (unicode(self)[:30], e)) + logging.debug(' ***> [%-30s] Feed deleted.' % (unicode(self)[:30])) if duplicate_feed: merge_feeds(self.pk, duplicate_feed[0].pk) return duplicate_feed[0] @@ -1375,8 +1375,8 @@ def merge_feeds(original_feed_id, duplicate_feed_id, force=False): logging.info(" ---> Feed: [%s - %s] %s - %s" % (original_feed_id, duplicate_feed_id, original_feed, original_feed.feed_link)) - logging.info(" --> %s" % original_feed.feed_address) - logging.info(" --> %s" % duplicate_feed.feed_address) + logging.info(" --> %s / %s" % (original_feed.feed_address, original_feed.feed_link)) + logging.info(" --> %s / %s" % (duplicate_feed.feed_address, duplicate_feed.feed_link)) user_subs = UserSubscription.objects.filter(feed=duplicate_feed) for user_sub in user_subs: diff --git a/media/css/reader.css b/media/css/reader.css index b4c6622c7..556ac60a1 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -873,21 +873,16 @@ body.NB-theme-serif #story_pane .NB-feed-story-content { display: none; margin: -2px 0 0; } - -#NB-progress .NB-progress-link a { - -moz-box-shadow:1px 1px 1px #202020; - -webkit-box-shadow:1px 1px 1px #202020; - box-shadow:1px 1px 1px #202020; - -moz-border-radius:4px; +#NB-progress .NB-progress-link .NB-modal-submit-button { + padding: 3px 0; + font-size: 15px; + width: 90%; + margin: 0 auto; + -moz-box-shadow:2px 2px 0px #404040; + -webkit-box-shadow:2px 2px 0px #404040; + box-shadow:2px 2px 0px #404040; border-radius: 4px; - border:1px solid #606060; - font-size:12px; - margin:0 4px 0; - padding:0px 8px; - text-decoration:none; - text-transform:uppercase; - background-color: #217412; - color: #FFF; + border:1px solid #303030; } #NB-progress.NB-progress-error { @@ -5798,15 +5793,15 @@ background: transparent; .NB-modal-feedchooser .NB-feedchooser-type { float: left; width: 345px; - margin: 24px 12px 0 0; + margin: 0 12px 0 0; padding: 0 12px 0 0; } .NB-modal-feedchooser .NB-feedchooser-type.NB-last { - margin: 24px 0 0 0; + margin: 0 0 0 0; padding: 0 0 0 24px; margin-right: 0; - border-left: 1px solid #909090; + border-left: 1px solid #B0B0B0; } .NB-modal-feedchooser .NB-feedchooser-info { diff --git a/media/js/newsblur/common/assetmodel.js b/media/js/newsblur/common/assetmodel.js index 8683c8dcd..eb69d1707 100644 --- a/media/js/newsblur/common/assetmodel.js +++ b/media/js/newsblur/common/assetmodel.js @@ -42,7 +42,8 @@ NEWSBLUR.AssetModel.Reader = function() { this.starred_count = 0; this.read_stories_river_count = 0; this.flags = { - 'favicons_fetching': false + 'favicons_fetching': false, + 'has_chosen_feeds': false }; }; @@ -296,6 +297,8 @@ NEWSBLUR.AssetModel.Reader.prototype = { } }); } + + self.detect_any_inactive_feeds(); callback(); }; @@ -307,6 +310,12 @@ NEWSBLUR.AssetModel.Reader.prototype = { this.make_request('/reader/feeds', data, pre_callback, error_callback, {request_type: 'GET'}); }, + detect_any_inactive_feeds: function() { + this.flags['has_chosen_feeds'] = _.any(this.feeds, function(feed) { + return feed.active; + }); + }, + load_feeds_flat: function(callback, error_callback) { var self = this; var data = { diff --git a/media/js/newsblur/reader/reader.js b/media/js/newsblur/reader/reader.js index efd6cd0f2..0ba74d80c 100644 --- a/media/js/newsblur/reader/reader.js +++ b/media/js/newsblur/reader/reader.js @@ -1081,7 +1081,6 @@ $feed_list.empty(); this.$s.$story_taskbar.css({'display': 'block'}); - this.flags['has_chosen_feeds'] = this.detect_all_inactive_feeds(); var $feeds = this.make_feeds_folder(folders, 0); $feed_list.css({ 'display': 'block', @@ -1097,15 +1096,10 @@ $('.NB-task-manage').removeClass('NB-disabled'); $('.NB-callout-ftux').fadeOut(500); } - - if (NEWSBLUR.Globals.is_authenticated && this.flags['has_chosen_feeds']) { + this.open_dialog_after_feeds_loaded(); + if (NEWSBLUR.Globals.is_authenticated && this.model.flags['has_chosen_feeds']) { _.delay(_.bind(this.start_count_unreads_after_import, this), 1000); this.force_feeds_refresh($.rescope(this.finish_count_unreads_after_import, this), true); - } else if (!this.flags['has_chosen_feeds'] && this.flags['favicons_downloaded'] && folders.length) { - _.defer(_.bind(this.open_feedchooser_modal, this), 100); - return; - } else if (NEWSBLUR.Globals.is_authenticated && !folders.length) { - this.setup_ftux_add_feed_callout(); } if (folders.length) { @@ -1119,7 +1113,7 @@ this.force_feed_refresh(); } _.defer(_.bind(function() { - this.model.load_feed_favicons($.rescope(this.make_feed_favicons, this), this.flags['favicons_downloaded'], this.flags['has_chosen_feeds']); + this.model.load_feed_favicons($.rescope(this.make_feed_favicons, this), this.flags['favicons_downloaded'], this.model.flags['has_chosen_feeds']); var force_socket = NEWSBLUR.Globals.is_admin; this.setup_socket_realtime_unread_counts(force_socket); }, this)); @@ -1162,9 +1156,7 @@ $feed_favicon.attr('src', $.favicon(model.get_feed(feed_id))); }); - if (!this.flags['has_chosen_feeds'] && this.model.folders.length) { - _.defer(_.bind(this.open_feedchooser_modal, this), 100); - } + this.open_dialog_after_feeds_loaded(); }, sort_items: function(a, b) { @@ -1218,14 +1210,6 @@ $('.folder', $feeds).tsort('.folder_title_text'); }, - detect_all_inactive_feeds: function() { - var feeds = this.model.feeds; - var has_chosen_feeds = _.any(feeds, function(feed) { - return feed.active; - }); - return has_chosen_feeds; - }, - make_feeds_folder: function(items, depth, collapsed_parent) { var self = this; var $feeds = ""; @@ -1619,7 +1603,9 @@ $('.NB-progress-counts', $progress).hide(); $('.NB-progress-percentage', $progress).hide(); $progress.addClass('NB-progress-error').addClass('NB-progress-big'); - $('.NB-progress-link', $progress).html($.make('a', { href: '#', className: 'NB-splash-link NB-menu-manage-feedchooser' }, 'Choose your 64 sites')); + $('.NB-progress-link', $progress).html($.make('div', { + className: 'NB-modal-submit-button NB-modal-submit-green NB-menu-manage-feedchooser' + }, ['Choose your 64 sites'])); this.show_progress_bar(); }, @@ -1632,6 +1618,16 @@ this.hide_progress_bar(); }, + open_dialog_after_feeds_loaded: function() { + if (!NEWSBLUR.Globals.is_authenticated) return; + + if (!this.model.folders.length) { + _.defer(_.bind(this.open_intro_modal, this), 100); + } else if (!this.model.flags['has_chosen_feeds'] && this.flags['favicons_downloaded'] && this.model.folders.length) { + _.defer(_.bind(this.open_feedchooser_modal, this), 100); + } + }, + // ================ // = Progress Bar = // ================ @@ -6335,7 +6331,7 @@ var percentage = 0; var feeds_count = _.keys(this.model.feeds).length; - if (!this.flags['pause_feed_refreshing']) return; + if (!this.flags['pause_feed_refreshing'] || this.flags['has_unfetched_feeds']) return; this.flags['count_unreads_after_import_working'] = true; diff --git a/media/js/newsblur/reader/reader_feedchooser.js b/media/js/newsblur/reader/reader_feedchooser.js index 6ae6964e6..a8cc20608 100644 --- a/media/js/newsblur/reader/reader_feedchooser.js +++ b/media/js/newsblur/reader/reader_feedchooser.js @@ -30,7 +30,7 @@ NEWSBLUR.ReaderFeedchooser.prototype = { var self = this; this.$modal = $.make('div', { className: 'NB-modal-feedchooser NB-modal' }, [ - $.make('h2', { className: 'NB-modal-title' }, 'Choose Your '+this.MAX_FEEDS), + // $.make('h2', { className: 'NB-modal-title' }, 'Choose Your '+this.MAX_FEEDS), $.make('div', { className: 'NB-feedchooser-type'}, [ $.make('div', { className: 'NB-feedchooser-info'}, [ $.make('div', { className: 'NB-feedchooser-info-type' }, [ @@ -73,7 +73,7 @@ NEWSBLUR.ReaderFeedchooser.prototype = { ]), $.make('li', { className: 'NB-2' }, [ $.make('div', { className: 'NB-feedchooser-premium-bullet-image' }), - 'Unlimited number of sites' + 'Unlimited number of sites.' ]), $.make('li', { className: 'NB-3' }, [ $.make('div', { className: 'NB-feedchooser-premium-bullet-image' }), @@ -81,16 +81,16 @@ NEWSBLUR.ReaderFeedchooser.prototype = { ]), $.make('li', { className: 'NB-4' }, [ $.make('div', { className: 'NB-feedchooser-premium-bullet-image' }), - 'Access to future premium-only features like searching, archives, and [top secret]' + 'Access to future features like searching.' ]), $.make('li', { className: 'NB-5' }, [ $.make('div', { className: 'NB-feedchooser-premium-bullet-image' }), - 'You feed my poor, hungry dog for 6 days', + 'You feed my poor, hungry dog for 6 days.', $.make('img', { className: 'NB-feedchooser-premium-poor-hungry-dog', src: NEWSBLUR.Globals.MEDIA_URL + '/img/reader/shiloh.jpg' }) ]), $.make('li', { className: 'NB-6' }, [ $.make('div', { className: 'NB-feedchooser-premium-bullet-image' }), - 'You are supporting an indie developer' + 'You are supporting a solo indie developer.' ]), $.make('li', { className: 'NB-7' }, [ $.make('div', { className: 'NB-feedchooser-premium-bullet-image' }), @@ -219,7 +219,7 @@ NEWSBLUR.ReaderFeedchooser.prototype = { $('#simplemodal-container').corner('6px'); }, 'onClose': function(dialog, callback) { - if (!self.flags['has_saved'] && !NEWSBLUR.reader.flags['has_chosen_feeds']) { + if (!self.flags['has_saved'] && !self.model.flags['has_chosen_feeds']) { NEWSBLUR.reader.show_feed_chooser_button(); } dialog.data.hide().empty().remove(); diff --git a/media/js/newsblur/reader/reader_intro.js b/media/js/newsblur/reader/reader_intro.js index d6775bb58..3ce4023dc 100644 --- a/media/js/newsblur/reader/reader_intro.js +++ b/media/js/newsblur/reader/reader_intro.js @@ -1,11 +1,11 @@ NEWSBLUR.ReaderIntro = function(options) { var defaults = {}; + var intro_page = this.model.preference('intro_page'); _.bindAll(this, 'close'); - this.model = NEWSBLUR.AssetModel.reader(); this.options = $.extend({ - 'page_number': this.model.preference('intro_page') || 1 + 'page_number': intro_page && _.isNumber(intro_page) && intro_page <= 4 ? intro_page : 1 }, defaults, options); this.services = { 'twitter': {}, @@ -235,7 +235,10 @@ _.extend(NEWSBLUR.ReaderIntro.prototype, { if (page_number == page_count) { $('.NB-tutorial-next-page-text', this.$modal).text('All Done '); } else if (page_number > page_count) { - return this.close(); + this.close(function() { + NEWSBLUR.reader.open_dialog_after_feeds_loaded(); + }); + return; } else if (page_number == 1) { $('.NB-tutorial-next-page-text', this.$modal).text("Let's Get Started "); } else {