Merge branch 'master' of github.com:samuelclay/NewsBlur

This commit is contained in:
Samuel Clay 2010-11-08 12:10:49 -05:00
commit e05460abb5
8 changed files with 92 additions and 20 deletions

View file

@ -4,6 +4,7 @@ from django.db import IntegrityError
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.core.mail import mail_admins
from django.contrib.auth import authenticate
from apps.reader.models import UserSubscription
from apps.rss_feeds.models import Feed
from apps.feed_import.models import queue_new_feeds
@ -61,4 +62,13 @@ def paypal_signup(sender, **kwargs):
ipn_obj = sender
user = User.objects.get(username=ipn_obj.custom)
user.profile.activate_premium()
subscription_signup.connect(paypal_signup)
subscription_signup.connect(paypal_signup)
def change_password(user, old_password, new_password):
user_db = authenticate(username=user.username, password=old_password)
if user_db is None:
return -1
else:
user_db.set_password(new_password)
user_db.save()
return 1

View file

@ -9,29 +9,37 @@ from django.core.mail import mail_admins
from utils import json_functions as json
from paypal.standard.forms import PayPalPaymentsForm
from utils.user_functions import ajax_login_required
from apps.profile.models import Profile
from apps.profile.models import Profile, change_password
from apps.reader.models import UserSubscription
SINGLE_FIELD_PREFS = ('timezone',)
SPECIAL_PREFERENCES = ('old_password', 'new_password',)
@ajax_login_required
@require_POST
@json.json_view
def set_preference(request):
code = 1
message = ''
new_preferences = request.POST
preferences = json.decode(request.user.profile.preferences)
for preference_name, preference_value in new_preferences.items():
if preference_name in SINGLE_FIELD_PREFS:
setattr(request.user.profile, preference_name, preference_value)
elif preference_name in SPECIAL_PREFERENCES:
if preference_name == 'old_password':
code = change_password(request.user, new_preferences['old_password'],
new_preferences['new_password'])
if code == -1:
message = "Your old password is incorrect."
else:
preferences[preference_name] = preference_value
request.user.profile.preferences = json.encode(preferences)
request.user.profile.save()
response = dict(code=code)
response = dict(code=code, message=message)
return response
@ajax_login_required

View file

@ -200,7 +200,7 @@ class MUserStory(mongo.Document):
meta = {
'collection': 'userstories',
'indexes': ['feed_id', ('user_id', 'feed_id')],
'indexes': [('user_id', 'feed_id'), ('feed_id', 'read_date')],
'allow_inheritance': False,
}

View file

@ -178,7 +178,7 @@ class Feed(models.Model):
self.save()
def count_subscribers(self, verbose=False):
SUBSCRIBER_EXPIRE = datetime.datetime.now() - datetime.timedelta(days=30)
SUBSCRIBER_EXPIRE = datetime.datetime.now() - datetime.timedelta(days=settings.SUBSCRIBER_EXPIRE)
from apps.reader.models import UserSubscription
subs = UserSubscription.objects.filter(feed=self)
@ -599,19 +599,19 @@ class Feed(models.Model):
# 2 subscribers:
# 1 update per day = 4.5 hours
# 10 updates = 55 minutes
updates_per_day_delay = 6 * 60 / max(.25, ((max(0, self.num_subscribers)**.25)
* (updates_per_day**.75)))
updates_per_day_delay = 6 * 60 / max(.25, ((max(0, self.num_subscribers)**.20)
* (updates_per_day**.70)))
if self.premium_subscribers > 0:
updates_per_day_delay = updates_per_day_delay / 5
updates_per_day_delay = updates_per_day_delay / 4
# Lots of subscribers = lots of updates
# 144 hours for 0 subscribers.
# 24 hours for 1 subscriber.
# 7 hours for 2 subscribers.
# 3 hours for 3 subscribers.
# 25 min for 10 subscribers.
subscriber_bonus = 24 * 60 / max(.167, max(0, self.num_subscribers)**1.65)
subscriber_bonus = 24 * 60 / max(.167, max(0, self.num_subscribers)**1.35)
if self.premium_subscribers > 0:
subscriber_bonus = subscriber_bonus / 5
subscriber_bonus = subscriber_bonus / 4
slow_punishment = 0
if self.num_subscribers <= 1:

View file

