浏览代码

Bumped minimum isort version to 5.1.0.

Fixed inner imports per isort 5.
isort 5.0.0 to 5.1.0 was unstable.
David Smith 4 年之前
父节点
当前提交
e74b3d724e
共有 49 个文件被更改,包括 115 次插入59 次删除
  1. 1 0
      django/apps/registry.py
  2. 1 2
      django/contrib/admin/checks.py
  3. 1 1
      django/contrib/admin/decorators.py
  4. 4 3
      django/contrib/admin/options.py
  5. 2 2
      django/contrib/admin/sites.py
  6. 6 2
      django/contrib/gis/db/backends/oracle/operations.py
  7. 6 2
      django/contrib/gis/db/backends/spatialite/operations.py
  8. 3 0
      django/contrib/gis/db/backends/spatialite/schema.py
  9. 5 4
      django/contrib/gis/geos/geometry.py
  10. 1 0
      django/contrib/gis/management/commands/ogrinspect.py
  11. 3 1
      django/contrib/gis/utils/__init__.py
  12. 4 2
      django/core/files/locks.py
  13. 1 1
      django/core/management/commands/diffsettings.py
  14. 1 0
      django/core/management/commands/shell.py
  15. 2 3
      django/core/serializers/pyyaml.py
  16. 1 1
      django/db/backends/base/base.py
  17. 4 2
      django/db/models/fields/related_lookups.py
  18. 3 1
      django/db/models/functions/mixins.py
  19. 3 1
      django/db/models/lookups.py
  20. 1 1
      django/forms/models.py
  21. 1 0
      django/template/context_processors.py
  22. 1 1
      django/template/defaulttags.py
  23. 1 0
      django/test/client.py
  24. 3 1
      django/test/selenium.py
  25. 3 1
      django/test/signals.py
  26. 1 0
      django/utils/autoreload.py
  27. 3 1
      django/utils/translation/__init__.py
  28. 1 0
      django/utils/translation/reloader.py
  29. 1 1
      django/views/csrf.py
  30. 1 1
      docs/internals/contributing/writing-code/coding-style.txt
  31. 1 1
      docs/internals/contributing/writing-code/unit-tests.txt
  32. 1 0
      tests/annotations/tests.py
  33. 1 0
      tests/backends/postgresql/test_creation.py
  34. 1 1
      tests/backends/postgresql/tests.py
  35. 1 1
      tests/gis_tests/geo3d/tests.py
  36. 3 1
      tests/gis_tests/rasterapp/test_rasterfield.py
  37. 3 1
      tests/gis_tests/tests.py
  38. 9 3
      tests/gis_tests/utils.py
  39. 2 3
      tests/model_fields/test_imagefield.py
  40. 1 1
      tests/model_forms/tests.py
  41. 1 0
      tests/postgres_tests/test_apps.py
  42. 5 2
      tests/postgres_tests/test_array.py
  43. 1 1
      tests/postgres_tests/test_bulk_update.py
  44. 5 3
      tests/postgres_tests/test_constraints.py
  45. 4 2
      tests/postgres_tests/test_json_deprecation.py
  46. 1 1
      tests/postgres_tests/test_operations.py
  47. 1 0
      tests/postgres_tests/test_ranges.py
  48. 3 1
      tests/postgres_tests/test_trigram.py
  49. 2 2
      tox.ini

+ 1 - 0
django/apps/registry.py

@@ -128,6 +128,7 @@ class Apps:
         """Raise an exception if all apps haven't been imported yet."""
         """Raise an exception if all apps haven't been imported yet."""
         if not self.apps_ready:
         if not self.apps_ready:
             from django.conf import settings
             from django.conf import settings
+
             # If "not ready" is due to unconfigured settings, accessing
             # If "not ready" is due to unconfigured settings, accessing
             # INSTALLED_APPS raises a more helpful ImproperlyConfigured
             # INSTALLED_APPS raises a more helpful ImproperlyConfigured
             # exception.
             # exception.

+ 1 - 2
django/contrib/admin/checks.py

@@ -814,8 +814,7 @@ class ModelAdminChecks(BaseModelAdminChecks):
         2. ('field', SomeFieldListFilter) - a field-based list filter class
         2. ('field', SomeFieldListFilter) - a field-based list filter class
         3. SomeListFilter - a non-field list filter class
         3. SomeListFilter - a non-field list filter class
         """
         """
-
-        from django.contrib.admin import ListFilter, FieldListFilter
+        from django.contrib.admin import FieldListFilter, ListFilter
 
 
         if callable(item) and not isinstance(item, models.Field):
         if callable(item) and not isinstance(item, models.Field):
             # If item is option 3, it should be a ListFilter...
             # If item is option 3, it should be a ListFilter...

+ 1 - 1
django/contrib/admin/decorators.py

@@ -10,7 +10,7 @@ def register(*models, site=None):
     The `site` kwarg is an admin site to use instead of the default admin site.
     The `site` kwarg is an admin site to use instead of the default admin site.
     """
     """
     from django.contrib.admin import ModelAdmin
     from django.contrib.admin import ModelAdmin
-    from django.contrib.admin.sites import site as default_site, AdminSite
+    from django.contrib.admin.sites import AdminSite, site as default_site
 
 
     def _model_admin_wrapper(admin_class):
     def _model_admin_wrapper(admin_class):
         if not models:
         if not models:

+ 4 - 3
django/contrib/admin/options.py

