mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
Adding a mark all as read older than modal.
This commit is contained in:
parent
e59e1afd86
commit
30bd4610e8
7 changed files with 121 additions and 28 deletions
|
@ -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
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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': {
|
||||||
|
|
|
@ -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 = */
|
||||||
/* =================== */
|
/* =================== */
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue