From 970f5bf5035d8c99b0ff883f984b60cf531dddbe Mon Sep 17 00:00:00 2001
From: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Date: Wed, 16 Mar 2022 09:07:01 +0100
Subject: [PATCH] Fixed #33577 -- Confirmed support for GDAL 3.4.

---
 django/contrib/gis/gdal/libgdal.py        | 2 ++
 docs/ref/contrib/gis/install/geolibs.txt  | 9 +++++----
 tests/gis_tests/gdal_tests/test_raster.py | 9 +++++++--
 tests/gis_tests/inspectapp/tests.py       | 6 +++---
 4 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/django/contrib/gis/gdal/libgdal.py b/django/contrib/gis/gdal/libgdal.py
index 2cb8329451..96af333c3f 100644
--- a/django/contrib/gis/gdal/libgdal.py
+++ b/django/contrib/gis/gdal/libgdal.py
@@ -22,6 +22,7 @@ if lib_path:
 elif os.name == "nt":
     # Windows NT shared libraries
     lib_names = [
+        "gdal304",
         "gdal303",
         "gdal302",
         "gdal301",
@@ -35,6 +36,7 @@ elif os.name == "posix":
     lib_names = [
         "gdal",
         "GDAL",
+        "gdal3.4.0",
         "gdal3.3.0",
         "gdal3.2.0",
         "gdal3.1.0",
diff --git a/docs/ref/contrib/gis/install/geolibs.txt b/docs/ref/contrib/gis/install/geolibs.txt
index c7436d2dfc..0f70510bb2 100644
--- a/docs/ref/contrib/gis/install/geolibs.txt
+++ b/docs/ref/contrib/gis/install/geolibs.txt
@@ -5,16 +5,16 @@ Installing Geospatial libraries
 GeoDjango uses and/or provides interfaces for the following open source
 geospatial libraries:
 
-========================  ====================================  ================================  =================================
+========================  ====================================  ================================  ======================================
 Program                   Description                           Required                          Supported Versions
-========================  ====================================  ================================  =================================
+========================  ====================================  ================================  ======================================
 :doc:`GEOS <../geos>`     Geometry Engine Open Source           Yes                               3.10, 3.9, 3.8, 3.7, 3.6
 `PROJ`_                   Cartographic Projections library      Yes (PostgreSQL and SQLite only)  8.x, 7.x, 6.x, 5.x, 4.x
-:doc:`GDAL <../gdal>`     Geospatial Data Abstraction Library   Yes                               3.3, 3.2, 3.1, 3.0, 2.4, 2.3, 2.2
+:doc:`GDAL <../gdal>`     Geospatial Data Abstraction Library   Yes                               3.4, 3.3, 3.2, 3.1, 3.0, 2.4, 2.3, 2.2
 :doc:`GeoIP <../geoip2>`  IP-based geolocation library          No                                2
 `PostGIS`__               Spatial extensions for PostgreSQL     Yes (PostgreSQL only)             3.2, 3.1, 3.0, 2.5, 2.4
 `SpatiaLite`__            Spatial extensions for SQLite         Yes (SQLite only)                 5.0, 4.3
-========================  ====================================  ================================  =================================
+========================  ====================================  ================================  ======================================
 
 Note that older or more recent versions of these libraries *may* also work
 totally fine with GeoDjango. Your mileage may vary.
@@ -33,6 +33,7 @@ totally fine with GeoDjango. Your mileage may vary.
     GDAL 3.1.0 2020-05-07
     GDAL 3.2.0 2020-11-02
     GDAL 3.3.0 2021-05-03
+    GDAL 3.4.0 2021-11-04
     PostGIS 2.4.0 2017-09-30
     PostGIS 2.5.0 2018-09-23
     PostGIS 3.0.0 2019-10-20
diff --git a/tests/gis_tests/gdal_tests/test_raster.py b/tests/gis_tests/gdal_tests/test_raster.py
index fd59b57313..5185df2667 100644
--- a/tests/gis_tests/gdal_tests/test_raster.py
+++ b/tests/gis_tests/gdal_tests/test_raster.py
@@ -807,8 +807,13 @@ class GDALBandTests(SimpleTestCase):
         band = rs.bands[0]
 
         # Setting attributes in write mode raises exception in the _flush method
-        with self.assertRaises(GDALException):
-            setattr(band, "nodata_value", 10)
+        try:
+            with self.assertRaises(GDALException):
+                setattr(band, "nodata_value", 10)
+        finally:
+            pam_file = self.rs_path + ".aux.xml"
+            if os.path.isfile(pam_file):
+                os.remove(pam_file)
 
     def test_band_data_setters(self):
         # Create in-memory raster and get band
diff --git a/tests/gis_tests/inspectapp/tests.py b/tests/gis_tests/inspectapp/tests.py
index d9b3cf985f..6ff3a33fc4 100644
--- a/tests/gis_tests/inspectapp/tests.py
+++ b/tests/gis_tests/inspectapp/tests.py
@@ -143,8 +143,8 @@ class OGRInspectTest(SimpleTestCase):
 
         # The ordering of model fields might vary depending on several factors
         # (version of GDAL, etc.).
-        if connection.vendor == "sqlite":
-            # SpatiaLite introspection is somewhat lacking (#29461).
+        if connection.vendor == "sqlite" and GDAL_VERSION < (3, 4):
+            # SpatiaLite introspection is somewhat lacking on GDAL < 3.4 (#29461).
             self.assertIn("    f_decimal = models.CharField(max_length=0)", model_def)
         else:
             self.assertIn(
@@ -156,7 +156,7 @@ class OGRInspectTest(SimpleTestCase):
             # Probably a bug between GDAL and MariaDB on time fields.
             self.assertIn("    f_datetime = models.DateTimeField()", model_def)
             self.assertIn("    f_time = models.TimeField()", model_def)
-        if connection.vendor == "sqlite":
+        if connection.vendor == "sqlite" and GDAL_VERSION < (3, 4):
             self.assertIn("    f_float = models.CharField(max_length=0)", model_def)
         else:
             self.assertIn("    f_float = models.FloatField()", model_def)