diff --git a/contrib/internal/pyflakes.exclude b/contrib/internal/pyflakes.exclude
index 320d70de05adea37d004c9015d869ec31c3f0fee..512ec540a32bada34a4e50f423c9541e7b383cf3 100644
--- a/contrib/internal/pyflakes.exclude
+++ b/contrib/internal/pyflakes.exclude
@@ -5,7 +5,7 @@ reviewboard/accounts/views.py:*: redefinition of unused 'sha1' from line *
 reviewboard/admin/cache_stats.py:*: redefinition of unused 'memcache' from line *
 reviewboard/admin/checks.py:*: 'CouchDBStorage' imported but unused
 reviewboard/admin/checks.py:*: 'DNS' imported but unused
-reviewboard/admin/checks.py:*: 'S3Storage' imported but unused
+reviewboard/admin/checks.py:*: 'S3BotoStorage' imported but unused
 reviewboard/admin/middleware.py:*: redefinition of unused 'ModPythonRequest' from line *
 reviewboard/admin/middleware.py:*: redefinition of unused 'WSGIRequest' from line *
 reviewboard/manage.py:*: 'recaptcha' imported but unused
diff --git a/reviewboard/__init__.py b/reviewboard/__init__.py
index 7e8e6ccd29f79f3bf9a2a25880ce0d46354c9e8d..a8ea20281bf534a5784d13a1f8508cd917b072c0 100644
--- a/reviewboard/__init__.py
+++ b/reviewboard/__init__.py
@@ -57,7 +57,6 @@ def initialize():
     """
     import logging
     import os
-    import sys
 
     import settings_local
 
diff --git a/reviewboard/accounts/evolutions/timezone_length_30.py b/reviewboard/accounts/evolutions/timezone_length_30.py
index 6273244f16f86713897c4562f64afad9b1bc9d3e..0fb2b833c8b083d4216be7f86d26a441ec62dc4c 100644
--- a/reviewboard/accounts/evolutions/timezone_length_30.py
+++ b/reviewboard/accounts/evolutions/timezone_length_30.py
@@ -1,5 +1,4 @@
 from django_evolution.mutations import ChangeField
-from django.db import models
 
 
 MUTATIONS = [
diff --git a/reviewboard/accounts/urls.py b/reviewboard/accounts/urls.py
index daa52b0cdf01c3c696fb48c09c1e3f4db33a10ff..0bec736ae9998290e53de06a5c6d92b01a082747 100644
--- a/reviewboard/accounts/urls.py
+++ b/reviewboard/accounts/urls.py
@@ -1,4 +1,3 @@
-from django.conf import settings
 from django.conf.urls.defaults import patterns, url
 
 
diff --git a/reviewboard/admin/forms.py b/reviewboard/admin/forms.py
index 8c2db8184b8d1fc4b78ff3b1869b3df3099c6d6f..d4d9cfe39a14c91076ed8f9be70d4352c5792d40 100644
--- a/reviewboard/admin/forms.py
+++ b/reviewboard/admin/forms.py
@@ -33,8 +33,7 @@ import urlparse
 from django import forms
 from django.contrib.sites.models import Site
 from django.conf import settings
-from django.core.cache import parse_backend_uri, InvalidCacheBackendError, \
-                              DEFAULT_CACHE_ALIAS
+from django.core.cache import DEFAULT_CACHE_ALIAS
 from django.utils.translation import ugettext as _
 from djblets.log import restart_logging
 from djblets.siteconfig.forms import SiteSettingsForm
diff --git a/reviewboard/admin/signals.py b/reviewboard/admin/signals.py
index 61fcb688391c02c357d2e57a37d7c28ecdc69377..04edc41ad2c267cb76b602b869f9a7003e5892b2 100644
--- a/reviewboard/admin/signals.py
+++ b/reviewboard/admin/signals.py
@@ -1,9 +1,3 @@
-import datetime
-
-from django.core.cache import cache
-from django.db.models import signals
-from djblets.util.misc import make_cache_key
-
 from reviewboard.admin.widgets import increment_sync_num
 
 
diff --git a/reviewboard/admin/views.py b/reviewboard/admin/views.py
index c6deabb8eeb9d827ed04f970bd78a5fe55173570..cdbe7577c4a745e55cc6b0949ad3c3d67a8016a7 100644
--- a/reviewboard/admin/views.py
+++ b/reviewboard/admin/views.py
@@ -106,7 +106,7 @@ def manual_updates_required(request, updates,
     return render_to_response(template_name, RequestContext(request, {
         'updates': [render_to_string(template_name,
                                      RequestContext(request, extra_context))
-                    for (template_name, extra_context) in updates],
+                    for (update_template_name, extra_context) in updates],
     }))
 
 
diff --git a/reviewboard/attachments/forms.py b/reviewboard/attachments/forms.py
index 348eb81f19009533ebc0665593e403516db87a6f..7d20d3d06d4628e98b22cc3ee94a803105a09eac 100644
--- a/reviewboard/attachments/forms.py
+++ b/reviewboard/attachments/forms.py
@@ -1,4 +1,3 @@
-from datetime import datetime
 from uuid import uuid4
 import os
 import subprocess
diff --git a/reviewboard/diffviewer/forms.py b/reviewboard/diffviewer/forms.py
index 2117cebefc2216065ada08c8e3714a1c6b2dc55e..1f0bb906212f9e2819dc4b0b46becfe264d105d0 100644
--- a/reviewboard/diffviewer/forms.py
+++ b/reviewboard/diffviewer/forms.py
@@ -2,7 +2,7 @@ from django import forms
 from django.utils.encoding import smart_unicode
 from django.utils.translation import ugettext as _
 
-from reviewboard.diffviewer.models import DiffSet, FileDiff
+from reviewboard.diffviewer.models import DiffSet
 
 
 class NoBaseDirError(ValueError):
diff --git a/reviewboard/hostingsvcs/forms.py b/reviewboard/hostingsvcs/forms.py
index 17d6b80b02cc08a04da9dfd9773f0eeccc514b91..691a19fc972fa7288170936a69f6870bf1238621 100644
--- a/reviewboard/hostingsvcs/forms.py
+++ b/reviewboard/hostingsvcs/forms.py
@@ -1,6 +1,4 @@
 from django import forms
-from django.core.urlresolvers import reverse
-from django.utils.translation import ugettext_lazy as _
 
 
 class HostingServiceForm(forms.Form):
diff --git a/reviewboard/hostingsvcs/tests.py b/reviewboard/hostingsvcs/tests.py
index eb4e2052ddc46f0fe194516483dcf6822cd51cd2..de2065950c5afbd7b605c928aeb51012fadc2db0 100644
--- a/reviewboard/hostingsvcs/tests.py
+++ b/reviewboard/hostingsvcs/tests.py
@@ -5,8 +5,6 @@ try:
 except ImportError:
     from StringIO import StringIO
 
-from django.contrib.sites.models import Site
-from django.test import TestCase
 from django.utils import simplejson
 from kgb import SpyAgency
 
diff --git a/reviewboard/hostingsvcs/unfuddle.py b/reviewboard/hostingsvcs/unfuddle.py
index ce0cb263cf645f23fd75a2c517d01db2f141b749..87cf4bee88220254a9cfaa50561a3e970eda37df 100644
--- a/reviewboard/hostingsvcs/unfuddle.py
+++ b/reviewboard/hostingsvcs/unfuddle.py
@@ -95,7 +95,7 @@ class Unfuddle(HostingService):
         try:
             self._api_get_repository(unfuddle_account_domain, unfuddle_repo_name,
                                      tool_name)
-        except Exception, e:
+        except Exception:
             raise
 
     def authorize(self, username, password, unfuddle_account_domain=None,
diff --git a/reviewboard/reviews/models.py b/reviewboard/reviews/models.py
index a0e8251e04b9e2046257b5f6a4fd8ce4a8c539b8..1b628c427208a8240ac25b9e5ce6672789bdf43c 100644
--- a/reviewboard/reviews/models.py
+++ b/reviewboard/reviews/models.py
@@ -1135,14 +1135,6 @@ class ReviewRequestDraft(BaseReviewRequestDetails):
         """Returns whether or not the user can modify this draft."""
         return self.review_request.is_mutable_by(user)
 
-    def is_accessible_by(self, user):
-        """Returns whether or not the user can access this draft."""
-        return self.is_mutable_by(user)
-
-    def is_mutable_by(self, user):
-        """Returns whether or not the user can modify this draft."""
-        return self.review_request.is_mutable_by(user)
-
     @staticmethod
     def create(review_request):
         """
