Limiting river of news feeds to page size, as not to overwhelm the db.

This commit is contained in:
Samuel Clay 2011-01-11 10:11:25 -05:00
parent b79d223caf
commit bc3b482fcb

View file

@ -15,6 +15,7 @@ from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidde
from django.conf import settings
from django.core.mail import mail_admins
from collections import defaultdict
from operator import itemgetter
from mongoengine.queryset import OperationError
from apps.analyzer.models import MClassifierTitle, MClassifierAuthor, MClassifierFeed, MClassifierTag
from apps.analyzer.models import apply_classifier_titles, apply_classifier_feeds, apply_classifier_authors, apply_classifier_tags
@ -403,6 +404,7 @@ def load_river_stories(request):
now = datetime.datetime.now()
user = get_user(request)
feed_ids = [int(feed_id) for feed_id in request.POST.getlist('feeds') if feed_id]
original_feed_ids = list(feed_ids)
offset = int(request.REQUEST.get('offset', 0))
limit = int(request.REQUEST.get('limit', 25))
page = int(request.REQUEST.get('page', 0))+1
@ -424,10 +426,18 @@ def load_river_stories(request):
read_stories = [rs.story.id for rs in read_stories]
# Determine mark_as_read dates for all feeds to ignore all stories before this date.
def feed_qvalues(feed_id):
feed_counts = {}
feed_last_reads = {}
for feed_id in feed_ids:
feed = UserSubscription.objects.get(feed__pk=feed_id, user=user)
return (str(feed_id), int(time.mktime(feed.mark_read_date.timetuple())))
feed_last_reads = dict(map(feed_qvalues, feed_ids))
feed_counts[feed_id] = (feed.unread_count_negative +
feed.unread_count_neutral +
feed.unread_count_positive)
feed_last_reads[feed_id] = int(time.mktime(feed.mark_read_date.timetuple()))
feed_counts = sorted(feed_counts.items(), key=itemgetter(1))
feed_counts = feed_counts[:25] if len(feed_counts) > 25 else feed_counts
feed_ids = [f[0] for f in feed_counts]
feed_last_reads = dict([(str(feed_id), feed_last_reads[feed_id]) for feed_id in feed_ids])
# After excluding read stories, all that's left are stories
# past the mark_read_date. Everything returned is guaranteed to be unread.
@ -493,8 +503,8 @@ def load_river_stories(request):
diff = datetime.datetime.now() - now
timediff = float("%s.%.2s" % (diff.seconds, (diff.microseconds / 1000)))
logging.info(" ---> [%s] ~FCLoading river stories: page %s - ~SB%s stories ~SN(%s feeds) ~FB(%s seconds)" % (
request.user, page, len(stories), len(feed_ids), timediff))
logging.info(" ---> [%s] ~FCLoading river stories: page %s - ~SB%s stories ~SN(%s/%s feeds) ~FB(%s seconds)" % (
request.user, page, len(stories), len(feed_ids), len(original_feed_ids), timediff))
return dict(stories=stories)