From 28b81ec74acffac4406321a8184870f7189569ba Mon Sep 17 00:00:00 2001 From: Roy Yang Date: Tue, 17 Jul 2012 14:18:26 -0700 Subject: [PATCH] fixing bug with feed exception when there is a duplicate feed id --- apps/rss_feeds/models.py | 14 ++++++++++++ apps/rss_feeds/views.py | 7 ++++-- .../newsblur/reader/reader_feed_exception.js | 22 ++++++++++++++----- urls.py | 2 +- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index 7844f5c6f..a2b6c0c11 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -701,6 +701,20 @@ class Feed(models.Model): return feed + @classmethod + def get_by_id(cls, feed_id): + feed = None + + try: + feed = Feed.objects.get(pk=feed_id) + except Feed.DoesNotExist: + # Feed has been merged after updating. Find the right feed. + duplicate_feeds = DuplicateFeed.objects.filter(duplicate_feed_id=feed_id) + if duplicate_feeds: + feed = duplicate_feeds[0].feed + + return feed + def add_update_stories(self, stories, existing_stories, verbose=False): ret_values = { ENTRY_NEW:0, diff --git a/apps/rss_feeds/views.py b/apps/rss_feeds/views.py index 6ec78ee13..bcacda812 100644 --- a/apps/rss_feeds/views.py +++ b/apps/rss_feeds/views.py @@ -3,7 +3,7 @@ import time from utils import log as logging from django.shortcuts import get_object_or_404, render_to_response from django.views.decorators.http import condition -from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse +from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404 from django.db.models import Q from django.conf import settings from django.contrib.auth.decorators import login_required @@ -174,7 +174,10 @@ def exception_retry(request): user = get_user(request) feed_id = get_argument_or_404(request, 'feed_id') reset_fetch = json.decode(request.POST['reset_fetch']) - feed = get_object_or_404(Feed, pk=feed_id) + feed = Feed.get_by_id(feed_id) + + if not feed: + raise Http404 feed.next_scheduled_update = datetime.datetime.utcnow() feed.has_page_exception = False diff --git a/media/js/newsblur/reader/reader_feed_exception.js b/media/js/newsblur/reader/reader_feed_exception.js index be680a150..527e6f5ed 100644 --- a/media/js/newsblur/reader/reader_feed_exception.js +++ b/media/js/newsblur/reader/reader_feed_exception.js @@ -268,9 +268,14 @@ _.extend(NEWSBLUR.ReaderFeedException.prototype, { NEWSBLUR.reader.force_feed_refresh(feed_id); $.modal.close(); }, function(data) { - $error.show().html((data && data.message) || "There was a problem fetching the feed from this URL."); - $loading.removeClass('NB-active'); - $submit.removeClass('NB-disabled').attr('value', 'Parse this RSS/XML Feed'); + if (data.new_feed_id) { + NEWSBLUR.reader.force_feed_refresh(feed_id, data.new_feed_id); + $.modal.close(); + } else { + $error.show().html((data && data.message) || "There was a problem fetching the feed from this URL."); + $loading.removeClass('NB-active'); + $submit.removeClass('NB-disabled').attr('value', 'Parse this RSS/XML Feed'); + } }); } }, @@ -292,9 +297,14 @@ _.extend(NEWSBLUR.ReaderFeedException.prototype, { NEWSBLUR.reader.force_feed_refresh(feed_id); $.modal.close(); }, function(data) { - $error.show().html((data && data.message) || "There was a problem fetching the feed from this URL."); - $loading.removeClass('NB-active'); - $submit.removeClass('NB-disabled').attr('value', 'Fetch Feed from Website'); + if (data.new_feed_id) { + NEWSBLUR.reader.force_feed_refresh(feed_id, data.new_feed_id); + $.modal.close(); + } else { + $error.show().html((data && data.message) || "There was a problem fetching the feed from this URL."); + $loading.removeClass('NB-active'); + $submit.removeClass('NB-disabled').attr('value', 'Fetch Feed from Website'); + } }); } }, diff --git a/urls.py b/urls.py index c930db2c9..be9942230 100644 --- a/urls.py +++ b/urls.py @@ -35,7 +35,7 @@ urlpatterns = patterns('', url(r'zebra/', include('zebra.urls', namespace="zebra", app_name='zebra')), ) -if settings.DEVELOPMENT: +if settings.DEBUG: urlpatterns += patterns('', (r'^media/(?P.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),