diff --git a/reviewboard/reviews/views.py b/reviewboard/reviews/views.py
index 2237e63a3b14edf36637b79bf3e75849e2de8e95..69e18ddefc10b2b1da734db685d6e627f1536b0a 100644
--- a/reviewboard/reviews/views.py
+++ b/reviewboard/reviews/views.py
@@ -47,17 +47,14 @@ from reviewboard.reviews.datagrids import DashboardDataGrid, \
                                           SubmitterDataGrid, \
                                           WatchedGroupDataGrid, \
                                           get_sidebar_counts
-from reviewboard.reviews.errors import OwnershipError
 from reviewboard.reviews.forms import NewReviewRequestForm
 from reviewboard.reviews.models import Comment, \
                                        FileAttachmentComment, \
                                        Group, ReviewRequest, Review, \
                                        Screenshot, ScreenshotComment
 from reviewboard.scmtools.core import PRE_CREATION
-from reviewboard.scmtools.errors import SCMError
 from reviewboard.site.decorators import check_local_site_access
 from reviewboard.site.urlresolvers import local_site_reverse
-from reviewboard.ssh.errors import SSHError
 from reviewboard.webapi.encoder import status_to_string
 
 
diff --git a/reviewboard/scmtools/hg.py b/reviewboard/scmtools/hg.py
index d04138ed13679d2295c2163a57fa668fb2a710e8..0a5db5f5bbfa104189e69d2b0680999c96b51d93 100644
--- a/reviewboard/scmtools/hg.py
+++ b/reviewboard/scmtools/hg.py
@@ -6,13 +6,10 @@ try:
 except ImportError:
     from urllib import quote as urllib_quote
 
