From e7646d7e9811a4a594f37fa8a674febdf4765ce2 Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Mon, 8 Nov 2010 12:09:55 -0500 Subject: [PATCH] Adding change password to Preferences. Also changing timing for feed updates. --- apps/profile/models.py | 12 +++++++- apps/profile/views.py | 12 ++++++-- apps/reader/models.py | 2 +- apps/rss_feeds/models.py | 12 ++++---- media/css/reader.css | 27 ++++++++++++++++ media/js/newsblur/reader_preferences.js | 41 ++++++++++++++++++++++--- settings.py | 1 + utils/feed_fetcher.py | 5 --- 8 files changed, 92 insertions(+), 20 deletions(-) diff --git a/apps/profile/models.py b/apps/profile/models.py index 5ecd7d1e4..05ff8972d 100644 --- a/apps/profile/models.py +++ b/apps/profile/models.py @@ -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) \ No newline at end of file +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 \ No newline at end of file diff --git a/apps/profile/views.py b/apps/profile/views.py index 42f6b086e..dbac63bb4 100644 --- a/apps/profile/views.py +++ b/apps/profile/views.py @@ -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 diff --git a/apps/reader/models.py b/apps/reader/models.py index 4c2d8b15e..bb7aa5160 100644 --- a/apps/reader/models.py +++ b/apps/reader/models.py @@ -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, } diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index 80b55ff3a..3c00204fb 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -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: diff --git a/media/css/reader.css b/media/css/reader.css index e223a45f2..f41a45215 100644 --- a/media/css/reader.css +++ b/media/css/reader.css @@ -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; +} \ No newline at end of file diff --git a/media/js/newsblur/reader_preferences.js b/media/js/newsblur/reader_preferences.js index 1cc917c1d..2869eb32a 100644 --- a/media/js/newsblur/reader_preferences.js +++ b/media/js/newsblur/reader_preferences.js @@ -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...'); } }; \ No newline at end of file diff --git a/settings.py b/settings.py index 88de87f28..87b5eb3c3 100644 --- a/settings.py +++ b/settings.py @@ -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 = diff --git a/utils/feed_fetcher.py b/utils/feed_fetcher.py index 6a6ddac18..65a659981 100644 --- a/utils/feed_fetcher.py +++ b/utils/feed_fetcher.py @@ -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: