Adding a mark all as read older than modal.

This commit is contained in:
Samuel Clay 2010-06-14 01:01:21 -04:00
parent e59e1afd86
commit 30bd4610e8
7 changed files with 121 additions and 28 deletions

View file

@ -32,9 +32,12 @@ class UserSubscription(models.Model):
super(UserSubscription, self).save(force_insert, force_update, *args, **kwargs) super(UserSubscription, self).save(force_insert, force_update, *args, **kwargs)
def mark_feed_read(self): def mark_feed_read(self):
latest_story_date = self.feed.stories.order_by('-story_date')[0].story_date\
+ datetime.timedelta(minutes=1)
now = datetime.datetime.now() now = datetime.datetime.now()
if self.feed.stories.all():
latest_story_date = self.feed.stories.order_by('-story_date')[0].story_date\
+ datetime.timedelta(minutes=1)
else:
latest_story_date = now
self.last_read_date = max(now, latest_story_date) self.last_read_date = max(now, latest_story_date)
self.mark_read_date = max(now, latest_story_date) self.mark_read_date = max(now, latest_story_date)
self.unread_count_negative = 0 self.unread_count_negative = 0

View file

@ -10,12 +10,11 @@ urlpatterns = patterns('',
url(r'^load_feed_page', views.load_feed_page), url(r'^load_feed_page', views.load_feed_page),
url(r'^load_feeds', views.load_feeds, name='load-feeds'), url(r'^load_feeds', views.load_feeds, name='load-feeds'),
url(r'^refresh_feeds', views.refresh_feeds, name='refresh-feeds'), url(r'^refresh_feeds', views.refresh_feeds, name='refresh-feeds'),
url(r'^mark_all_as_read', views.mark_all_as_read, name='mark-all-as-read'),
url(r'^mark_story_as_read', views.mark_story_as_read), url(r'^mark_story_as_read', views.mark_story_as_read),
url(r'^mark_story_as_like', views.mark_story_as_like), url(r'^mark_story_as_like', views.mark_story_as_like),
url(r'^mark_story_as_dislike', views.mark_story_as_dislike), url(r'^mark_story_as_dislike', views.mark_story_as_dislike),
url(r'^mark_feed_as_read', views.mark_feed_as_read), url(r'^mark_feed_as_read', views.mark_feed_as_read),
url(r'^get_read_feed_items', views.get_read_feed_items),
url(r'^get_read_feed_items', views.get_read_feed_items),
url(r'^delete_feed', views.delete_feed, name='delete-feed'), url(r'^delete_feed', views.delete_feed, name='delete-feed'),
url(r'^add_url', views.add_url), url(r'^add_url', views.add_url),
url(r'^add_folder', views.add_folder), url(r'^add_folder', views.add_folder),

View file

@ -1,8 +1,6 @@
import logging import logging
import datetime import datetime
import threading from django.shortcuts import render_to_response, get_object_or_404
import random
from django.shortcuts import render_to_response, get_list_or_404, get_object_or_404
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.template import RequestContext from django.template import RequestContext
from django.db import IntegrityError from django.db import IntegrityError
@ -11,9 +9,8 @@ from django.views.decorators.cache import never_cache
from django.db.models import Q from django.db.models import Q
from django.db.models.aggregates import Count from django.db.models.aggregates import Count
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from django.contrib.auth import login as login_user from django.contrib.auth import login as login_user
from django.http import HttpResponse, HttpRequest, HttpResponseRedirect, HttpResponseForbidden from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
from apps.analyzer.models import ClassifierFeed, ClassifierAuthor, ClassifierTag, ClassifierTitle from apps.analyzer.models import ClassifierFeed, ClassifierAuthor, ClassifierTag, ClassifierTitle
from apps.analyzer.models import apply_classifier_titles, apply_classifier_feeds, apply_classifier_authors, apply_classifier_tags from apps.analyzer.models import apply_classifier_titles, apply_classifier_feeds, apply_classifier_authors, apply_classifier_tags
from apps.analyzer.models import get_classifiers_for_user from apps.analyzer.models import get_classifiers_for_user
@ -207,6 +204,24 @@ def load_feed_page(request):
return HttpResponse(data, mimetype='text/html') return HttpResponse(data, mimetype='text/html')
@login_required
def mark_all_as_read(request):
code = 1
days = int(request.POST['days'])
feeds = UserSubscription.objects.filter(user=request.user)
for sub in feeds:
if days == 0:
sub.mark_feed_read()
else:
sub.needs_unread_recalc = True
sub.mark_read_date = datetime.datetime.now() - datetime.timedelta(days=days)
sub.save()
data = json.encode(dict(code=code))
return HttpResponse(data)
@login_required @login_required
def mark_story_as_read(request): def mark_story_as_read(request):
story_ids = request.REQUEST['story_id'].split(',') story_ids = request.REQUEST['story_id'].split(',')
@ -225,7 +240,7 @@ def mark_story_as_read(request):
try: try:
m.save() m.save()
data.update({'code': 1}) data.update({'code': 1})
except IntegrityError, e: except IntegrityError:
data.update({'code': -1}) data.update({'code': -1})
return HttpResponse(json.encode(data)) return HttpResponse(json.encode(data))
@ -239,7 +254,7 @@ def mark_feed_as_read(request):
us = UserSubscription.objects.get(feed=feed, user=request.user) us = UserSubscription.objects.get(feed=feed, user=request.user)
try: try:
us.mark_feed_read() us.mark_feed_read()
except IntegrityError, e: except IntegrityError:
code = -1 code = -1
else: else:
code = 1 code = 1
@ -280,10 +295,6 @@ def mark_story_with_opinion(request, opinion):
data = json.encode(dict(code=2)) data = json.encode(dict(code=2))
return HttpResponse(data) return HttpResponse(data)
@login_required
def get_read_feed_items(request, username):
feeds = get_list_or_404(Feed)
def _parse_user_info(user): def _parse_user_info(user):
return { return {
'user_info': { 'user_info': {

View file

@ -1669,6 +1669,18 @@ form.opml_import_form input {
display: none; display: none;
} }
/* =================== */
/* = Mark Read Modal = */
/* =================== */
.NB-modal-markread .NB-markread-slider {
margin-top: 24px;
}
.NB-modal-markread .NB-markread-explanation {
margin-top: 24px;
}
/* =================== */ /* =================== */
/* = Classifier Tags = */ /* = Classifier Tags = */
/* =================== */ /* =================== */

View file

@ -370,6 +370,10 @@ NEWSBLUR.AssetModel.Reader.prototype = {
'value': value 'value': value
}, callback, null); }, callback, null);
} }
},
save_mark_read: function(days, callback) {
this.make_request('/reader/mark_all_as_read', {'days': days}, callback);
} }
}; };