-from pkg_resources import parse_version
-
 from reviewboard.diffviewer.parser import DiffParser, DiffParserError
 from reviewboard.scmtools.git import GitDiffParser
 from reviewboard.scmtools.core import \
     FileNotFoundError, SCMClient, SCMTool, HEAD, PRE_CREATION, UNKNOWN
-from reviewboard.scmtools.errors import RepositoryNotFoundError
 
 
 class HgTool(SCMTool):
diff --git a/reviewboard/settings.py b/reviewboard/settings.py
index 5f611af20fd574aceb563adde25022caab3fd5c1..721f6e9cd08aaf09850574ce16c3e526165f6a8b 100644
--- a/reviewboard/settings.py
+++ b/reviewboard/settings.py
@@ -5,7 +5,6 @@ import sys
 
 import djblets
 from django.core.urlresolvers import reverse
-from djblets.util.filesystem import is_exe_in_path
 
 
 # Can't import django.utils.translation yet
diff --git a/reviewboard/site/context_processors.py b/reviewboard/site/context_processors.py
index 7afe45f5e2da3669f237caee6f08d1a94a036bbb..ca5a5c0b8bbd7b3a324d613905260022bad62d31 100644
--- a/reviewboard/site/context_processors.py
+++ b/reviewboard/site/context_processors.py
@@ -18,7 +18,7 @@ class AllPermsLookupDict(PermLookupDict):
                                   self.perms_wrapper.get_local_site())
 
     def __nonzero__(self):
-        return super(AllPermLookupDict, self).__nonzero__()
+        return super(AllPermsLookupDict, self).__nonzero__()
 
 
 class AllPermsWrapper(PermWrapper):
