From 53d759520fe9a931701df357c29af5aa91342c89 Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Thu, 3 Feb 2011 18:38:10 -0500 Subject: [PATCH] Fixing miscellaneous issues that have been throwing exceptions. Feed importing, google reader, loading feeds/pages, approving feeds. ALl with bad requests now let the user down easily as opposed to 500ing. --- apps/feed_import/views.py | 53 +++++++++++++++++++++------------------ apps/reader/views.py | 26 ++++++++++++++----- apps/rss_feeds/models.py | 4 +-- 3 files changed, 51 insertions(+), 32 deletions(-) diff --git a/apps/feed_import/views.py b/apps/feed_import/views.py index 84ec6f405..a06c7e97c 100644 --- a/apps/feed_import/views.py +++ b/apps/feed_import/views.py @@ -85,6 +85,7 @@ def reader_authorize(request): def reader_callback(request): access_token_url = 'https://www.google.com/accounts/OAuthGetAccessToken' consumer = oauth.Consumer(settings.OAUTH_KEY, settings.OAUTH_SECRET) + user_token = None if request.user.is_authenticated(): user_token = OAuthToken.objects.get(user=request.user) @@ -98,31 +99,35 @@ def reader_callback(request): user_token = user_tokens[0] user_token.session_id = request.session.session_key user_token.save() - - # logging.info("Google Reader request.GET: %s" % request.GET) - # Authenticated in Google, so verify and fetch access tokens - token = oauth.Token(user_token.request_token, user_token.request_token_secret) - token.set_verifier(request.GET['oauth_verifier']) - client = oauth.Client(consumer, token) - resp, content = client.request(access_token_url, "POST") - access_token = dict(urlparse.parse_qsl(content)) - # logging.info(" ---> [%s] OAuth Reader Content: %s -- %s" % (request.user, token, access_token)) - user_token.access_token = access_token.get('oauth_token') - user_token.access_token_secret = access_token.get('oauth_token_secret') - try: - user_token.save() - except IntegrityError: + + if user_token and request.GET.get('oauth_verifier'): + # logging.info("Google Reader request.GET: %s" % request.GET) + # Authenticated in Google, so verify and fetch access tokens + token = oauth.Token(user_token.request_token, user_token.request_token_secret) + token.set_verifier(request.GET['oauth_verifier']) + client = oauth.Client(consumer, token) + resp, content = client.request(access_token_url, "POST") + access_token = dict(urlparse.parse_qsl(content)) + # logging.info(" ---> [%s] OAuth Reader Content: %s -- %s" % (request.user, token, access_token)) + user_token.access_token = access_token.get('oauth_token') + user_token.access_token_secret = access_token.get('oauth_token_secret') + try: + user_token.save() + except IntegrityError: + logging.info(" ***> [%s] Bad token from Google Reader. Re-authenticating." % (request.user,)) + return HttpResponseRedirect(reverse('google-reader-authorize')) + + # Fetch imported feeds on next page load + request.session['import_from_google_reader'] = True + + logging.info(" ---> [%s] ~BB~FW~SBFinishing Google Reader import - %s" % (request.user, request.META['REMOTE_ADDR'],)) + + if request.user.is_authenticated(): + return HttpResponseRedirect(reverse('index')) + else: logging.info(" ***> [%s] Bad token from Google Reader. Re-authenticating." % (request.user,)) - return HttpResponseRedirect(reverse('google-reader-authorize')) - - # Fetch imported feeds on next page load - request.session['import_from_google_reader'] = True - - logging.info(" ---> [%s] ~BB~FW~SBFinishing Google Reader import - %s" % (request.user, request.META['REMOTE_ADDR'],)) - - if request.user.is_authenticated(): - return HttpResponseRedirect(reverse('index')) - + return HttpResponseRedirect(reverse('google-reader-authorize')) + return HttpResponseRedirect(reverse('import-signup')) @json.json_view diff --git a/apps/reader/views.py b/apps/reader/views.py index e57e85678..c4266f7d8 100644 --- a/apps/reader/views.py +++ b/apps/reader/views.py @@ -1,6 +1,7 @@ import datetime import time import random +import re from django.shortcuts import render_to_response, get_object_or_404 from django.contrib.auth.decorators import login_required from django.template import RequestContext @@ -274,9 +275,14 @@ def load_single_feed(request): page = int(request.REQUEST.get('page', 0)) if page: offset = limit * page - feed_id = int(request.REQUEST.get('feed_id', 0)) + feed_id = None + try: + feed_id = int(request.GET.get('feed_id', 0)) + except ValueError: + feed_id_matches = re.search(r'(\d+)', request.GET['feed_id']) + if feed_id_matches: feed_id = int(feed_id_matches.group(1)) dupe_feed_id = None - if feed_id == 0: + if not feed_id: raise Http404 try: @@ -368,8 +374,13 @@ def load_single_feed(request): return data def load_feed_page(request): - feed_id = int(request.GET.get('feed_id', 0)) - if feed_id == 0: + feed_id = None + try: + feed_id = int(request.GET.get('feed_id', 0)) + except ValueError: + feed_id_matches = re.search(r'(\d+)', request.GET['feed_id']) + if feed_id_matches: feed_id = int(feed_id_matches.group(1)) + if not feed_id: raise Http404 data = MFeedPage.get_data(feed_id=feed_id) @@ -442,7 +453,10 @@ def load_river_stories(request): feed_counts = {} feed_last_reads = {} for feed_id in feed_ids: - usersub = UserSubscription.objects.get(feed__pk=feed_id, user=user) + try: + usersub = UserSubscription.objects.get(feed__pk=feed_id, user=user) + except UserSubscription.DoesNotExist: + continue feed_counts[feed_id] = (usersub.unread_count_negative * 1+ usersub.unread_count_neutral * 10+ usersub.unread_count_positive * 20) @@ -826,7 +840,7 @@ def get_feeds_trainer(request): @ajax_login_required @json.json_view def save_feed_chooser(request): - approved_feeds = [int(feed_id) for feed_id in request.POST.getlist('approved_feeds')][:64] + approved_feeds = [int(feed_id) for feed_id in request.POST.getlist('approved_feeds') if feed_id][:64] activated = 0 usersubs = UserSubscription.objects.filter(user=request.user) diff --git a/apps/rss_feeds/models.py b/apps/rss_feeds/models.py index 2653f83c7..318f00c54 100644 --- a/apps/rss_feeds/models.py +++ b/apps/rss_feeds/models.py @@ -747,7 +747,7 @@ class FeedIcon(models.Model): super(FeedIcon, self).save(*args, **kwargs) except (IntegrityError, OperationError), e: print "Error on Icon: %s" % e - if self.id: self.delete() + if getattr(self, 'id'): self.delete() class MFeedPage(mongo.Document): @@ -799,7 +799,7 @@ class MStory(mongo.Document): meta = { 'collection': 'stories', - 'indexes': ['story_date', ('story_feed_id', '-story_date')], + 'indexes': [('story_feed_id', '-story_date')], 'ordering': ['-story_date'], 'allow_inheritance': False, }