@ -3524,6 +3524,12 @@ background: transparent;
float: left;
cursor: pointer;
}
.NB-modal-preferences .NB-preference .NB-preference-error {
color: #83210A;
font-size: 11px;
margin-top: 4px;
font-weight: bold;
}
.NB-modal-preferences .NB-preference-view {
padding-bottom: 4px;
@ -3541,3 +3547,24 @@ background: transparent;
.NB-modal-preferences .NB-preference-window label img {
vertical-align: middle;
margin: 0 6px 0 2px;
}
.NB-modal-preferences .NB-preference-password .NB-preference-option {
float: left;
margin: 0 12px 0 0;
}
.NB-modal-preferences .NB-preference-password label {
text-transform: uppercase;
font-size: 10px;
color: #505050;
margin: 0;
}
.NB-modal-preferences .NB-preference-password input {
width: 140px;
font-size: 14px;
padding: 2px;
margin: 0px 4px 2px;
border: 1px solid #606060;
-moz-box-shadow:2px 2px 0 #D0D0D0;
-webkit-box-shadow:2px 2px 0 #D0D0D0;
box-shadow:2px 2px 0 #D0D0D0;
}

View file

@ -190,6 +190,22 @@ NEWSBLUR.ReaderPreferences.prototype = {
'Site sidebar'
])
]),
$.make('div', { className: 'NB-preference NB-preference-password' }, [
$.make('div', { className: 'NB-preference-options' }, [
$.make('div', { className: 'NB-preference-option' }, [
$.make('label', { 'for': 'NB-preference-password-old' }, 'Old password'),
$.make('input', { id: 'NB-preference-password-old', type: 'password', name: 'old_password', value: '' })
]),
$.make('div', { className: 'NB-preference-option' }, [
$.make('label', { 'for': 'NB-preference-password-new' }, 'New password'),
$.make('input', { id: 'NB-preference-password-new', type: 'password', name: 'new_password', value: '' })
])
]),
$.make('div', { className: 'NB-preference-label'}, [
'Change Password',
$.make('div', { className: 'NB-preference-error'})
])
]),
$.make('div', { className: 'NB-modal-submit' }, [
$.make('input', { type: 'submit', disabled: 'true', className: 'NB-modal-submit-green NB-disabled', value: 'Change what you like above...' }),
' or ',
@ -273,7 +289,7 @@ NEWSBLUR.ReaderPreferences.prototype = {
serialize_preferences: function() {
var preferences = {};
$('input[type=radio]:checked, select', this.$modal).each(function() {
$('input[type=radio]:checked, select, input[type=password]', this.$modal).each(function() {
preferences[$(this).attr('name')] = $(this).val();
});
@ -281,10 +297,17 @@ NEWSBLUR.ReaderPreferences.prototype = {
},
save_preferences: function() {
var self = this;
var form = this.serialize_preferences();
$('.NB-preference-error', this.$modal).text('');
$('input[type=submit]', this.$modal).val('Saving...').attr('disabled', true).addClass('NB-disabled');
this.model.save_preferences(form, function() {
this.model.save_preferences(form, function(data) {
NEWSBLUR.log(['data', data]);
if (data.code == -1) {
$('.NB-preference-password .NB-preference-error', this.$modal).text(data.message);
self.disable_save();
}
NEWSBLUR.reader.switch_feed_view_unread_view();
$.modal.close();
});
@ -305,9 +328,17 @@ NEWSBLUR.ReaderPreferences.prototype = {
},
handle_change: function() {
$('input[type=radio],select', this.$modal).bind('change', _.bind(function() {
$('input[type=submit]', this.$modal).removeAttr('disabled').removeClass('NB-disabled').val('Save Preferences');
}, this));
$('input[type=radio],select,input[type=password]', this.$modal).bind('change', _.bind(this.enable_save, this));
$('input[type=password]', this.$modal).bind('keydown', _.bind(this.enable_save, this));
},
enable_save: function() {
$('input[type=submit]', this.$modal).removeAttr('disabled').removeClass('NB-disabled').val('Save Preferences');
},
disable_save: function() {
$('input[type=submit]', this.$modal).addAttr('disabled').addClass('NB-disabled').val('Change what you like above...');
}
};

View file

@ -190,6 +190,7 @@ SOUTH_TESTS_MIGRATE = False
SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
TEST_RUNNER = "utils.testrunner.TestRunner"
DAYS_OF_UNREAD = 14
SUBSCRIBER_EXPIRE = 12
# ===========
# = Logging =

View file

@ -357,11 +357,6 @@ class Dispatcher:
logging.debug(u' ---> [%-30s] Computing scores for all feed subscribers: %s subscribers' % (
unicode(feed)[:30], user_subs.count()))
# Delete old read stories
old_readstories = MUserStory.objects(feed_id=feed.pk,
read_date__lt=UNREAD_CUTOFF)
old_readstories.delete()
stories_db = MStory.objects(story_feed_id=feed.pk,
story_date__gte=UNREAD_CUTOFF)
for sub in user_subs: