diff --git a/reviewboard/accounts/backends/__init__.py b/reviewboard/accounts/backends/__init__.py
index 8598d1e2d7ebf1b87f2c0aef5fd5c4c99c2bce7f..21a0ebcbd8bff3fc5217e0c2432a184c15622a2b 100644
--- a/reviewboard/accounts/backends/__init__.py
+++ b/reviewboard/accounts/backends/__init__.py
@@ -22,8 +22,6 @@ Version Changed:
     The contents of this module were split into sub-modules.
 """
 
-from warnings import warn
-
 from reviewboard.accounts.backends.ad import ActiveDirectoryBackend
 from reviewboard.accounts.backends.base import BaseAuthBackend
 from reviewboard.accounts.backends.http_digest import HTTPDigestBackend
diff --git a/reviewboard/accounts/backends/base.py b/reviewboard/accounts/backends/base.py
index 23ad1fea48f36dee7340929972e78d640823c578..500fa16fee0ac842268f3f38d1e8fbab048d029f 100644
--- a/reviewboard/accounts/backends/base.py
+++ b/reviewboard/accounts/backends/base.py
@@ -1,7 +1,6 @@
 """Base class for authentication backends."""
 
 import re
-import warnings
 
 from django.contrib.auth.models import User
 from djblets.db.query import get_object_or_none
diff --git a/reviewboard/accounts/backends/registry.py b/reviewboard/accounts/backends/registry.py
index 50b00790e54ceb8026afdac27bb2e8dabc9736b5..0304fc935fc96b9c94e81f239ca342e92d876128 100644
--- a/reviewboard/accounts/backends/registry.py
+++ b/reviewboard/accounts/backends/registry.py
@@ -1,7 +1,6 @@
 """Authentication backend registry."""
 
 import logging
-from warnings import warn
 
 from django.conf import settings
 from django.contrib.auth import get_backends
@@ -9,7 +8,6 @@ from django.utils.translation import gettext_lazy as _
 from djblets.registries.registry import (ALREADY_REGISTERED, LOAD_ENTRY_POINT,
                                          NOT_REGISTERED, UNREGISTER)
 
-from reviewboard.accounts.backends.base import BaseAuthBackend
 from reviewboard.accounts.backends.standard import StandardAuthBackend
 from reviewboard.registries.registry import EntryPointRegistry
 
diff --git a/reviewboard/accounts/context_processors.py b/reviewboard/accounts/context_processors.py
index a52642c52bb6fd368f781aa494dcaaa31cbd4583..9559fa6d4f799242c34ff2c0445276fd9f8bc750 100644
--- a/reviewboard/accounts/context_processors.py
+++ b/reviewboard/accounts/context_processors.py
@@ -1,5 +1,4 @@
 from reviewboard.accounts.backends import get_enabled_auth_backends
-from reviewboard.accounts.models import Profile
 
 
 def auth_backends(request):
diff --git a/reviewboard/accounts/decorators.py b/reviewboard/accounts/decorators.py
index 87289364172940b69c6770dc35f5db42fb3171bf..c9ba4e85bab1e36e8f535c407f8148b290778346 100644
--- a/reviewboard/accounts/decorators.py
+++ b/reviewboard/accounts/decorators.py
@@ -6,7 +6,6 @@ from django.http import HttpResponseRedirect
 from djblets.siteconfig.models import SiteConfiguration
 from djblets.util.decorators import simple_decorator
 
-from reviewboard.accounts.models import Profile
 from reviewboard.accounts.privacy import is_consent_missing
 from reviewboard.site.urlresolvers import local_site_reverse
 
diff --git a/reviewboard/accounts/middleware.py b/reviewboard/accounts/middleware.py
index 4d3ce4aa32d8687cae08db7060fd6ba3ab06c422..27323d050e5e56ae35587528c6fffd325295bc7b 100644
--- a/reviewboard/accounts/middleware.py
+++ b/reviewboard/accounts/middleware.py
@@ -7,7 +7,6 @@ from django.utils import timezone
 from djblets.siteconfig.models import SiteConfiguration
 
 from reviewboard.accounts.backends import X509Backend
-from reviewboard.accounts.models import Profile
 
 
 def timezone_middleware(get_response):
diff --git a/reviewboard/accounts/pages.py b/reviewboard/accounts/pages.py
index b09d6ee6bfcfd4d893e8295e359bb884a3476f3c..ad23ffac5e105e999829b10aad91c5b76e116d26 100644
--- a/reviewboard/accounts/pages.py
+++ b/reviewboard/accounts/pages.py
@@ -1,5 +1,4 @@
 import logging
-from warnings import warn
 
 from django.urls import reverse
 from django.utils.translation import gettext_lazy as _
diff --git a/reviewboard/accounts/tests/test_change_password_form.py b/reviewboard/accounts/tests/test_change_password_form.py
index 4735a50621b1d5f7a09ded3eae84ad359cc93365..d9acf1dc18ed6718e67429b512cedb357f9efb83 100644
--- a/reviewboard/accounts/tests/test_change_password_form.py
+++ b/reviewboard/accounts/tests/test_change_password_form.py
@@ -9,7 +9,6 @@ from kgb import SpyAgency
 from reviewboard.accounts.backends import (AuthBackend,
                                            get_enabled_auth_backends)
 from reviewboard.accounts.forms.pages import ChangePasswordForm
-from reviewboard.accounts.models import Profile
 from reviewboard.testing import TestCase
 
 
diff --git a/reviewboard/accounts/tests/test_check_login_required_view_mixin.py b/reviewboard/accounts/tests/test_check_login_required_view_mixin.py
index 979bfb9b9919090013ec36694c3e9face5a33d7f..7639ca3b90a488a447be439868788732ae837bb8 100644
--- a/reviewboard/accounts/tests/test_check_login_required_view_mixin.py
+++ b/reviewboard/accounts/tests/test_check_login_required_view_mixin.py
@@ -4,7 +4,6 @@ from django.contrib.auth.models import AnonymousUser, User
 from django.http import HttpResponse, HttpResponseRedirect
 from django.test.client import RequestFactory
 from django.views.generic.base import View
-from djblets.siteconfig.models import SiteConfiguration
 
 from reviewboard.accounts.mixins import CheckLoginRequiredViewMixin
 from reviewboard.testing import TestCase
diff --git a/reviewboard/accounts/tests/test_profile_form.py b/reviewboard/accounts/tests/test_profile_form.py
index bb16f5e6fe7adaf3d4b62d0dc8746095bd7fd63c..44fb7d20634144b6a0a8ed6a532cf62c721904e6 100644
--- a/reviewboard/accounts/tests/test_profile_form.py
+++ b/reviewboard/accounts/tests/test_profile_form.py
@@ -8,7 +8,6 @@ from kgb import SpyAgency
 from reviewboard.accounts.backends import (AuthBackend,
                                            get_enabled_auth_backends)
 from reviewboard.accounts.forms.pages import ProfileForm
-from reviewboard.accounts.models import Profile
 from reviewboard.testing import TestCase
 
 
diff --git a/reviewboard/accounts/tests/test_trophy.py b/reviewboard/accounts/tests/test_trophy.py
index 29493407186967dab7360989d9a246eef111db1f..b2d62fd6d2f7f1c1500ea288e0f460bced0b2b0d 100644
--- a/reviewboard/accounts/tests/test_trophy.py
+++ b/reviewboard/accounts/tests/test_trophy.py
@@ -1,11 +1,8 @@
 """Unit tests for reviewboard.accounts.models.Trophy."""
 
 from django.contrib.auth.models import User
-from django.test.client import RequestFactory
 
 from reviewboard.accounts.models import Trophy
-from reviewboard.accounts.trophies import TrophyType
-from reviewboard.deprecation import RemovedInReviewBoard40Warning
 from reviewboard.testing import TestCase
 
 
diff --git a/reviewboard/accounts/trophies.py b/reviewboard/accounts/trophies.py
index fbba442308b89f06466e78d9a5daecb45fbee08e..c206c919c6cfb0d4322146d400d1ca2fdeffdb81 100644
--- a/reviewboard/accounts/trophies.py
+++ b/reviewboard/accounts/trophies.py
@@ -1,12 +1,9 @@
 import re
-import warnings
 
 from django.utils.translation import gettext_lazy as _
 from djblets.registries.registry import (ALREADY_REGISTERED,
-                                         AlreadyRegisteredError,
                                          ATTRIBUTE_REGISTERED,
                                          DEFAULT_ERRORS,
-                                         ItemLookupError,
                                          NOT_REGISTERED,
                                          Registry,
                                          UNREGISTER)
diff --git a/reviewboard/admin/forms/general_settings.py b/reviewboard/admin/forms/general_settings.py
index 5d984e8b7dd6a380fe6b4bb5648cb99bbc06a6e7..3ce0dc3629b4ef69907eee7bca08b81591f313fa 100644
--- a/reviewboard/admin/forms/general_settings.py
+++ b/reviewboard/admin/forms/general_settings.py
@@ -6,7 +6,6 @@ from urllib.parse import urlparse
 from django import forms
 from django.conf import settings
 from django.contrib.sites.models import Site
-from django.core.exceptions import ValidationError
 from django.utils.module_loading import import_string
 from django.utils.translation import gettext, gettext_lazy as _
 from djblets.cache.backend_compat import normalize_cache_backend
diff --git a/reviewboard/admin/middleware.py b/reviewboard/admin/middleware.py
index 379429ccb0c134a20751cfbd9a70370244ca047e..8eaa53c1c5c6ac7fb5be9ba9c181902b02aee591 100644
--- a/reviewboard/admin/middleware.py
+++ b/reviewboard/admin/middleware.py
@@ -4,8 +4,6 @@ from django.conf import settings
 from djblets.siteconfig.models import SiteConfiguration
 
 from reviewboard import initialize
-from reviewboard.accounts.backends.registry import get_enabled_auth_backends
-from reviewboard.accounts.backends.x509 import X509Backend
 from reviewboard.admin.checks import check_updates_required
 from reviewboard.admin.siteconfig import load_site_config
 from reviewboard.admin.views import manual_updates_required
diff --git a/reviewboard/admin/siteconfig.py b/reviewboard/admin/siteconfig.py
index cc7babfa5ec9a7fe675463e6631c583edf53c912..00fad70bd7079fcd8e1038eaaac7ed9a3ef6f047 100644
--- a/reviewboard/admin/siteconfig.py
+++ b/reviewboard/admin/siteconfig.py
@@ -35,7 +35,6 @@ import re
 
 from django.conf import settings, global_settings
 from django.core.exceptions import ImproperlyConfigured
-from django.utils.translation import gettext as _
 from djblets.log import restart_logging, siteconfig as log_siteconfig
 from djblets.recaptcha import siteconfig as recaptcha_siteconfig
 from djblets.siteconfig.django_settings import (apply_django_settings,
diff --git a/reviewboard/avatars/tests.py b/reviewboard/avatars/tests.py
index 3eba3be59bd18f878c866b30d61045e6869da013..34b9e8b3b2dd1a36082704b54fe48a2980cde124 100644
--- a/reviewboard/avatars/tests.py
+++ b/reviewboard/avatars/tests.py
@@ -3,7 +3,6 @@ from django.core.files.storage import get_storage_class
 from django.core.files.uploadedfile import SimpleUploadedFile
 from django.template import RequestContext, Template
 from django.test.client import RequestFactory
-from django.utils.html import escape
 from djblets.avatars.services import (GravatarService,
                                       URLAvatarService)
 from djblets.avatars.tests import DummyAvatarService, DummyHighDPIAvatarService
diff --git a/reviewboard/cmdline/rbsite.py b/reviewboard/cmdline/rbsite.py
index 9927711e72c6675e030155cc6507a0d6b4ff3ebd..b75ed39e9111f0429b2023ced95adf9403f5c039 100755
--- a/reviewboard/cmdline/rbsite.py
+++ b/reviewboard/cmdline/rbsite.py
@@ -22,7 +22,6 @@ from django.db.utils import OperationalError
 from django.dispatch import receiver
 from django.utils.encoding import force_str
 
-import reviewboard
 from reviewboard import finalize_setup, get_manual_url, get_version_string
 from reviewboard.admin.import_utils import has_module
 from reviewboard.cmdline.utils.console import get_console, init_console
diff --git a/reviewboard/cmdline/rbssh.py b/reviewboard/cmdline/rbssh.py
index f6855831257cfc4ec6259621073cb18a99ecb4e4..caaac19bb0d143317b9fb6202cee83ddbe35d256 100755
--- a/reviewboard/cmdline/rbssh.py
+++ b/reviewboard/cmdline/rbssh.py
@@ -321,10 +321,6 @@ def main():
         debug('%s', sys.argv)
         debug('PID %s', pid)
 
-    # Ensure we've patched Djblets for Python 3.10 + Django 1.11 compatibility.
-    # This can be removed once we've moved onto a modern version of Django.
-    import djblets
-
     # Perform the bare minimum to initialize the Django/Review Board
     # environment. We're not calling Review Board's initialize() because
     # we want to completely minimize what we import and set up.
diff --git a/reviewboard/datagrids/columns.py b/reviewboard/datagrids/columns.py
index 7a0f7dbfe1d27921808340d667fca104f96da646..f171574a0ecb409ee6649f32d58be0d2fd454195 100644
--- a/reviewboard/datagrids/columns.py
+++ b/reviewboard/datagrids/columns.py
@@ -9,7 +9,7 @@ from django.utils.translation import gettext_lazy as _, gettext
 from djblets.datagrid.grids import CheckboxColumn, Column, DateTimeColumn
 from djblets.siteconfig.models import SiteConfiguration
 
-from reviewboard.accounts.models import Profile, ReviewRequestVisit
+from reviewboard.accounts.models import ReviewRequestVisit
 from reviewboard.avatars import avatar_services
 from reviewboard.reviews.models import ReviewRequest
 from reviewboard.reviews.templatetags.reviewtags import render_star
diff --git a/reviewboard/datagrids/grids.py b/reviewboard/datagrids/grids.py
index bf0047ebadc20f15c1f6b413819b448566842603..40e47aa8c0ff3d01ee7dbcb0e4ba6b418bde2438 100644
--- a/reviewboard/datagrids/grids.py
+++ b/reviewboard/datagrids/grids.py
@@ -10,8 +10,7 @@ from djblets.datagrid.grids import (
     AlphanumericDataGrid as DjbletsAlphanumericDataGrid)
 from djblets.util.templatetags.djblets_utils import ageid
 
-from reviewboard.accounts.models import (LocalSiteProfile, Profile,
-                                         ReviewRequestVisit)
+from reviewboard.accounts.models import ReviewRequestVisit
 from reviewboard.datagrids.columns import (BugsColumn,
                                            DateTimeSinceColumn,
                                            DiffSizeColumn,
diff --git a/reviewboard/diffviewer/chunk_generator.py b/reviewboard/diffviewer/chunk_generator.py
index 280003ac1380de2ea5c687a2366c25890508201b..2a4cacd75113bdb060e3c421d449b91e153d1ad1 100644
--- a/reviewboard/diffviewer/chunk_generator.py
+++ b/reviewboard/diffviewer/chunk_generator.py
@@ -1,5 +1,4 @@
 import fnmatch
-import functools
 import hashlib
 import re
 from itertools import zip_longest
@@ -7,7 +6,6 @@ from itertools import zip_longest
 import pygments.util
 from django.utils.encoding import force_str
 from django.utils.html import escape
-from django.utils.safestring import mark_safe
 from django.utils.translation import get_language, gettext as _
 from djblets.log import log_timed
 from djblets.cache.backend import cache_memoize
diff --git a/reviewboard/diffviewer/managers.py b/reviewboard/diffviewer/managers.py
index fc2efe5a22b08b7d31438dc6cdec721aeabac5be..fc18d1869a7fb74670821dd3ae5121b833205f1e 100644
--- a/reviewboard/diffviewer/managers.py
+++ b/reviewboard/diffviewer/managers.py
@@ -10,7 +10,6 @@ from django.conf import settings
 from django.db import models, reset_queries, connection, connections
 from django.db.models import Count, Q
 from django.db.utils import IntegrityError
-from django.utils.encoding import force_text
 from django.utils.translation import gettext as _
 
 from reviewboard.diffviewer.commit_utils import get_file_exists_in_history
diff --git a/reviewboard/hostingsvcs/testing/testcases.py b/reviewboard/hostingsvcs/testing/testcases.py
index 2e97a717778296e0dee5dac3a6320aff5cde2fa1..a53e2f3913d2aa0b6de24fee38b214a538e9c707 100644
--- a/reviewboard/hostingsvcs/testing/testcases.py
+++ b/reviewboard/hostingsvcs/testing/testcases.py
@@ -9,8 +9,7 @@ from urllib.parse import urlparse
 from kgb import SpyAgency
 
 from reviewboard.hostingsvcs.models import HostingServiceAccount
-from reviewboard.hostingsvcs.service import (HostingServiceClient,
-                                             HostingServiceHTTPResponse,
+from reviewboard.hostingsvcs.service import (HostingServiceHTTPResponse,
                                              get_hosting_service)
 from reviewboard.testing import TestCase
 
diff --git a/reviewboard/hostingsvcs/tests/test_api_paginator.py b/reviewboard/hostingsvcs/tests/test_api_paginator.py
index eef9840f659ea8c2a0df2a01ac4f27f2a30fc0b7..8824ea07ea8ffc44d2498ffd282f5fb876c88f46 100644
--- a/reviewboard/hostingsvcs/tests/test_api_paginator.py
+++ b/reviewboard/hostingsvcs/tests/test_api_paginator.py
@@ -1,5 +1,3 @@
-from urllib.parse import parse_qs, urlsplit
-
 from kgb import SpyAgency
 
 from reviewboard.hostingsvcs.utils.paginator import (APIPaginator,
diff --git a/reviewboard/hostingsvcs/unfuddle.py b/reviewboard/hostingsvcs/unfuddle.py
index d57372bc427c6ca94b5e2b347a0490aa83b37ec0..b8119c90525c93ec77b2cd98dda43e40654bd263 100644
--- a/reviewboard/hostingsvcs/unfuddle.py
+++ b/reviewboard/hostingsvcs/unfuddle.py
@@ -1,4 +1,3 @@
-import json
 from urllib.error import HTTPError, URLError
 from urllib.parse import quote
 
diff --git a/reviewboard/hostingsvcs/utils/paginator.py b/reviewboard/hostingsvcs/utils/paginator.py
index 0663f1a0dec6e70936f2782d1f99ccd063687b48..369907691be55e863a5fc3a533f36ff4b1cb55fb 100644
--- a/reviewboard/hostingsvcs/utils/paginator.py
+++ b/reviewboard/hostingsvcs/utils/paginator.py
@@ -1,7 +1,5 @@
 """Paginators for iterating over API results."""
 
-from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
-
 
 class InvalidPageError(Exception):
     """An error representing an invalid page access."""
diff --git a/reviewboard/integrations/forms.py b/reviewboard/integrations/forms.py
index 9720faa5239b2ce2cf54017ae04989255d8a40d8..d89d3212a81a19e73291f0712a028579d2ac29f9 100644
--- a/reviewboard/integrations/forms.py
+++ b/reviewboard/integrations/forms.py
@@ -2,7 +2,6 @@
 
 from django import forms
 from django.utils.translation import gettext_lazy as _
-from djblets.forms.fields import ConditionsField
 from djblets.integrations.forms import (IntegrationConfigForm as
                                         DjbletsIntegrationConfigForm)
 
diff --git a/reviewboard/notifications/email/hooks.py b/reviewboard/notifications/email/hooks.py
index 8a8b8fe87cc10400757abff69336b7dab0ff67cd..2b8c43d48273c75d625a520daff8a5c33ccf7d81 100644
--- a/reviewboard/notifications/email/hooks.py
+++ b/reviewboard/notifications/email/hooks.py
@@ -1,6 +1,5 @@
 """Extension hooks for augmenting e-mail messages."""
 
-import warnings
 from collections import defaultdict
 
 from reviewboard.reviews.signals import (review_request_published,
diff --git a/reviewboard/reviews/markdown_utils.py b/reviewboard/reviews/markdown_utils.py
index 86947d8c6e043d5626f08b8dfbfd27471885fc66..824a20eef978d15b36a3fc5c6c4fc874d7263f11 100644
--- a/reviewboard/reviews/markdown_utils.py
+++ b/reviewboard/reviews/markdown_utils.py
@@ -1,5 +1,3 @@
-import warnings
-
 import pymdownx.emoji
 from bleach.sanitizer import Cleaner
 from django.conf import settings
diff --git a/reviewboard/reviews/models/review.py b/reviewboard/reviews/models/review.py
index e76cb50552888a8c1b84c2c46b9aba27561f400f..67aeb13d6fb39a188aa391701692ac6d5e5ea30c 100644
--- a/reviewboard/reviews/models/review.py
+++ b/reviewboard/reviews/models/review.py
@@ -1,5 +1,4 @@
 import logging
-import warnings
 
 from django.contrib.auth.models import User
 from django.db import models
diff --git a/reviewboard/reviews/models/review_request.py b/reviewboard/reviews/models/review_request.py
index 960b4879850f3a77f8c242e3c02ea5ed252699d6..6a63d42929a47ce8eaae51ca3ff505148a279b68 100644
--- a/reviewboard/reviews/models/review_request.py
+++ b/reviewboard/reviews/models/review_request.py
@@ -5,14 +5,13 @@ from django.contrib.auth.models import User
 from django.core.cache import cache
 from django.core.exceptions import ObjectDoesNotExist
 from django.db import models
-from django.db.models import Count, Q
+from django.db.models import Q
 from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 from djblets.cache.backend import cache_memoize, make_cache_key
 from djblets.db.fields import (CounterField, ModificationTimestampField,
                                RelationCounterField)
 from djblets.db.query import get_object_or_none
-from djblets.deprecation import deprecated_arg_value
 
 from reviewboard.admin.read_only import is_site_read_only_for
 from reviewboard.attachments.models import (FileAttachment,
diff --git a/reviewboard/reviews/models/review_request_draft.py b/reviewboard/reviews/models/review_request_draft.py
index bed0da57a9f0c333bd86394fd0905805be7f0dc0..dae7c5f1455f15e91989e2f19280ac8b68ae9009 100644
--- a/reviewboard/reviews/models/review_request_draft.py
+++ b/reviewboard/reviews/models/review_request_draft.py
@@ -1,5 +1,3 @@
-import copy
-
 from django.contrib.auth.models import User
 from django.db import models
 from django.db.models import F
diff --git a/reviewboard/reviews/search_indexes.py b/reviewboard/reviews/search_indexes.py
index ec8d381283d70068f188611e3949812ae1ee9b2a..69983117fb01d6513cff2d6b2560b07de1c0b217 100644
--- a/reviewboard/reviews/search_indexes.py
+++ b/reviewboard/reviews/search_indexes.py
@@ -1,5 +1,4 @@
 from django.contrib.auth.models import AnonymousUser
-from django.db.models import Q
 from haystack import indexes
 
 from reviewboard.reviews.models import ReviewRequest
diff --git a/reviewboard/reviews/tests/test_counters.py b/reviewboard/reviews/tests/test_counters.py
index f39a5fd9465ab37eb332db1d00e52d9d105cc54e..faa75eec5020a2b65220936acfd6b9241d2732db 100644
--- a/reviewboard/reviews/tests/test_counters.py
+++ b/reviewboard/reviews/tests/test_counters.py
@@ -1,7 +1,7 @@
 from django.contrib.auth.models import User
 from kgb import SpyAgency
 
-from reviewboard.accounts.models import Profile, LocalSiteProfile
+from reviewboard.accounts.models import LocalSiteProfile
 from reviewboard.reviews.errors import NotModifiedError
 from reviewboard.reviews.models import (Group, ReviewRequest,
                                         ReviewRequestDraft)
diff --git a/reviewboard/reviews/tests/test_entries.py b/reviewboard/reviews/tests/test_entries.py
index c43cf0b940e9a1f310975984a4b333ab4ece6732..a721c0fcddf50e90a178f27620010ff3d0f7ce6a 100644
--- a/reviewboard/reviews/tests/test_entries.py
+++ b/reviewboard/reviews/tests/test_entries.py
@@ -1,6 +1,5 @@
 """Unit tests for review request page entries."""
 
-import logging
 from datetime import datetime, timedelta
 
 from django.contrib.auth.models import AnonymousUser, User
diff --git a/reviewboard/reviews/tests/test_forms.py b/reviewboard/reviews/tests/test_forms.py
index b4e97fbe26b0ec7a4069a1c6a7ee3e627cba7ee2..eda53d71450bd3328b4488762bcd7822eb2d15bc 100644
--- a/reviewboard/reviews/tests/test_forms.py
+++ b/reviewboard/reviews/tests/test_forms.py
@@ -3,8 +3,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile
 
 from reviewboard.reviews.forms import (DefaultReviewerForm, GroupForm,
                                        UploadDiffForm)
-from reviewboard.reviews.models import DefaultReviewer, Group
-from reviewboard.scmtools.models import Repository, Tool
+from reviewboard.reviews.models import DefaultReviewer
 from reviewboard.site.models import LocalSite
 from reviewboard.testing import TestCase
 
diff --git a/reviewboard/reviews/tests/test_review_request.py b/reviewboard/reviews/tests/test_review_request.py
index c52d4acf7f75d222376a426fc808c24d7460d9dc..a0a8f14be570a1e61b9edadbd4cb112612309b24 100644
--- a/reviewboard/reviews/tests/test_review_request.py
+++ b/reviewboard/reviews/tests/test_review_request.py
@@ -1,5 +1,3 @@
-from warnings import catch_warnings
-
 import kgb
 from django.contrib.auth.models import User
 from django.utils import timezone
diff --git a/reviewboard/reviews/tests/test_review_request_detail_view.py b/reviewboard/reviews/tests/test_review_request_detail_view.py
index 61ebe566a1ec690df0253461874abcf419eda69d..4b5e75295d310e7bd20c32ebf8b3d71ea7ccdb24 100644
--- a/reviewboard/reviews/tests/test_review_request_detail_view.py
+++ b/reviewboard/reviews/tests/test_review_request_detail_view.py
@@ -6,7 +6,6 @@ from django.contrib.auth.models import User
 from django.test.html import parse_html
 from djblets.extensions.hooks import TemplateHook
 from djblets.extensions.models import RegisteredExtension
-from djblets.siteconfig.models import SiteConfiguration
 from kgb import SpyAgency
 
 from reviewboard.extensions.base import Extension, get_extension_manager
diff --git a/reviewboard/reviews/tests/test_review_request_draft.py b/reviewboard/reviews/tests/test_review_request_draft.py
index 4e3ef3c4924a07edd31eba73c0a34192e837a56e..54ea51c4c2342e3d8d32c3a0d2930278cf8897a4 100644
--- a/reviewboard/reviews/tests/test_review_request_draft.py
+++ b/reviewboard/reviews/tests/test_review_request_draft.py
@@ -4,7 +4,6 @@ from django.contrib.auth.models import User
 from djblets.features.testing import override_feature_check
 from kgb import SpyAgency
 
-from reviewboard.accounts.models import Profile
 from reviewboard.attachments.models import FileAttachment
 from reviewboard.changedescs.models import ChangeDescription
 from reviewboard.diffviewer.features import dvcs_feature
diff --git a/reviewboard/reviews/tests/test_reviewtags.py b/reviewboard/reviews/tests/test_reviewtags.py
index c275c8f12cf619ec02ce9bb4573d62d0ce6fdd58..4bba81a27c504243a740368ad96ec3f05c00dda6 100644
--- a/reviewboard/reviews/tests/test_reviewtags.py
+++ b/reviewboard/reviews/tests/test_reviewtags.py
@@ -1,5 +1,3 @@
-import logging
-
 from django.contrib.auth.models import User
 from django.template import Context, RequestContext, Template
 from django.test import RequestFactory
@@ -7,7 +5,6 @@ from djblets.testing.decorators import add_fixtures
 from kgb import SpyAgency
 
 from reviewboard.accounts.trophies import TrophyType, trophies_registry
-from reviewboard.deprecation import RemovedInReviewBoard40Warning
 from reviewboard.reviews.fields import (BaseReviewRequestField,
                                         BaseReviewRequestFieldSet,
                                         register_review_request_fieldset,
diff --git a/reviewboard/reviews/tests/test_signals.py b/reviewboard/reviews/tests/test_signals.py
index e295570419eb60dd437fd279c5fe193bd34da154..9fef3c114d8f7b1e5557b4baae32e840a096b5a2 100644
--- a/reviewboard/reviews/tests/test_signals.py
+++ b/reviewboard/reviews/tests/test_signals.py
@@ -3,7 +3,6 @@
 from djblets.testing.decorators import add_fixtures
 from kgb import SpyAgency
 
-from reviewboard.deprecation import RemovedInReviewBoard40Warning
 from reviewboard.reviews.models import ReviewRequest
 from reviewboard.reviews.signals import (review_request_closed,
                                          review_request_closing)
diff --git a/reviewboard/reviews/tests/test_status_update.py b/reviewboard/reviews/tests/test_status_update.py
index ffe596846e1e7823c8140fe95b61f916d8563e8c..190a439e5d52b2c0b7f7fddd8aa25ea8b5e30952 100644
--- a/reviewboard/reviews/tests/test_status_update.py
+++ b/reviewboard/reviews/tests/test_status_update.py
@@ -3,7 +3,6 @@
 from django.contrib.auth.models import AnonymousUser, Permission, User
 from djblets.testing.decorators import add_fixtures
 
-from reviewboard.accounts.models import LocalSiteProfile
 from reviewboard.reviews.models.base_comment import BaseComment
 from reviewboard.reviews.models.review_request import fetch_issue_counts
 from reviewboard.testing import TestCase
diff --git a/reviewboard/scmtools/bzr/__init__.py b/reviewboard/scmtools/bzr/__init__.py
index f186ce772f825e7f5ffa8065c1e0625e0e72e09a..90c4c3bc37253548875e6368a69d0dbf7d1fe547 100644
--- a/reviewboard/scmtools/bzr/__init__.py
+++ b/reviewboard/scmtools/bzr/__init__.py
@@ -1,6 +1,7 @@
 """Repository support for Bazaar."""
 
 import os
+import urllib.parse
 
 import dateutil.parser
 from django.utils.encoding import force_str
@@ -12,16 +13,10 @@ from reviewboard.scmtools.errors import (FileNotFoundError,
                                          RepositoryNotFoundError, SCMError)
 from reviewboard.ssh import utils as sshutils
 
-try:
-    import urlparse
-    uses_netloc = urlparse.uses_netloc
-except ImportError:
-    import urllib.parse
-    uses_netloc = urllib.parse.uses_netloc
 
 # Register these URI schemes so we can handle them properly.
 sshutils.ssh_uri_schemes.append('bzr+ssh')
-uses_netloc.extend(['bzr', 'bzr+ssh'])
+urllib.parse.uses_netloc.extend(['bzr', 'bzr+ssh'])
 
 
 class BZRTool(SCMTool):
diff --git a/reviewboard/scmtools/conditions.py b/reviewboard/scmtools/conditions.py
index 72e4f2e91bbb6b2363adbad34106d068c6380f74..42bbf4c7334083afa41aad94d4b78577a60b33d3 100644
--- a/reviewboard/scmtools/conditions.py
+++ b/reviewboard/scmtools/conditions.py
@@ -11,7 +11,6 @@ from djblets.conditions.operators import (AnyOperator,
                                           UnsetOperator)
 
 from reviewboard.scmtools.models import Repository, Tool
-from reviewboard.site.conditions import LocalSiteModelChoiceMixin
 
 
 class RepositoryConditionChoiceMixin(object):
diff --git a/reviewboard/scmtools/core.py b/reviewboard/scmtools/core.py
index 2ba7053b9b858b69e9da8d0f35a1d23e262f1d73..3c1a2ed9dd507c83dabdc770387e59b23a600d76 100644
--- a/reviewboard/scmtools/core.py
+++ b/reviewboard/scmtools/core.py
@@ -1,7 +1,6 @@
 """Data structures and classes for defining and using SCMTools."""
 
 import base64
-import functools
 import logging
 import os
 import subprocess
@@ -11,11 +10,9 @@ from urllib.parse import urlparse
 from urllib.request import Request as URLRequest, urlopen
 
 from django.utils.encoding import force_bytes, force_str
-from django.utils.inspect import func_accepts_kwargs
 from django.utils.translation import gettext_lazy as _
 from djblets.util.properties import TypedProperty
 
-from reviewboard.deprecation import RemovedInReviewBoard50Warning
 from reviewboard.scmtools.errors import (AuthenticationError,
                                          FileNotFoundError,
                                          SCMError)
diff --git a/reviewboard/scmtools/crypto_utils.py b/reviewboard/scmtools/crypto_utils.py
index 6efd9b037f75cb6aca87b39255356d131555ecf4..98ca48bbde9c88ab5307612abcaed098b4b5c59b 100644
--- a/reviewboard/scmtools/crypto_utils.py
+++ b/reviewboard/scmtools/crypto_utils.py
@@ -1,6 +1,5 @@
 import base64
 import os
-import warnings
 
 from cryptography.hazmat.backends import default_backend
 from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
diff --git a/reviewboard/scmtools/git.py b/reviewboard/scmtools/git.py
index 3b9de730695464cdc0544179cd1abe9fa930538f..e2b87abc658aefbcd1ac6bbc28606f4b4e751912 100644
--- a/reviewboard/scmtools/git.py
+++ b/reviewboard/scmtools/git.py
@@ -4,7 +4,6 @@ import os
 import platform
 import re
 import stat
-from io import StringIO
 from urllib.parse import (quote as urlquote,
                           urlsplit as urlsplit,
                           urlunsplit as urlunsplit)
diff --git a/reviewboard/scmtools/svn/base.py b/reviewboard/scmtools/svn/base.py
index a15926bd496d776d6e640edad9fdda87f46acbc7..aabd55aac8b2ed47d0be0598c6902331e6204a68 100644
--- a/reviewboard/scmtools/svn/base.py
+++ b/reviewboard/scmtools/svn/base.py
@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 
-import re
 from urllib.parse import quote
 
 from django.utils.translation import gettext as _
diff --git a/reviewboard/scmtools/tests/test_repository.py b/reviewboard/scmtools/tests/test_repository.py
index ffadb55a649a69a18f431752c07f8b8d0e378827..f621cee084afb045cdeb5ce66fad3b223b014262 100644
--- a/reviewboard/scmtools/tests/test_repository.py
+++ b/reviewboard/scmtools/tests/test_repository.py
@@ -2,7 +2,6 @@ import os
 
 import kgb
 from django.contrib.auth.models import AnonymousUser
-from django.core.cache import cache
 from django.core.exceptions import ValidationError
 from djblets.testing.decorators import add_fixtures
 
diff --git a/reviewboard/scmtools/tests/testcases.py b/reviewboard/scmtools/tests/testcases.py
index 3e0eca0965d9a05562ef582cc3a19755cb73dddf..8022fe25f50cef5f2bf42cff0920eefb2f72b395 100644
--- a/reviewboard/scmtools/tests/testcases.py
+++ b/reviewboard/scmtools/tests/testcases.py
@@ -1,6 +1,5 @@
 import os
 import unittest
-from errno import ECONNREFUSED
 from tempfile import mkdtemp
 
 from paramiko.ssh_exception import NoValidConnectionsError
diff --git a/reviewboard/site/mixins.py b/reviewboard/site/mixins.py
index 85e9c8b5510a00f332e27a0d5584bcff20f5c123..0a8756c1ecc06398379ff6514405d0e74597d60f 100644
--- a/reviewboard/site/mixins.py
+++ b/reviewboard/site/mixins.py
@@ -2,10 +2,8 @@
 
 import logging
 
-import django
 from django.contrib.auth.models import User
 from django.core.exceptions import FieldDoesNotExist
-from django.db import models
 from django.utils.decorators import method_decorator
 from django.utils.translation import gettext as _
 from djblets.db.query import get_object_or_none
diff --git a/reviewboard/testing/testcase.py b/reviewboard/testing/testcase.py
index 69188efced8de2ea4b04177a006678fcfda57190..c8705b40096990749a00bf9908ed39114116bc5f 100644
--- a/reviewboard/testing/testcase.py
+++ b/reviewboard/testing/testcase.py
@@ -5,7 +5,6 @@ from contextlib import contextmanager
 from datetime import timedelta
 from uuid import uuid4
 
-from django.conf import settings
 from django.contrib.auth.models import AnonymousUser, Permission, User
 from django.contrib.messages.middleware import MessageMiddleware
 from django.contrib.sessions.middleware import SessionMiddleware
@@ -16,7 +15,6 @@ from django.http import HttpResponse
 from django.test.client import RequestFactory
 from django.urls import ResolverMatch
 from django.utils import timezone
-from djblets.siteconfig.models import SiteConfiguration
 from djblets.testing.testcases import (FixturesCompilerMixin,
                                        TestCase as DjbletsTestCase)
 from oauthlib.common import generate_token
diff --git a/reviewboard/webapi/resources/diffcommit.py b/reviewboard/webapi/resources/diffcommit.py
index 7b08a6b7f56a3e68929ed782b7702907fd9b763f..ce3754a518fdd45d17a9c5f937a301ea02066284 100644
--- a/reviewboard/webapi/resources/diffcommit.py
+++ b/reviewboard/webapi/resources/diffcommit.py
@@ -6,7 +6,9 @@ from django.core.exceptions import ObjectDoesNotExist
 from django.http import HttpResponse
 from djblets.util.decorators import augment_method_from
 from djblets.util.http import get_http_requested_mimetype, set_last_modified
-from djblets.webapi.decorators import webapi_request_fields
+from djblets.webapi.decorators import (webapi_login_required,
+                                       webapi_request_fields,
+                                       webapi_response_errors)
 from djblets.webapi.errors import (DOES_NOT_EXIST, NOT_LOGGED_IN,
                                    PERMISSION_DENIED)
 from djblets.webapi.fields import (DateTimeFieldType, DictFieldType,
@@ -17,9 +19,7 @@ from reviewboard.diffviewer.models import DiffCommit, DiffSet
 from reviewboard.diffviewer.validators import COMMIT_ID_LENGTH
 from reviewboard.webapi.base import ImportExtraDataError, WebAPIResource
 from reviewboard.webapi.decorators import (webapi_check_local_site,
-                                           webapi_check_login_required,
-                                           webapi_login_required,
-                                           webapi_response_errors)
+                                           webapi_check_login_required)
 from reviewboard.webapi.resources import resources
 
 
diff --git a/reviewboard/webapi/resources/draft_diffcommit.py b/reviewboard/webapi/resources/draft_diffcommit.py
index b498cf2745c1c9510e56dce0d8127fbe4b7174f2..d8cd609349f913bfd856d9bc84a11741a40201fd 100644
--- a/reviewboard/webapi/resources/draft_diffcommit.py
+++ b/reviewboard/webapi/resources/draft_diffcommit.py
@@ -3,7 +3,9 @@
 import logging
 
 from djblets.util.decorators import augment_method_from
-from djblets.webapi.decorators import webapi_request_fields
+from djblets.webapi.decorators import (webapi_login_required,
+                                       webapi_request_fields,
+                                       webapi_response_errors)
 from djblets.webapi.errors import (DOES_NOT_EXIST, INVALID_ATTRIBUTE,
                                    INVALID_FORM_DATA)
 from djblets.webapi.fields import (DateTimeFieldType,
@@ -14,9 +16,7 @@ from reviewboard.diffviewer.errors import DiffTooBigError, EmptyDiffError
 from reviewboard.reviews.forms import UploadCommitForm
 from reviewboard.reviews.models import ReviewRequest, ReviewRequestDraft
 from reviewboard.scmtools.core import FileNotFoundError
-from reviewboard.webapi.decorators import (webapi_check_local_site,
-                                           webapi_login_required,
-                                           webapi_response_errors)
+from reviewboard.webapi.decorators import webapi_check_local_site
 from reviewboard.webapi.errors import (DIFF_EMPTY,
                                        DIFF_TOO_BIG,
                                        REPO_FILE_NOT_FOUND)
diff --git a/reviewboard/webapi/resources/validate_diffcommit.py b/reviewboard/webapi/resources/validate_diffcommit.py
index 737edc7ef11a1a490c464ad9cf04236148083b97..669f8a8df828cb8404ed9a45b19f0bfff73d5b45 100644
--- a/reviewboard/webapi/resources/validate_diffcommit.py
+++ b/reviewboard/webapi/resources/validate_diffcommit.py
@@ -1,7 +1,5 @@
 """The DiffCommit validation resource."""
 
-import base64
-import json
 import logging
 
 from django.db.models import Q
@@ -20,7 +18,6 @@ from reviewboard.diffviewer.errors import (DiffParserError,
                                            EmptyDiffError)
 from reviewboard.diffviewer.features import dvcs_feature
 from reviewboard.diffviewer.forms import ValidateCommitForm
-from reviewboard.diffviewer.models import FileDiff
 from reviewboard.scmtools.errors import FileNotFoundError, SCMError
 from reviewboard.scmtools.git import ShortSHA1Error
 from reviewboard.scmtools.models import Repository
diff --git a/reviewboard/webapi/resources/webhook.py b/reviewboard/webapi/resources/webhook.py
index 0514aaf5917db3a4f3f07eb0e917c7655dfc90a8..8a2b930ba7244bdc3bac0d0e0b1b4015ab62c758 100644
--- a/reviewboard/webapi/resources/webhook.py
+++ b/reviewboard/webapi/resources/webhook.py
@@ -1,7 +1,9 @@
 import re
 
 from djblets.util.decorators import augment_method_from
-from djblets.webapi.decorators import webapi_request_fields
+from djblets.webapi.decorators import (webapi_login_required,
+                                       webapi_request_fields,
+                                       webapi_response_errors)
 from djblets.webapi.errors import (DOES_NOT_EXIST, INVALID_FORM_DATA,
                                    NOT_LOGGED_IN, PERMISSION_DENIED)
 from djblets.webapi.fields import (BooleanFieldType,
@@ -15,9 +17,7 @@ from djblets.webapi.fields import (BooleanFieldType,
 from reviewboard.notifications.forms import WebHookTargetForm
 from reviewboard.notifications.models import WebHookTarget
 from reviewboard.webapi.base import WebAPIResource
-from reviewboard.webapi.decorators import (webapi_login_required,
-                                           webapi_check_local_site,
-                                           webapi_response_errors)
+from reviewboard.webapi.decorators import webapi_check_local_site
 from reviewboard.webapi.mixins import UpdateFormMixin
 from reviewboard.webapi.resources.repository import RepositoryResource
 
diff --git a/reviewboard/webapi/tests/base.py b/reviewboard/webapi/tests/base.py
index ac80214603bbd456cb8b55e4eb4f4304bc8f5971..e01338434d5f08e093134c96eb78b067b928cf78 100644
--- a/reviewboard/webapi/tests/base.py
+++ b/reviewboard/webapi/tests/base.py
@@ -2,7 +2,6 @@ import os
 
 from django.conf import settings
 from django.contrib.auth.models import User
-from django.core import mail
 from djblets.siteconfig.models import SiteConfiguration
 from djblets.webapi.testing.testcases import WebAPITestCaseMixin
 
diff --git a/reviewboard/webapi/tests/test_base.py b/reviewboard/webapi/tests/test_base.py
index fd60c2457b8e36152ff1a5c22c436c2006b5f1b9..c62a8e074a2625dabed970d2cb8ec30ad54b95ab 100644
--- a/reviewboard/webapi/tests/test_base.py
+++ b/reviewboard/webapi/tests/test_base.py
@@ -2,7 +2,6 @@
 
 import json
 
-from django.contrib.auth.models import User
 from django.urls import clear_url_caches, include, path, re_path
 from djblets.features import Feature, get_features_registry
 from djblets.testing.decorators import add_fixtures
diff --git a/reviewboard/webapi/tests/test_draft_diff.py b/reviewboard/webapi/tests/test_draft_diff.py
index 4cbfaaec884eba6d756acbc76980f808c3e609de..23f97ff7f354cef8aae14e035dc3d63f9c8c3b88 100644
--- a/reviewboard/webapi/tests/test_draft_diff.py
+++ b/reviewboard/webapi/tests/test_draft_diff.py
@@ -6,7 +6,6 @@ from djblets.features.testing import override_feature_check
 from djblets.webapi.errors import INVALID_ATTRIBUTE, INVALID_FORM_DATA
 from djblets.webapi.testing.decorators import webapi_test_template
 
-from reviewboard import scmtools
 from reviewboard.diffviewer.commit_utils import (serialize_validation_info,
                                                  update_validation_info)
 from reviewboard.diffviewer.features import dvcs_feature
diff --git a/reviewboard/webapi/tests/test_repository.py b/reviewboard/webapi/tests/test_repository.py
index 96d616bdf47626344220e675726ebfa345fdc1e3..67b6333bb99e1eb7126c96f737e1820872b2ae7a 100644
--- a/reviewboard/webapi/tests/test_repository.py
+++ b/reviewboard/webapi/tests/test_repository.py
@@ -11,7 +11,6 @@ from reviewboard.hostingsvcs.bitbucket import Bitbucket
 from reviewboard.hostingsvcs.github import GitHub
 from reviewboard.hostingsvcs.gitlab import GitLab
 from reviewboard.hostingsvcs.models import HostingServiceAccount
-from reviewboard.reviews.models import ReviewRequest
 from reviewboard.scmtools.errors import (AuthenticationError,
                                          UnverifiedCertificateError)
 from reviewboard.scmtools.models import Repository, Tool
diff --git a/reviewboard/webapi/tests/test_review_request.py b/reviewboard/webapi/tests/test_review_request.py
index b58a903bc247053f9592f5bf3ab9d70816bc029a..03843091114b9b99cb0e3e611f809e4f1c134ae4 100644
--- a/reviewboard/webapi/tests/test_review_request.py
+++ b/reviewboard/webapi/tests/test_review_request.py
@@ -1,4 +1,3 @@
-import django
 from django.contrib import auth
 from django.contrib.auth.models import User, Permission
 from django.db.models import Q
@@ -14,7 +13,6 @@ from kgb import SpyAgency
 from pytz import timezone
 
 from reviewboard.accounts.backends import AuthBackend
-from reviewboard.accounts.models import LocalSiteProfile
 from reviewboard.admin.server import build_server_url
 from reviewboard.diffviewer.features import dvcs_feature
 from reviewboard.reviews.models import (BaseComment, ReviewRequest,
diff --git a/reviewboard/webapi/tests/test_review_request_draft.py b/reviewboard/webapi/tests/test_review_request_draft.py
index de555d940f2da8c6aaa75c28936cdf0de94dc577..d3f98dbc1855d8421626da8bf6699adc9448789d 100644
--- a/reviewboard/webapi/tests/test_review_request_draft.py
+++ b/reviewboard/webapi/tests/test_review_request_draft.py
@@ -8,7 +8,6 @@ from djblets.webapi.testing.decorators import webapi_test_template
 from kgb import SpyAgency
 
 from reviewboard.accounts.backends import AuthBackend, StandardAuthBackend
-from reviewboard.accounts.models import LocalSiteProfile
 from reviewboard.changedescs.models import ChangeDescription
 from reviewboard.diffviewer.features import dvcs_feature
 from reviewboard.reviews.fields import (BaseEditableField,
