All setup module items now disappear/appear or show a Done title appropriately.

This commit is contained in:
Samuel Clay 2012-03-19 14:15:38 -07:00
parent 0d9a8be334
commit 8f0afbb7c2
14 changed files with 135 additions and 114 deletions

View file

@ -43,7 +43,7 @@ def twitter_connect(request):
logging.user(request, "~BB~FRFailed Twitter connect, another user: %s" % user.username)
return dict(error=("Another user (%s, %s) has "
"already connected with those Twitter credentials."
% (user.username, user.email)))
% (user.username, user.email or "no email")))
social_services, _ = MSocialServices.objects.get_or_create(user_id=request.user.pk)
social_services.twitter_uid = unicode(twitter_user.id)

View file

@ -8,27 +8,39 @@ class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'Profile.has_trained_intelligence'
db.add_column('profile_profile', 'has_trained_intelligence', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
# Adding field 'Profile.hide_find_friends'
db.add_column('profile_profile', 'hide_find_friends', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
# Deleting field 'Profile.tutorial_finished'
db.delete_column('profile_profile', 'tutorial_finished')
# Adding field 'Profile.hide_getting_started'
db.add_column('profile_profile', 'hide_getting_started', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
# Adding field 'Profile.has_setup_feeds'
db.add_column('profile_profile', 'has_setup_feeds', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
# Adding field 'Profile.has_found_friends'
db.add_column('profile_profile', 'has_found_friends', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
# Adding field 'Profile.has_trained_intelligence'
db.add_column('profile_profile', 'has_trained_intelligence', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
def backwards(self, orm):
# Deleting field 'Profile.has_trained_intelligence'
db.delete_column('profile_profile', 'has_trained_intelligence')
# Deleting field 'Profile.hide_find_friends'
db.delete_column('profile_profile', 'hide_find_friends')
# Adding field 'Profile.tutorial_finished'
db.add_column('profile_profile', 'tutorial_finished', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
# Deleting field 'Profile.hide_getting_started'
db.delete_column('profile_profile', 'hide_getting_started')
# Deleting field 'Profile.has_setup_feeds'
db.delete_column('profile_profile', 'has_setup_feeds')
# Deleting field 'Profile.has_found_friends'
db.delete_column('profile_profile', 'has_found_friends')
# Deleting field 'Profile.has_trained_intelligence'
db.delete_column('profile_profile', 'has_trained_intelligence')
models = {
'auth.group': {
@ -71,8 +83,9 @@ class Migration(SchemaMigration):
'Meta': {'object_name': 'Profile'},
'collapsed_folders': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
'feed_pane_size': ('django.db.models.fields.IntegerField', [], {'default': '240'}),
'has_found_friends': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'has_setup_feeds': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'has_trained_intelligence': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'hide_find_friends': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'hide_getting_started': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'hide_mobile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
@ -82,8 +95,9 @@ class Migration(SchemaMigration):
'preferences': ('django.db.models.fields.TextField', [], {'default': "'{}'"}),
'secret_token': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}),
'send_emails': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'stripe_4_digits': ('django.db.models.fields.CharField', [], {'max_length': '4', 'null': 'True', 'blank': 'True'}),
'stripe_id': ('django.db.models.fields.CharField', [], {'max_length': '24', 'null': 'True', 'blank': 'True'}),
'timezone': ('vendor.timezones.fields.TimeZoneField', [], {'default': "'America/New_York'", 'max_length': '100'}),
'tutorial_finished': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"}),
'view_settings': ('django.db.models.fields.TextField', [], {'default': "'{}'"})
}

View file

@ -28,10 +28,10 @@ class Profile(models.Model):
view_settings = models.TextField(default="{}")
collapsed_folders = models.TextField(default="[]")
feed_pane_size = models.IntegerField(default=240)
tutorial_finished = models.BooleanField(default=False)
has_trained_intelligence = models.BooleanField(default=False)
hide_find_friends = models.BooleanField(default=False)
hide_getting_started = models.BooleanField(default=False)
has_setup_feeds = models.BooleanField(default=False)
has_found_friends = models.BooleanField(default=False)
has_trained_intelligence = models.BooleanField(default=False)
hide_mobile = models.BooleanField(default=False)
last_seen_on = models.DateTimeField(default=datetime.datetime.now)
last_seen_ip = models.CharField(max_length=50, blank=True, null=True)

View file

@ -17,9 +17,10 @@ from utils import json_functions as json
from utils.user_functions import ajax_login_required
from vendor.paypal.standard.forms import PayPalPaymentsForm
SINGLE_FIELD_PREFS = ('timezone','feed_pane_size','tutorial_finished','hide_mobile','send_emails',
'has_trained_intelligence', 'hide_find_friends', 'hide_getting_started',)
SPECIAL_PREFERENCES = ('old_password', 'new_password', 'autofollow_friends')
SINGLE_FIELD_PREFS = ('timezone','feed_pane_size','hide_mobile','send_emails',
'hide_getting_started', 'has_setup_feeds', 'has_found_friends',
'has_trained_intelligence',)
SPECIAL_PREFERENCES = ('old_password', 'new_password', 'autofollow_friends',)
@ajax_login_required
@require_POST

View file

@ -1067,6 +1067,9 @@ def feeds_trainer(request):
classifier['feed_authors'] = json.decode(us.feed.data.popular_authors) if us.feed.data.popular_authors else []
classifiers.append(classifier)
user.profile.has_trained_intelligence = True
user.profile.save()
logging.user(user, "~FGLoading Trainer: ~SB%s feeds" % (len(classifiers)))
return classifiers

View file

@ -15,7 +15,6 @@
"feed_pane_size": 240,
"last_seen_ip": null,
"view_settings": "{}",
"tutorial_finished": false,
"is_premium": false,
"user": 1,
"collapsed_folders": "[]",

View file

@ -2553,7 +2553,7 @@ background: transparent;
.NB-taskbar {
position: relative;
overflow: hidden;
/* overflow: hidden;*/ /* No hidden overflow so ftux callouts can show */
}
.NB-taskbar .NB-taskbar-sidebar-toggle-close {
width: 20px;
@ -3930,6 +3930,21 @@ background: transparent;
.NB-module .NB-module-item.NB-last {
margin-bottom: 0;
}
.NB-module .NB-module-item .NB-done-label {
display: none;
padding-left: 20px;
text-transform: uppercase;
font-weight: bold;
background: transparent url(/media/embed/icons/silk/accept.png) no-repeat 0 0;
color: #808080;
font-size: 13px;
}
.NB-module .NB-module-item.NB-done .NB-modal-submit {
display: none;
}
.NB-module .NB-module-item.NB-done .NB-done-label {
display: block;
}
.NB-module .NB-module-item .NB-module-content-header {
margin-left: 128px;
}
@ -5400,6 +5415,10 @@ background: transparent;
text-align: center;
padding: 12px 0 31px;
}
.NB-modal-intro .NB-page-2 h4 {
margin-bottom: 34px;
}
.NB-modal-intro .NB-intro-import .NB-modal-submit-button {
margin: 0;
font-weight: bold;

View file

@ -1112,6 +1112,8 @@
this.load_sortable_feeds();
this.update_header_counts();
_.delay(_.bind(this.update_starred_count, this), 250);
this.model.preference('has_setup_feeds', true);
NEWSBLUR.reader.check_hide_getting_started();
}
if (this.flags['showing_feed_in_tryfeed_view'] || this.flags['showing_social_feed_in_tryfeed_view']) {
@ -1628,8 +1630,13 @@
open_dialog_after_feeds_loaded: function() {
if (!NEWSBLUR.Globals.is_authenticated) return;
if (!this.model.folders.length && (!NEWSBLUR.intro || !NEWSBLUR.intro.flags.open)) {
_.defer(_.bind(this.open_intro_modal, this), 100);
if (!this.model.folders.length) {
if (!this.model.preference('has_setup_feeds') &&
(!NEWSBLUR.intro || !NEWSBLUR.intro.flags.open)) {
_.defer(_.bind(this.open_intro_modal, this), 100);
} else if (this.model.preference('has_setup_feeds')) {
this.setup_ftux_add_feed_callout();
}
} else if (!this.model.flags['has_chosen_feeds'] && this.flags['favicons_downloaded'] && this.model.folders.length) {
_.defer(_.bind(this.open_feedchooser_modal, this), 100);
}
@ -3889,52 +3896,25 @@
NEWSBLUR.intro = new NEWSBLUR.ReaderIntro(options);
},
hide_tutorial: function() {
var $tutorial = $('.NB-module-item-tutorial');
this.model.preference('tutorial_finished', true);
$tutorial.animate({
'opacity': 0
}, {
'duration': 500,
'complete': function() {
$tutorial.slideUp(350);
}
});
},
hide_intelligence_trainer: function() {
var $trainer = $('.NB-module-account-trainer');
this.model.preference('has_trained_intelligence', true);
$trainer.animate({
'opacity': 0
}, {
'duration': 500,
'complete': function() {
$trainer.slideUp(350);
}
});
$trainer.addClass('NB-done');
},
hide_find_friends: function() {
var $findfriends = $('.NB-module-find-friends');
this.model.preference('hide_find_friends', true);
$findfriends.animate({
'opacity': 0
}, {
'duration': 500,
'complete': function() {
$findfriends.slideUp(350);
}
});
$findfriends.addClass('NB-done');
},
check_hide_getting_started: function(force) {
if (force || this.preference('hide_tutorial') &&
this.preference('hide_find_friends') &&
this.preference('has_trained_intelligence')) {
var friends = this.model.preference('has_found_friends');
var trained = this.model.preference('has_trained_intelligence');
var feeds = this.model.preference('has_setup_feeds');
if (force ||
friends && trained && feeds) {
var $gettingstarted = $('.NB-module-gettingstarted');
$gettingstarted.animate({
'opacity': 0
@ -3945,6 +3925,16 @@
}
});
this.model.preference('hide_getting_started', true);
} else {
var $intro = $('.NB-module-item-intro');
var $findfriends = $('.NB-module-find-friends');
var $trainer = $('.NB-module-account-trainer');
$intro.toggleClass('NB-done', feeds);
$findfriends.toggleClass('NB-done', friends);
$findfriends.toggleClass('NB-hidden', !feeds);
$trainer.toggleClass('NB-done', trained);
$trainer.toggleClass('NB-hidden', !feeds);
}
},
@ -6241,6 +6231,7 @@
setup_ftux_add_feed_callout: function() {
var self = this;
if (this.flags['bouncing_callout']) return;
$('.NB-callout-ftux .NB-callout-text').text('First things first...');
$('.NB-callout-ftux').corner('5px');

View file

@ -802,7 +802,8 @@ var classifier_prototype = {
if (this.options['training']) {
$.targetIs(e, { tagSelector: '.NB-modal-submit-begin' }, function($t, $p){
e.preventDefault();
NEWSBLUR.reader.hide_intelligence_trainer();
self.model.preference('has_trained_intelligence', true);
NEWSBLUR.reader.check_hide_getting_started();
self.load_next_feed_in_trainer();
});
$.targetIs(e, { tagSelector: '.NB-modal-submit-save.NB-modal-submit-next' }, function($t, $p){

View file

@ -341,8 +341,10 @@ _.extend(NEWSBLUR.ReaderFriends.prototype, {
this.resize();
} else {
this.fetch_friends();
NEWSBLUR.reader.hide_find_friends();
}
this.model.preference('has_found_friends', true);
NEWSBLUR.reader.check_hide_getting_started();
},
close_and_load_account: function() {

View file

@ -258,8 +258,9 @@ _.extend(NEWSBLUR.ReaderIntro.prototype, {
this.resize();
} else {
this.fetch_friends();
NEWSBLUR.reader.hide_find_friends();
}
this.model.preference('has_found_friends', true);
NEWSBLUR.reader.check_hide_getting_started();
},
// ==========
@ -285,6 +286,9 @@ _.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) {
this.model.preference('has_setup_feeds', true);
NEWSBLUR.reader.check_hide_getting_started();
this.close(function() {
NEWSBLUR.reader.open_dialog_after_feeds_loaded();
});

View file

@ -473,9 +473,6 @@ _.extend(NEWSBLUR.ReaderTutorial.prototype, {
close: function() {
this.model.load_tutorial({'finished': true});
_.delay(function() {
NEWSBLUR.reader.hide_tutorial();
}, 500);
NEWSBLUR.Modal.prototype.close.call(this);
},

View file

@ -28,7 +28,8 @@
'unread_view' : 0,
'lock_mouse_indicator' : 0,
'feed_pane_size' : {% firstof user_profile.feed_pane_size 240 %},
'tutorial_finished' : {{ user_profile.tutorial_finished|yesno:"true,false" }},
'has_setup_feeds' : {{ user_profile.has_setup_feeds|yesno:"true,false" }},
'has_found_friends' : {{ user_profile.has_found_friends|yesno:"true,false" }},
'has_trained_intelligence': {{ user_profile.has_trained_intelligence|yesno:"true,false" }},
'hide_mobile' : {{ user_profile.hide_mobile|yesno:"true,false" }},
'story_titles_pane_size' : 168,

View file

@ -297,7 +297,7 @@
<div class="NB-modal-submit">
{% if feed_count == 0 %}
<div class="NB-modal-submit-green NB-modal-submit-button NB-task-add NB-javascript">Add Sites</div>
{# <div class="NB-modal-submit-green NB-modal-submit-button NB-task-add NB-javascript">Add Sites</div> #}
{% else %}
<div class="{% if active_count == 0 %}NB-modal-submit-green{% else %}NB-modal-submit-close{% endif %} NB-modal-submit-button NB-module-account-upgrade NB-javascript">Choose Your 64 Sites</div>
{% endif %}
@ -306,7 +306,7 @@
</div>
</div>
{% if user_statistics %}
<div class="NB-module-user-statistics {% if not user_statistics.shared_stories or not user_statistics %}NB-hidden{% endif %}">
<h3 class="NB-module-content-header">
Your statistics
</h3>
@ -325,54 +325,40 @@
<div class="NB-module-stats-count-description">Follower{{ user_statistics.followers|pluralize }}</div>
</div>
</div>
{% endif %}
</div>
</div>
<div class="NB-module NB-module-gettingstarted {% if user_profile.hide_getting_started %}NB-hidden{% endif %}">
{% if not user_profile.hide_getting_started %}
<div class="NB-module NB-module-gettingstarted">
<h5 class="NB-module-header">
Getting Started
<div class="NB-module-header-right">
<a href="#" class="NB-splash-link NB-module-gettingstarted-hide">Hide</a>
</div>
</h5>
<div class="NB-module-item NB-module-item-intro NB-last">
<div class="NB-module-item-image">
<img src="{{ MEDIA_URL }}/img/reader/account_friends.jpg" />
</div>
<h3 class="NB-module-content-header">
<span class="NB-module-content-subtitle">
<div class="NB-module-item NB-module-item-intro {% if user_profile.has_setup_feeds %}NB-done{% endif %}">
<div class="NB-module-item-image">
<img src="{{ MEDIA_URL }}/img/reader/module_tutorial.jpg" />
</div>
<h3 class="NB-module-content-header">
<span class="NB-module-content-subtitle">
It's quick!
</span>
Start by setting up NewsBlur
</h3>
<div class="NB-module-item-title">
<div class="NB-modal-submit">
</span>
Start by setting up NewsBlur
</h3>
<div class="NB-module-item-title">
<div class="NB-modal-submit">
<div class="NB-modal-submit-green NB-modal-submit-button NB-module-launch-intro NB-javascript">Setup NewsBlur</div>
</div>
</div>
</div>
<div class="NB-done-label">Done</div>
</div>
{% if not user_profile.tutorial_finished %}
<div class="NB-module-item NB-module-item-tutorial NB-last {% if user_profile.tutorial_finished %}NB-hidden{% endif %}">
<div class="NB-module-item-image">
<img src="{{ MEDIA_URL }}/img/reader/module_tutorial.jpg" />
</div>
<h3 class="NB-module-content-header">
<span class="NB-module-content-subtitle">
It's quick!
</span>
Tips and Tricks
</h3>
<div class="NB-module-item-title">
<div class="NB-modal-submit">
<div class="NB-modal-submit-green NB-modal-submit-button NB-module-launch-tutorial NB-javascript">This is going away...</div>
</div>
</div>
</div>
{% endif %}
{% if not user_profile.hide_find_friends %}
<div class="NB-module-item NB-module-find-friends">
</div>
<div class="NB-module-item NB-module-find-friends
{% if not user_profile.has_setup_feeds %}NB-hidden{% endif %}
{% if user_profile.has_found_friends %}NB-done{% endif %}">
<div class="NB-module-item-image">
<img src="{{ MEDIA_URL }}/img/reader/account_friends.jpg" />
</div>
@ -384,30 +370,33 @@
</h3>
<div class="NB-module-item-title">
<div class="NB-modal-submit">
<div class="NB-modal-submit-green NB-modal-submit-button NB-module-friends-button NB-javascript">Find and Follow Friends</div>
<div class="NB-modal-submit-green NB-modal-submit-button NB-module-friends-button NB-javascript">Find and Follow Friends</div>
</div>
<div class="NB-done-label">Done</div>
</div>
</div>
{% endif %}
{% if not user_profile.has_trained_intelligence %}
<div class="NB-module-item NB-module-account-trainer NB-last {% if train_count == active_count %}NB-hidden{% endif %}">
</div>
<div class="NB-module-item NB-module-account-trainer NB-last
{% if not user_profile.has_setup_feeds %}NB-hidden{% endif %}
{% if user_profile.has_trained_intelligence %}NB-done{% endif %}">
<div class="NB-module-item-image">
<img src="{{ MEDIA_URL }}/img/reader/account_trainer.jpg" />
</div>
<h3 class="NB-module-content-header">
<span class="NB-module-content-subtitle">
<span class="NB-module-account-trainer-count">{{ train_count }}</span> of {{ active_count }} site{{ active_count|pluralize }}
<span class="NB-module-account-trainer-count">{{ train_count }}</span> of {{ active_count }} site{{ active_count|pluralize }}
</span>
Intelligence Trainer
</h3>
<div class="NB-module-item-title">
<div class="NB-modal-submit">
<div class="NB-modal-submit-green NB-modal-submit-button NB-module-account-train NB-javascript">Launch Intelligence Trainer</div>
<div class="NB-modal-submit-green NB-modal-submit-button NB-module-account-train NB-javascript">Launch Intelligence Trainer</div>
</div>
<div class="NB-done-label">Done</div>
</div>
</div>
{% endif %}
</div>
</div>
{% endif %}
{% if not user_profile.hide_mobile %}
<div class="NB-module NB-module-mobile">