View file

@ -2384,12 +2384,23 @@
}, FEED_REFRESH_INTERVAL); }, FEED_REFRESH_INTERVAL);
}, },
force_feed_refresh: function() { force_feed_refresh: function(callback) {
if (callback) {
this.cache.refresh_callback = callback;
} else {
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));
}, },
post_feed_refresh: function(e, updated_feeds) { post_feed_refresh: function(e, updated_feeds) {
var feeds = this.model.feeds; var feeds = this.model.feeds;
if (this.cache.refresh_callback && $.isFunction(this.cache.refresh_callback)) {
this.cache.refresh_callback();
delete this.cache.refresh_callback;
}
for (var f in updated_feeds) { for (var f in updated_feeds) {
var feed_id = updated_feeds[f]; var feed_id = updated_feeds[f];

View file

@ -1,5 +1,7 @@
NEWSBLUR.ReaderMarkRead = function(options) { NEWSBLUR.ReaderMarkRead = function(options) {
var defaults = {}; var defaults = {
'days': 1
};
this.options = $.extend({}, defaults, options); this.options = $.extend({}, defaults, options);
this.model = NEWSBLUR.AssetModel.reader(); this.model = NEWSBLUR.AssetModel.reader();
@ -11,6 +13,8 @@ NEWSBLUR.ReaderMarkRead.prototype = {
runner: function() { runner: function() {
this.make_modal(); this.make_modal();
this.load_slider();
this.generate_explanation(this.options['days']);
this.handle_cancel(); this.handle_cancel();
this.open_modal(); this.open_modal();
@ -23,11 +27,10 @@ NEWSBLUR.ReaderMarkRead.prototype = {
this.$modal = $.make('div', { className: 'NB-modal-markread NB-modal' }, [ this.$modal = $.make('div', { className: 'NB-modal-markread NB-modal' }, [
$.make('h2', { className: 'NB-modal-title' }, 'Mark old stories as read'), $.make('h2', { className: 'NB-modal-title' }, 'Mark old stories as read'),
$.make('form', { className: 'NB-markread-form' }, [ $.make('form', { className: 'NB-markread-form' }, [
$.make('div', { className: 'NB-markread-slider'}),
$.make('div', { className: 'NB-markread-explanation'}),
$.make('div', { className: 'NB-modal-submit' }, [ $.make('div', { className: 'NB-modal-submit' }, [
$.make('input', { name: 'score', value: this.score, type: 'hidden' }), $.make('input', { type: 'submit', className: '', value: 'Do it' }),
$.make('input', { name: 'feed_id', value: this.feed_id, type: 'hidden' }),
$.make('input', { name: 'story_id', value: this.story_id, type: 'hidden' }),
$.make('input', { type: 'submit', disabled: 'true', className: 'NB-disabled', value: 'Check what you like above...' }),
' or ', ' or ',
$.make('a', { href: '#', className: 'NB-modal-cancel' }, 'cancel') $.make('a', { href: '#', className: 'NB-modal-cancel' }, 'cancel')
]) ])
@ -72,12 +75,55 @@ NEWSBLUR.ReaderMarkRead.prototype = {
}); });
}, },
handle_cancel: function() { load_slider: function() {
var $cancel = $('.NB-modal-cancel', this.$modal); var self = this;
var $slider = $('.NB-markread-slider', this.$modal);
$cancel.click(function(e) { $slider.slider({
e.preventDefault(); range: 'min',
$.modal.close(); min: 0,
max: 7,
step: 1,
value: this.options['days'],
slide: function(e, ui) {
var value = ui.value;
self.update_dayofweek(value);
self.generate_explanation(value);
},
stop: function(e, ui) {
}
});
},
update_dayofweek: function(value) {
},
generate_explanation: function(value) {
var $explanation = $('.NB-markread-explanation', this.$modal);
var explanation;
if (value == 0) {
explanation = "Mark <b>every story</b> as read.";
} else if (value >= 1) {
explanation = "Mark all stories older than <b>" + value + " day" + (value==1?'':'s') + " old</b> as read.";
}
$explanation.html(explanation);
},
save_mark_read: function() {
var $save = $('.NB-modal input[type=submit]');
var $slider = $('.NB-markread-slider', this.$modal);
var days = $slider.slider('option', 'value');
$save.attr('value', 'Marking as read...').addClass('NB-disabled').attr('disabled', true);
this.model.save_mark_read(days, function() {
NEWSBLUR.reader.force_feed_refresh(function() {
$.modal.close();
});
}); });
}, },
@ -90,8 +136,15 @@ NEWSBLUR.ReaderMarkRead.prototype = {
$.targetIs(e, { tagSelector: '.NB-add-url-submit' }, function($t, $p) { $.targetIs(e, { tagSelector: '.NB-add-url-submit' }, function($t, $p) {
e.preventDefault(); e.preventDefault();
});
self.save_add_url(); },
handle_cancel: function() {
var $cancel = $('.NB-modal-cancel', this.$modal);
$cancel.click(function(e) {
e.preventDefault();
$.modal.close();
}); });
} }