@@ -808,7 +808,7 @@ class ModelAdmin(BaseModelAdmin):
 
 
         The default implementation creates an admin LogEntry object.
         The default implementation creates an admin LogEntry object.
         """
         """
-        from django.contrib.admin.models import LogEntry, ADDITION
+        from django.contrib.admin.models import ADDITION, LogEntry
         return LogEntry.objects.log_action(
         return LogEntry.objects.log_action(
             user_id=request.user.pk,
             user_id=request.user.pk,
             content_type_id=get_content_type_for_model(object).pk,
             content_type_id=get_content_type_for_model(object).pk,
@@ -824,7 +824,7 @@ class ModelAdmin(BaseModelAdmin):
 
 
         The default implementation creates an admin LogEntry object.
         The default implementation creates an admin LogEntry object.
         """
         """
-        from django.contrib.admin.models import LogEntry, CHANGE
+        from django.contrib.admin.models import CHANGE, LogEntry
         return LogEntry.objects.log_action(
         return LogEntry.objects.log_action(
             user_id=request.user.pk,
             user_id=request.user.pk,
             content_type_id=get_content_type_for_model(object).pk,
             content_type_id=get_content_type_for_model(object).pk,
@@ -841,7 +841,7 @@ class ModelAdmin(BaseModelAdmin):
 
 
         The default implementation creates an admin LogEntry object.
         The default implementation creates an admin LogEntry object.
         """
         """
-        from django.contrib.admin.models import LogEntry, DELETION
+        from django.contrib.admin.models import DELETION, LogEntry
         return LogEntry.objects.log_action(
         return LogEntry.objects.log_action(
             user_id=request.user.pk,
             user_id=request.user.pk,
             content_type_id=get_content_type_for_model(object).pk,
             content_type_id=get_content_type_for_model(object).pk,
@@ -1910,6 +1910,7 @@ class ModelAdmin(BaseModelAdmin):
     def history_view(self, request, object_id, extra_context=None):
     def history_view(self, request, object_id, extra_context=None):
         "The 'history' admin view for this model."
         "The 'history' admin view for this model."
         from django.contrib.admin.models import LogEntry
         from django.contrib.admin.models import LogEntry
+
         # First check if the user can see this history.
         # First check if the user can see this history.
         model = self.model
         model = self.model
         obj = self.get_object(request, unquote(object_id))
         obj = self.get_object(request, unquote(object_id))

+ 2 - 2
django/contrib/admin/sites.py

@@ -240,11 +240,11 @@ class AdminSite:
         return update_wrapper(inner, view)
         return update_wrapper(inner, view)
 
 
     def get_urls(self):
     def get_urls(self):
-        from django.urls import include, path, re_path
         # Since this module gets imported in the application's root package,
         # Since this module gets imported in the application's root package,
         # it cannot import models from other applications at the module level,
         # it cannot import models from other applications at the module level,
         # and django.contrib.contenttypes.views imports ContentType.
         # and django.contrib.contenttypes.views imports ContentType.
         from django.contrib.contenttypes import views as contenttype_views
         from django.contrib.contenttypes import views as contenttype_views
+        from django.urls import include, path, re_path
 
 
         def wrap(view, cacheable=False):
         def wrap(view, cacheable=False):
             def wrapper(*args, **kwargs):
             def wrapper(*args, **kwargs):
@@ -385,11 +385,11 @@ class AdminSite:
             index_path = reverse('admin:index', current_app=self.name)
             index_path = reverse('admin:index', current_app=self.name)
             return HttpResponseRedirect(index_path)
             return HttpResponseRedirect(index_path)
 
 
-        from django.contrib.auth.views import LoginView
         # Since this module gets imported in the application's root package,
         # Since this module gets imported in the application's root package,
         # it cannot import models from other applications at the module level,
         # it cannot import models from other applications at the module level,
         # and django.contrib.admin.forms eventually imports User.
         # and django.contrib.admin.forms eventually imports User.
         from django.contrib.admin.forms import AdminAuthenticationForm
         from django.contrib.admin.forms import AdminAuthenticationForm
+        from django.contrib.auth.views import LoginView
         context = {
         context = {
             **self.each_context(request),
             **self.each_context(request),
             'title': _('Log in'),
             'title': _('Log in'),

+ 6 - 2
django/contrib/gis/db/backends/oracle/operations.py

@@ -186,11 +186,15 @@ class OracleOperations(BaseSpatialOperations, DatabaseOperations):
 
 
     # Routines for getting the OGC-compliant models.
     # Routines for getting the OGC-compliant models.
     def geometry_columns(self):
     def geometry_columns(self):
-        from django.contrib.gis.db.backends.oracle.models import OracleGeometryColumns
+        from django.contrib.gis.db.backends.oracle.models import (
+            OracleGeometryColumns,
+        )
         return OracleGeometryColumns
         return OracleGeometryColumns
 
 
     def spatial_ref_sys(self):
     def spatial_ref_sys(self):
-        from django.contrib.gis.db.backends.oracle.models import OracleSpatialRefSys
+        from django.contrib.gis.db.backends.oracle.models import (
+            OracleSpatialRefSys,
+        )
         return OracleSpatialRefSys
         return OracleSpatialRefSys
 
 
     def modify_insert_params(self, placeholder, params):
     def modify_insert_params(self, placeholder, params):

+ 6 - 2
django/contrib/gis/db/backends/spatialite/operations.py

@@ -189,11 +189,15 @@ class SpatiaLiteOperations(BaseSpatialOperations, DatabaseOperations):
 
 
     # Routines for getting the OGC-compliant models.
     # Routines for getting the OGC-compliant models.
     def geometry_columns(self):
     def geometry_columns(self):
-        from django.contrib.gis.db.backends.spatialite.models import SpatialiteGeometryColumns
+        from django.contrib.gis.db.backends.spatialite.models import (
+            SpatialiteGeometryColumns,
+        )
         return SpatialiteGeometryColumns
         return SpatialiteGeometryColumns
 
 
     def spatial_ref_sys(self):
     def spatial_ref_sys(self):
-        from django.contrib.gis.db.backends.spatialite.models import SpatialiteSpatialRefSys
+        from django.contrib.gis.db.backends.spatialite.models import (
+            SpatialiteSpatialRefSys,
+        )
         return SpatialiteSpatialRefSys
         return SpatialiteSpatialRefSys
 
 
     def get_geometry_converter(self, expression):
     def get_geometry_converter(self, expression):

+ 3 - 0
django/contrib/gis/db/backends/spatialite/schema.py

@@ -83,6 +83,7 @@ class SpatialiteSchemaEditor(DatabaseSchemaEditor):
 
 
     def delete_model(self, model, **kwargs):
     def delete_model(self, model, **kwargs):
         from django.contrib.gis.db.models import GeometryField
         from django.contrib.gis.db.models import GeometryField
+
         # Drop spatial metadata (dropping the table does not automatically remove them)
         # Drop spatial metadata (dropping the table does not automatically remove them)
         for field in model._meta.local_fields:
         for field in model._meta.local_fields:
             if isinstance(field, GeometryField):
             if isinstance(field, GeometryField):
@@ -113,6 +114,7 @@ class SpatialiteSchemaEditor(DatabaseSchemaEditor):
 
 
     def remove_field(self, model, field):
     def remove_field(self, model, field):
         from django.contrib.gis.db.models import GeometryField
         from django.contrib.gis.db.models import GeometryField
+
         # NOTE: If the field is a geometry field, the table is just recreated,
         # NOTE: If the field is a geometry field, the table is just recreated,
         # the parent's remove_field can't be used cause it will skip the
         # the parent's remove_field can't be used cause it will skip the
         # recreation if the field does not have a database type. Geometry fields
         # recreation if the field does not have a database type. Geometry fields
@@ -125,6 +127,7 @@ class SpatialiteSchemaEditor(DatabaseSchemaEditor):
 
 
     def alter_db_table(self, model, old_db_table, new_db_table, disable_constraints=True):
     def alter_db_table(self, model, old_db_table, new_db_table, disable_constraints=True):
         from django.contrib.gis.db.models import GeometryField
         from django.contrib.gis.db.models import GeometryField
+
         # Remove geometry-ness from temp table
         # Remove geometry-ness from temp table
         for field in model._meta.local_fields:
         for field in model._meta.local_fields:
             if isinstance(field, GeometryField):
             if isinstance(field, GeometryField):

+ 5 - 4
django/contrib/gis/geos/geometry.py

@@ -37,12 +37,13 @@ class GEOSGeometryBase(GEOSBase):
             if cls is None:
             if cls is None:
                 if GEOSGeometryBase._GEOS_CLASSES is None:
                 if GEOSGeometryBase._GEOS_CLASSES is None:
                     # Inner imports avoid import conflicts with GEOSGeometry.
                     # Inner imports avoid import conflicts with GEOSGeometry.
-                    from .linestring import LineString, LinearRing
-                    from .point import Point
-                    from .polygon import Polygon
                     from .collections import (
                     from .collections import (
-                        GeometryCollection, MultiPoint, MultiLineString, MultiPolygon,
+                        GeometryCollection, MultiLineString, MultiPoint,
+                        MultiPolygon,
                     )
                     )
+                    from .linestring import LinearRing, LineString
+                    from .point import Point
+                    from .polygon import Polygon
                     GEOSGeometryBase._GEOS_CLASSES = {
                     GEOSGeometryBase._GEOS_CLASSES = {
                         0: Point,
                         0: Point,
                         1: LineString,
                         1: LineString,

+ 1 - 0
django/contrib/gis/management/commands/ogrinspect.py

@@ -107,6 +107,7 @@ class Command(BaseCommand):
         # Returning the output of ogrinspect with the given arguments
         # Returning the output of ogrinspect with the given arguments
         # and options.
         # and options.
         from django.contrib.gis.utils.ogrinspect import _ogrinspect, mapping
         from django.contrib.gis.utils.ogrinspect import _ogrinspect, mapping
+
         # Filter options to params accepted by `_ogrinspect`
         # Filter options to params accepted by `_ogrinspect`
         ogr_options = {k: v for k, v in options.items()
         ogr_options = {k: v for k, v in options.items()
                        if k in get_func_args(_ogrinspect) and v is not None}
                        if k in get_func_args(_ogrinspect) and v is not None}

+ 3 - 1
django/contrib/gis/utils/__init__.py

@@ -9,6 +9,8 @@ from django.core.exceptions import ImproperlyConfigured
 try:
 try:
     # LayerMapping requires DJANGO_SETTINGS_MODULE to be set,
     # LayerMapping requires DJANGO_SETTINGS_MODULE to be set,
     # and ImproperlyConfigured is raised if that's not the case.
     # and ImproperlyConfigured is raised if that's not the case.
-    from django.contrib.gis.utils.layermapping import LayerMapping, LayerMapError  # NOQA
+    from django.contrib.gis.utils.layermapping import (  # NOQA
+        LayerMapError, LayerMapping,
+    )
 except ImproperlyConfigured:
 except ImproperlyConfigured:
     pass
     pass

+ 4 - 2
django/core/files/locks.py

@@ -28,8 +28,10 @@ def _fd(f):
 
 
 if os.name == 'nt':
 if os.name == 'nt':
     import msvcrt
     import msvcrt
-    from ctypes import (sizeof, c_ulong, c_void_p, c_int64,
-                        Structure, Union, POINTER, windll, byref)
+    from ctypes import (
+        POINTER, Structure, Union, byref, c_int64, c_ulong, c_void_p, sizeof,
+        windll,
+    )
     from ctypes.wintypes import BOOL, DWORD, HANDLE
     from ctypes.wintypes import BOOL, DWORD, HANDLE
 
 
     LOCK_SH = 0  # the default
     LOCK_SH = 0  # the default

+ 1 - 1
django/core/management/commands/diffsettings.py

@@ -39,7 +39,7 @@ class Command(BaseCommand):
         )
         )
 
 
     def handle(self, **options):
     def handle(self, **options):
-        from django.conf import settings, Settings, global_settings
+        from django.conf import Settings, global_settings, settings
 
 
         # Because settings are imported lazily, we need to explicitly load them.
         # Because settings are imported lazily, we need to explicitly load them.
         if not settings.configured:
         if not settings.configured:

+ 1 - 0
django/core/management/commands/shell.py

@@ -41,6 +41,7 @@ class Command(BaseCommand):
 
 
     def python(self, options):
     def python(self, options):
         import code
         import code
+
         # Set up a dictionary to serve as the environment for the shell, so
         # Set up a dictionary to serve as the environment for the shell, so
         # that tab completion works on objects that are imported at runtime.
         # that tab completion works on objects that are imported at runtime.
         imported_objects = {}
         imported_objects = {}

+ 2 - 3
django/core/serializers/pyyaml.py

@@ -18,10 +18,9 @@ from django.db import models
 
 
 # Use the C (faster) implementation if possible
 # Use the C (faster) implementation if possible
 try:
 try:
-    from yaml import CSafeLoader as SafeLoader
-    from yaml import CSafeDumper as SafeDumper
+    from yaml import CSafeDumper as SafeDumper, CSafeLoader as SafeLoader
 except ImportError:
 except ImportError:
-    from yaml import SafeLoader, SafeDumper
+    from yaml import SafeDumper, SafeLoader
 
 
 
 
 class DjangoSafeDumper(SafeDumper):
 class DjangoSafeDumper(SafeDumper):

+ 1 - 1
django/db/backends/base/base.py

@@ -1,3 +1,4 @@
+import _thread
 import copy
 import copy
 import threading
 import threading
 import time
 import time
@@ -5,7 +6,6 @@ import warnings
 from collections import deque
 from collections import deque
 from contextlib import contextmanager
 from contextlib import contextmanager
 
 
-import _thread
 import pytz
 import pytz
 
 
 from django.conf import settings
 from django.conf import settings

+ 4 - 2
django/db/models/fields/related_lookups.py

@@ -64,7 +64,9 @@ class RelatedIn(In):
             # For multicolumn lookups we need to build a multicolumn where clause.
             # For multicolumn lookups we need to build a multicolumn where clause.
             # This clause is either a SubqueryConstraint (for values that need to be compiled to
             # This clause is either a SubqueryConstraint (for values that need to be compiled to
             # SQL) or an OR-combined list of (col1 = val1 AND col2 = val2 AND ...) clauses.
             # SQL) or an OR-combined list of (col1 = val1 AND col2 = val2 AND ...) clauses.
-            from django.db.models.sql.where import WhereNode, SubqueryConstraint, AND, OR
+            from django.db.models.sql.where import (
+                AND, OR, SubqueryConstraint, WhereNode,
+            )
 
 
             root_constraint = WhereNode(connector=OR)
             root_constraint = WhereNode(connector=OR)
             if self.rhs_is_direct_value():
             if self.rhs_is_direct_value():
@@ -120,7 +122,7 @@ class RelatedLookupMixin:
         if isinstance(self.lhs, MultiColSource):
         if isinstance(self.lhs, MultiColSource):
             assert self.rhs_is_direct_value()
             assert self.rhs_is_direct_value()
             self.rhs = get_normalized_value(self.rhs, self.lhs)
             self.rhs = get_normalized_value(self.rhs, self.lhs)
-            from django.db.models.sql.where import WhereNode, AND
+            from django.db.models.sql.where import AND, WhereNode
             root_constraint = WhereNode()
             root_constraint = WhereNode()
             for target, source, val in zip(self.lhs.targets, self.lhs.sources, self.rhs):
             for target, source, val in zip(self.lhs.targets, self.lhs.sources, self.rhs):
                 lookup_class = target.get_lookup(self.lookup_name)
                 lookup_class = target.get_lookup(self.lookup_name)

+ 3 - 1
django/db/models/functions/mixins.py

@@ -32,7 +32,9 @@ class FixDurationInputMixin:
         if self.output_field.get_internal_type() == 'DurationField':
         if self.output_field.get_internal_type() == 'DurationField':
             expression = self.get_source_expressions()[0]
             expression = self.get_source_expressions()[0]
             options = self._get_repr_options()
             options = self._get_repr_options()
-            from django.db.backends.oracle.functions import IntervalToSeconds, SecondsToInterval
+            from django.db.backends.oracle.functions import (
+                IntervalToSeconds, SecondsToInterval,
+            )
             return compiler.compile(
             return compiler.compile(
                 SecondsToInterval(self.__class__(IntervalToSeconds(expression), **options))
                 SecondsToInterval(self.__class__(IntervalToSeconds(expression), **options))
             )
             )

+ 3 - 1
django/db/models/lookups.py

@@ -29,7 +29,9 @@ class Lookup:
         if bilateral_transforms:
         if bilateral_transforms:
             # Warn the user as soon as possible if they are trying to apply
             # Warn the user as soon as possible if they are trying to apply
             # a bilateral transformation on a nested QuerySet: that won't work.
             # a bilateral transformation on a nested QuerySet: that won't work.
-            from django.db.models.sql.query import Query  # avoid circular import
+            from django.db.models.sql.query import (  # avoid circular import
+                Query,
+            )
             if isinstance(rhs, Query):
             if isinstance(rhs, Query):
                 raise NotImplementedError("Bilateral transformations on nested querysets are not implemented.")
                 raise NotImplementedError("Bilateral transformations on nested querysets are not implemented.")
         self.bilateral_transforms = bilateral_transforms
         self.bilateral_transforms = bilateral_transforms

+ 1 - 1
django/forms/models.py

@@ -815,7 +815,7 @@ class BaseModelFormSet(BaseFormSet):
 
 
     def add_fields(self, form, index):
     def add_fields(self, form, index):
         """Add a hidden field for the object's primary key."""
         """Add a hidden field for the object's primary key."""
-        from django.db.models import AutoField, OneToOneField, ForeignKey
+        from django.db.models import AutoField, ForeignKey, OneToOneField
         self._pk_field = pk = self.model._meta.pk
         self._pk_field = pk = self.model._meta.pk
         # If a pk isn't editable, then it won't be on the form, so we need to
         # If a pk isn't editable, then it won't be on the form, so we need to
         # add it here so we can tell which object is which when we get the
         # add it here so we can tell which object is which when we get the

+ 1 - 0
django/template/context_processors.py

@@ -40,6 +40,7 @@ def debug(request):
     if settings.DEBUG and request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
     if settings.DEBUG and request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
         context_extras['debug'] = True
         context_extras['debug'] = True
         from django.db import connections
         from django.db import connections
+
         # Return a lazy reference that computes connection.queries on access,
         # Return a lazy reference that computes connection.queries on access,
         # to ensure it contains queries triggered after this function runs.
         # to ensure it contains queries triggered after this function runs.
         context_extras['sql_queries'] = lazy(
         context_extras['sql_queries'] = lazy(

+ 1 - 1
django/template/defaulttags.py

@@ -428,7 +428,7 @@ class URLNode(Node):
         self.asvar = asvar
         self.asvar = asvar
 
 
     def render(self, context):
     def render(self, context):
-        from django.urls import reverse, NoReverseMatch
+        from django.urls import NoReverseMatch, reverse
         args = [arg.resolve(context) for arg in self.args]
         args = [arg.resolve(context) for arg in self.args]
         kwargs = {k: v.resolve(context) for k, v in self.kwargs.items()}
         kwargs = {k: v.resolve(context) for k, v in self.kwargs.items()}
         view_name = self.view_name.resolve(context)
         view_name = self.view_name.resolve(context)

+ 1 - 0
django/test/client.py

@@ -611,6 +611,7 @@ class ClientMixin:
 
 
     def _login(self, user, backend=None):
     def _login(self, user, backend=None):
         from django.contrib.auth import login
         from django.contrib.auth import login
+
         # Create a fake request to store login details.
         # Create a fake request to store login details.
         request = HttpRequest()
         request = HttpRequest()
         if self.session:
         if self.session:

+ 3 - 1
django/test/selenium.py

@@ -70,7 +70,9 @@ class SeleniumTestCaseBase(type(LiveServerTestCase)):
 
 
     @classmethod
     @classmethod
     def get_capability(cls, browser):
     def get_capability(cls, browser):
-        from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
+        from selenium.webdriver.common.desired_capabilities import (
+            DesiredCapabilities,
+        )
         return getattr(DesiredCapabilities, browser.upper())
         return getattr(DesiredCapabilities, browser.upper())
 
 
     def create_options(self):
     def create_options(self):

+ 3 - 1
django/test/signals.py

@@ -175,7 +175,9 @@ def static_finders_changed(**kwargs):
 @receiver(setting_changed)
 @receiver(setting_changed)
 def auth_password_validators_changed(**kwargs):
 def auth_password_validators_changed(**kwargs):
     if kwargs['setting'] == 'AUTH_PASSWORD_VALIDATORS':
     if kwargs['setting'] == 'AUTH_PASSWORD_VALIDATORS':
-        from django.contrib.auth.password_validation import get_default_password_validators
+        from django.contrib.auth.password_validation import (
+            get_default_password_validators,
+        )
         get_default_password_validators.cache_clear()
         get_default_password_validators.cache_clear()
 
 
 
 

+ 1 - 0
django/utils/autoreload.py

@@ -300,6 +300,7 @@ class BaseReloader:
         logger.debug('Waiting for apps ready_event.')
         logger.debug('Waiting for apps ready_event.')
         self.wait_for_apps_ready(apps, django_main_thread)
         self.wait_for_apps_ready(apps, django_main_thread)
         from django.urls import get_resolver
         from django.urls import get_resolver
+
         # Prevent a race condition where URL modules aren't loaded when the
         # Prevent a race condition where URL modules aren't loaded when the
         # reloader starts by accessing the urlconf_module property.
         # reloader starts by accessing the urlconf_module property.
         try:
         try:

+ 3 - 1
django/utils/translation/__init__.py

@@ -56,7 +56,9 @@ class Trans:
         from django.conf import settings
         from django.conf import settings
         if settings.USE_I18N:
         if settings.USE_I18N:
             from django.utils.translation import trans_real as trans
             from django.utils.translation import trans_real as trans
-            from django.utils.translation.reloader import watch_for_translation_changes, translation_file_changed
+            from django.utils.translation.reloader import (
+                translation_file_changed, watch_for_translation_changes,
+            )
             autoreload_started.connect(watch_for_translation_changes, dispatch_uid='translation_file_changed')
             autoreload_started.connect(watch_for_translation_changes, dispatch_uid='translation_file_changed')
             file_changed.connect(translation_file_changed, dispatch_uid='translation_file_changed')
             file_changed.connect(translation_file_changed, dispatch_uid='translation_file_changed')
         else:
         else:

+ 1 - 0
django/utils/translation/reloader.py

@@ -30,6 +30,7 @@ def translation_file_changed(sender, file_path, **kwargs):
     """Clear the internal translations cache if a .mo file is modified."""
     """Clear the internal translations cache if a .mo file is modified."""
     if file_path.suffix == '.mo':
     if file_path.suffix == '.mo':
         import gettext
         import gettext
+
         from django.utils.translation import trans_real
         from django.utils.translation import trans_real
         gettext._translations = {}
         gettext._translations = {}
         trans_real._translations = {}
         trans_real._translations = {}

+ 1 - 1
django/views/csrf.py

@@ -105,7 +105,7 @@ def csrf_failure(request, reason="", template_name=CSRF_FAILURE_TEMPLATE_NAME):
     """
     """
     Default view used when request fails CSRF protection
     Default view used when request fails CSRF protection
     """
     """
-    from django.middleware.csrf import REASON_NO_REFERER, REASON_NO_CSRF_COOKIE
+    from django.middleware.csrf import REASON_NO_CSRF_COOKIE, REASON_NO_REFERER
     c = {
     c = {
         'title': _("Forbidden"),
         'title': _("Forbidden"),
         'main': _("CSRF verification failed. Request aborted."),
         'main': _("CSRF verification failed. Request aborted."),

+ 1 - 1
docs/internals/contributing/writing-code/coding-style.txt

@@ -101,7 +101,7 @@ Imports
 
 
   .. console::
   .. console::
 
 
-      $ python -m pip install isort
+      $ python -m pip install isort >= 5.1.0
       $ isort -rc .
       $ isort -rc .
 
 
   This runs ``isort`` recursively from your current directory, modifying any
   This runs ``isort`` recursively from your current directory, modifying any

+ 1 - 1
docs/internals/contributing/writing-code/unit-tests.txt

@@ -80,7 +80,7 @@ version of Python. A list of default environments can be seen as follows:
     py3
     py3
     flake8
     flake8
     docs
     docs
-    isort
+    isort>=5.1.0
 
 
 Testing other Python versions and database backends
 Testing other Python versions and database backends
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ 1 - 0
tests/annotations/tests.py

@@ -26,6 +26,7 @@ def cxOracle_py3_bug(func):
     we mark them as expected failures until someone fixes them in #23843.
     we mark them as expected failures until someone fixes them in #23843.
     """
     """
     from unittest import expectedFailure
     from unittest import expectedFailure
+
     from django.db import connection
     from django.db import connection
     return expectedFailure(func) if connection.vendor == 'oracle' else func
     return expectedFailure(func) if connection.vendor == 'oracle' else func
 
 

+ 1 - 0
tests/backends/postgresql/test_creation.py

@@ -13,6 +13,7 @@ except ImportError:
     pass
     pass
 else:
 else:
     from psycopg2 import errorcodes
     from psycopg2 import errorcodes
+
     from django.db.backends.postgresql.creation import DatabaseCreation
     from django.db.backends.postgresql.creation import DatabaseCreation
 
 
 
 

+ 1 - 1
tests/backends/postgresql/tests.py

@@ -129,10 +129,10 @@ class Tests(TestCase):
             ISOLATION_LEVEL_READ_COMMITTED as read_committed,
             ISOLATION_LEVEL_READ_COMMITTED as read_committed,
             ISOLATION_LEVEL_SERIALIZABLE as serializable,
             ISOLATION_LEVEL_SERIALIZABLE as serializable,
         )
         )
+
         # Since this is a django.test.TestCase, a transaction is in progress
         # Since this is a django.test.TestCase, a transaction is in progress
         # and the isolation level isn't reported as 0. This test assumes that
         # and the isolation level isn't reported as 0. This test assumes that
         # PostgreSQL is configured with the default isolation level.
         # PostgreSQL is configured with the default isolation level.
-
         # Check the level on the psycopg2 connection, not the Django wrapper.
         # Check the level on the psycopg2 connection, not the Django wrapper.
         default_level = read_committed if psycopg2.__version__ < '2.7' else None
         default_level = read_committed if psycopg2.__version__ < '2.7' else None
         self.assertEqual(connection.connection.isolation_level, default_level)
         self.assertEqual(connection.connection.isolation_level, default_level)

+ 1 - 1
tests/gis_tests/geo3d/tests.py

@@ -142,7 +142,7 @@ class Geo3DTest(Geo3DLoadingHelper, TestCase):
         Testing LayerMapping on 3D models.
         Testing LayerMapping on 3D models.
         """
         """
         # Import here as GDAL is required for those imports
         # Import here as GDAL is required for those imports
-        from django.contrib.gis.utils import LayerMapping, LayerMapError
+        from django.contrib.gis.utils import LayerMapError, LayerMapping
 
 
         point_mapping = {'point': 'POINT'}
         point_mapping = {'point': 'POINT'}
         mpoint_mapping = {'mpoint': 'MULTIPOINT'}
         mpoint_mapping = {'mpoint': 'MULTIPOINT'}

+ 3 - 1
tests/gis_tests/rasterapp/test_rasterfield.py

@@ -143,7 +143,9 @@ class RasterFieldTest(TransactionTestCase):
         unprojected coordinate systems. This test just checks that the lookup
         unprojected coordinate systems. This test just checks that the lookup
         can be called, but doesn't check if the result makes logical sense.
         can be called, but doesn't check if the result makes logical sense.
         """
         """
-        from django.contrib.gis.db.backends.postgis.operations import PostGISOperations
+        from django.contrib.gis.db.backends.postgis.operations import (
+            PostGISOperations,
+        )
 
 
         # Create test raster and geom.
         # Create test raster and geom.
         rast = GDALRaster(json.loads(JSON_RASTER))
         rast = GDALRaster(json.loads(JSON_RASTER))

+ 3 - 1
tests/gis_tests/tests.py

@@ -4,7 +4,9 @@ from django.core.exceptions import ImproperlyConfigured
 from django.db import ProgrammingError
 from django.db import ProgrammingError
 
 
 try:
 try:
-    from django.contrib.gis.db.backends.postgis.operations import PostGISOperations
+    from django.contrib.gis.db.backends.postgis.operations import (
+        PostGISOperations,
+    )
     HAS_POSTGRES = True
     HAS_POSTGRES = True
 except ImportError:
 except ImportError:
     HAS_POSTGRES = False
     HAS_POSTGRES = False

+ 9 - 3
tests/gis_tests/utils.py

@@ -53,11 +53,17 @@ spatialite = _default_db == 'spatialite'
 gisfield_may_be_null = not mysql
 gisfield_may_be_null = not mysql
 
 
 if oracle and 'gis' in settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE']:
 if oracle and 'gis' in settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE']:
-    from django.contrib.gis.db.backends.oracle.models import OracleSpatialRefSys as SpatialRefSys
+    from django.contrib.gis.db.backends.oracle.models import (
+        OracleSpatialRefSys as SpatialRefSys,
+    )
 elif postgis:
 elif postgis:
-    from django.contrib.gis.db.backends.postgis.models import PostGISSpatialRefSys as SpatialRefSys
+    from django.contrib.gis.db.backends.postgis.models import (
+        PostGISSpatialRefSys as SpatialRefSys,
+    )
 elif spatialite:
 elif spatialite:
-    from django.contrib.gis.db.backends.spatialite.models import SpatialiteSpatialRefSys as SpatialRefSys
+    from django.contrib.gis.db.backends.spatialite.models import (
+        SpatialiteSpatialRefSys as SpatialRefSys,
+    )
 else:
 else:
     SpatialRefSys = None
     SpatialRefSys = None
 
 

+ 2 - 3
tests/model_fields/test_imagefield.py

@@ -15,10 +15,9 @@ except ImproperlyConfigured:
 
 
 if Image:
 if Image:
     from .models import (
     from .models import (
-        Person, PersonWithHeight, PersonWithHeightAndWidth,
-        PersonDimensionsFirst, PersonTwoImages, TestImageFieldFile,
+        Person, PersonDimensionsFirst, PersonTwoImages, PersonWithHeight,
+        PersonWithHeightAndWidth, TestImageFieldFile, temp_storage_dir,
     )
     )
-    from .models import temp_storage_dir
 else:
 else:
     # Pillow not available, create dummy classes (tests will be skipped anyway)
     # Pillow not available, create dummy classes (tests will be skipped anyway)
     class Person:
     class Person:

+ 1 - 1
tests/model_forms/tests.py

@@ -30,7 +30,7 @@ from .models import (
 )
 )
 
 
 if test_images:
 if test_images:
-    from .models import ImageFile, OptionalImageFile, NoExtensionImageFile
+    from .models import ImageFile, NoExtensionImageFile, OptionalImageFile
 
 
     class ImageFileForm(forms.ModelForm):
     class ImageFileForm(forms.ModelForm):
         class Meta:
         class Meta:

+ 1 - 0
tests/postgres_tests/test_apps.py

@@ -8,6 +8,7 @@ try:
     from psycopg2.extras import (
     from psycopg2.extras import (
         DateRange, DateTimeRange, DateTimeTZRange, NumericRange,
         DateRange, DateTimeRange, DateTimeTZRange, NumericRange,
     )
     )
+
     from django.contrib.postgres.fields import (
     from django.contrib.postgres.fields import (
         DateRangeField, DateTimeRangeField, IntegerRangeField,
         DateRangeField, DateTimeRangeField, IntegerRangeField,
     )
     )

+ 5 - 2
tests/postgres_tests/test_array.py

@@ -25,14 +25,17 @@ from .models import (
 )
 )
 
 
 try:
 try:
+    from psycopg2.extras import NumericRange
+
     from django.contrib.postgres.aggregates import ArrayAgg
     from django.contrib.postgres.aggregates import ArrayAgg
     from django.contrib.postgres.fields import ArrayField
     from django.contrib.postgres.fields import ArrayField
-    from django.contrib.postgres.fields.array import IndexTransform, SliceTransform
+    from django.contrib.postgres.fields.array import (
+        IndexTransform, SliceTransform,
+    )
     from django.contrib.postgres.forms import (
     from django.contrib.postgres.forms import (
         SimpleArrayField, SplitArrayField, SplitArrayWidget,
         SimpleArrayField, SplitArrayField, SplitArrayWidget,
     )
     )
     from django.db.backends.postgresql.base import PSYCOPG2_VERSION
     from django.db.backends.postgresql.base import PSYCOPG2_VERSION
-    from psycopg2.extras import NumericRange
 except ImportError:
 except ImportError:
     pass
     pass
 
 

+ 1 - 1
tests/postgres_tests/test_bulk_update.py

@@ -7,7 +7,7 @@ from .models import (
 )
 )
 
 
 try:
 try:
-    from psycopg2.extras import NumericRange, DateRange
+    from psycopg2.extras import DateRange, NumericRange
 except ImportError:
 except ImportError:
     pass  # psycopg2 isn't installed.
     pass  # psycopg2 isn't installed.
 
 

+ 5 - 3
tests/postgres_tests/test_constraints.py

@@ -14,10 +14,12 @@ from . import PostgreSQLTestCase
 from .models import HotelReservation, RangesModel, Room, Scene
 from .models import HotelReservation, RangesModel, Room, Scene
 
 
 try:
 try:
-    from django.contrib.postgres.constraints import ExclusionConstraint
-    from django.contrib.postgres.fields import DateTimeRangeField, RangeBoundary, RangeOperators
-
     from psycopg2.extras import DateRange, NumericRange
     from psycopg2.extras import DateRange, NumericRange
+
+    from django.contrib.postgres.constraints import ExclusionConstraint
+    from django.contrib.postgres.fields import (
+        DateTimeRangeField, RangeBoundary, RangeOperators,
+    )
 except ImportError:
 except ImportError:
     pass
     pass
 
 

+ 4 - 2
tests/postgres_tests/test_json_deprecation.py

@@ -1,7 +1,9 @@
 try:
 try:
-    from django.contrib.postgres.fields import JSONField
-    from django.contrib.postgres.fields.jsonb import KeyTransform, KeyTextTransform
     from django.contrib.postgres import forms
     from django.contrib.postgres import forms
+    from django.contrib.postgres.fields import JSONField
+    from django.contrib.postgres.fields.jsonb import (
+        KeyTextTransform, KeyTransform,
+    )
 except ImportError:
 except ImportError:
     pass
     pass
 
 

+ 1 - 1
tests/postgres_tests/test_operations.py

@@ -11,11 +11,11 @@ from django.test.utils import CaptureQueriesContext
 from . import PostgreSQLTestCase
 from . import PostgreSQLTestCase
 
 
 try:
 try:
+    from django.contrib.postgres.indexes import BrinIndex, BTreeIndex
     from django.contrib.postgres.operations import (
     from django.contrib.postgres.operations import (
         AddIndexConcurrently, BloomExtension, CreateExtension,
         AddIndexConcurrently, BloomExtension, CreateExtension,
         RemoveIndexConcurrently,
         RemoveIndexConcurrently,
     )
     )
-    from django.contrib.postgres.indexes import BrinIndex, BTreeIndex
 except ImportError:
 except ImportError:
     pass
     pass
 
 

+ 1 - 0
tests/postgres_tests/test_ranges.py

@@ -18,6 +18,7 @@ from .models import (
 
 
 try:
 try:
     from psycopg2.extras import DateRange, DateTimeTZRange, NumericRange
     from psycopg2.extras import DateRange, DateTimeTZRange, NumericRange
+
     from django.contrib.postgres import fields as pg_fields, forms as pg_forms
     from django.contrib.postgres import fields as pg_fields, forms as pg_forms
     from django.contrib.postgres.validators import (
     from django.contrib.postgres.validators import (
         RangeMaxValueValidator, RangeMinValueValidator,
         RangeMaxValueValidator, RangeMinValueValidator,

+ 3 - 1
tests/postgres_tests/test_trigram.py

@@ -4,7 +4,9 @@ from . import PostgreSQLTestCase
 from .models import CharFieldModel, TextFieldModel
 from .models import CharFieldModel, TextFieldModel
 
 
 try:
 try:
-    from django.contrib.postgres.search import TrigramDistance, TrigramSimilarity
+    from django.contrib.postgres.search import (
+        TrigramDistance, TrigramSimilarity,
+    )
 except ImportError:
 except ImportError:
     pass
     pass
 
 

+ 2 - 2
tox.ini

@@ -9,7 +9,7 @@ envlist =
     py3
     py3
     flake8
     flake8
     docs
     docs
-    isort
+    isort >= 5.1.0
 
 
 # Add environment to use the default python3 installation
 # Add environment to use the default python3 installation
 [testenv:py3]
 [testenv:py3]
@@ -55,7 +55,7 @@ basepython = python3
 usedevelop = false
 usedevelop = false
 deps = isort
 deps = isort
 changedir = {toxinidir}
 changedir = {toxinidir}
-commands = isort --recursive --check-only --diff django tests scripts
+commands = isort --check-only --diff django tests scripts
 
 
 [testenv:javascript]
 [testenv:javascript]
 usedevelop = false
 usedevelop = false