diff --git a/reviewboard/testing/scmtool.py b/reviewboard/testing/scmtool.py
index 1dd10012c3f31bdaf437f9c00ad0560fe168bc9f..66a7818a270ecde6a22b3f85e1c6cea644904c07 100644
--- a/reviewboard/testing/scmtool.py
+++ b/reviewboard/testing/scmtool.py
@@ -1,5 +1,3 @@
-from reviewboard.scmtools.core import HEAD, SCMTool
-from reviewboard.scmtools.errors import FileNotFoundError
 from reviewboard.scmtools.git import GitTool
 
 
diff --git a/reviewboard/webapi/tests.py b/reviewboard/webapi/tests.py
index 9294d7c4f2116034e3de253ca548d1ae77a141f3..fcdff73942defe3e918d4b48408d77e14040d951 100644
--- a/reviewboard/webapi/tests.py
+++ b/reviewboard/webapi/tests.py
@@ -3018,7 +3018,7 @@ class ReviewRequestResourceTests(BaseWebAPITestCase):
         r = ReviewRequest.objects.filter(public=True, status='P',
                                          submitter__username='dopey')[0]
 
-        rsp = self.apiPut(
+        self.apiPut(
             self.get_item_url(r.display_id),
             {
                 'status': 'submitted',
@@ -3284,7 +3284,7 @@ class ReviewRequestResourceTests(BaseWebAPITestCase):
         review_request = ReviewRequest.objects.filter(local_site=local_site,
             submitter__username='doc')[0]
 
-        rsp = self.apiDelete(
+        self.apiDelete(
             self.get_item_url(review_request.display_id,
                               self.local_site_name),
             expected_status=403)
@@ -3294,15 +3294,13 @@ class ReviewRequestResourceTests(BaseWebAPITestCase):
         """Testing the DELETE review-requests/<id>/ API
         with a local site and a site admin is not allowed
         """
-        user = User.objects.get(username='doc')
-
         self._login_user(local_site=True, admin=True)
         local_site = LocalSite.objects.get(name=self.local_site_name)
 
         review_request = ReviewRequest.objects.filter(local_site=local_site,
             submitter__username='doc')[0]
 
-        rsp = self.apiDelete(
+        self.apiDelete(
             self.get_item_url(review_request.display_id,
                               self.local_site_name),
             expected_status=403)
@@ -7805,16 +7803,6 @@ class DefaultReviewerResourceTests(BaseWebAPITestCase):
             'file_regex': '.*',
         }, expected_status=403)
 
-    @add_fixtures(['test_users', 'test_site'])
-    def test_post_default_reviewer_with_permission_denied(self):
-        """Testing the POST default-reviewers/ API with a local site and Permission Denied error"""
-        self._login_user()
-
-        self.apiPost(self.get_list_url(self.local_site_name), {
-            'name': 'default1',
-            'file_regex': '.*',
-        }, expected_status=403)
-
     @add_fixtures(['test_users'])
     def test_post_default_reviewer_with_invalid_username(self):
         """Testing the POST default-reviewers/ API with invalid username"""
@@ -8000,7 +7988,7 @@ class DefaultReviewerResourceTests(BaseWebAPITestCase):
         }, expected_status=403)
 
     @add_fixtures(['test_users', 'test_site'])
-    def test_put_default_reviewer_with_permission_denied(self):
+    def test_put_default_reviewer_with_site_and_permission_denied(self):
         """Testing the PUT default-reviewers/<id>/ API with a local site and Permission Denied error"""
         self._login_user()
 
@@ -8179,8 +8167,8 @@ class DefaultReviewerResourceTests(BaseWebAPITestCase):
     @add_fixtures(['test_users', 'test_site'])
     def test_get_default_reviewers_with_site_no_access(self):
         """Testing the GET default-reviewers/ API with a local site and Permission Denied error"""
-        rsp = self.apiGet(self.get_list_url(self.local_site_name),
-                          expected_status=403)
+        self.apiGet(self.get_list_url(self.local_site_name),
+                    expected_status=403)
 
     @add_fixtures(['test_users', 'test_scmtools'])
     def test_get_default_reviewers_with_repositories(self):
