django-gisserver 2.0__tar.gz → 2.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. {django-gisserver-2.0 → django_gisserver-2.1.1}/CHANGES.md +30 -1
  2. {django-gisserver-2.0/django_gisserver.egg-info → django_gisserver-2.1.1}/PKG-INFO +36 -9
  3. {django-gisserver-2.0 → django_gisserver-2.1.1}/README.md +4 -3
  4. {django-gisserver-2.0 → django_gisserver-2.1.1/django_gisserver.egg-info}/PKG-INFO +36 -9
  5. {django-gisserver-2.0 → django_gisserver-2.1.1}/django_gisserver.egg-info/SOURCES.txt +2 -0
  6. {django-gisserver-2.0 → django_gisserver-2.1.1}/django_gisserver.egg-info/requires.txt +8 -1
  7. django_gisserver-2.1.1/gisserver/__init__.py +1 -0
  8. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/conf.py +23 -1
  9. django_gisserver-2.1.1/gisserver/crs.py +452 -0
  10. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/db.py +78 -6
  11. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/exceptions.py +106 -2
  12. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/extensions/functions.py +122 -28
  13. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/extensions/queries.py +15 -10
  14. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/features.py +46 -33
  15. django_gisserver-2.1.1/gisserver/geometries.py +111 -0
  16. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/management/commands/loadgeojson.py +41 -21
  17. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/operations/base.py +11 -7
  18. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/operations/wfs20.py +31 -93
  19. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/__init__.py +6 -2
  20. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/base.py +28 -13
  21. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/csv.py +18 -6
  22. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/geojson.py +7 -6
  23. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/gml32.py +86 -27
  24. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/results.py +25 -39
  25. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/utils.py +9 -2
  26. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/ast.py +177 -68
  27. django_gisserver-2.1.1/gisserver/parsers/fes20/__init__.py +100 -0
  28. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/fes20/expressions.py +97 -27
  29. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/fes20/filters.py +9 -6
  30. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/fes20/identifiers.py +27 -7
  31. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/fes20/lookups.py +8 -6
  32. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/fes20/operators.py +101 -49
  33. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/fes20/sorting.py +14 -6
  34. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/gml/__init__.py +10 -19
  35. django_gisserver-2.1.1/gisserver/parsers/gml/base.py +58 -0
  36. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/gml/geometries.py +54 -21
  37. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/ows/kvp.py +10 -2
  38. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/ows/requests.py +6 -4
  39. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/query.py +6 -2
  40. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/values.py +61 -4
  41. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/wfs20/__init__.py +2 -0
  42. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/wfs20/adhoc.py +28 -18
  43. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/wfs20/base.py +12 -7
  44. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/wfs20/projection.py +3 -3
  45. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/wfs20/requests.py +1 -0
  46. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/wfs20/stored.py +3 -2
  47. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/xml.py +12 -0
  48. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/projection.py +17 -7
  49. django_gisserver-2.1.1/gisserver/static/gisserver/index.css +36 -0
  50. django_gisserver-2.1.1/gisserver/templates/gisserver/base.html +15 -0
  51. django_gisserver-2.1.1/gisserver/templates/gisserver/index.html +20 -0
  52. django_gisserver-2.1.1/gisserver/templates/gisserver/service_description.html +22 -0
  53. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/templates/gisserver/wfs/feature_field.html +1 -1
  54. django_gisserver-2.1.1/gisserver/templates/gisserver/wfs/feature_type.html +54 -0
  55. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/types.py +152 -82
  56. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/views.py +47 -24
  57. {django-gisserver-2.0 → django_gisserver-2.1.1}/setup.py +10 -2
  58. django-gisserver-2.0/gisserver/__init__.py +0 -1
  59. django-gisserver-2.0/gisserver/geometries.py +0 -353
  60. django-gisserver-2.0/gisserver/parsers/fes20/__init__.py +0 -28
  61. django-gisserver-2.0/gisserver/parsers/gml/base.py +0 -40
  62. django-gisserver-2.0/gisserver/static/gisserver/index.css +0 -15
  63. django-gisserver-2.0/gisserver/templates/gisserver/index.html +0 -26
  64. django-gisserver-2.0/gisserver/templates/gisserver/service_description.html +0 -16
  65. django-gisserver-2.0/gisserver/templates/gisserver/wfs/feature_type.html +0 -23
  66. {django-gisserver-2.0 → django_gisserver-2.1.1}/LICENSE +0 -0
  67. {django-gisserver-2.0 → django_gisserver-2.1.1}/MANIFEST.in +0 -0
  68. {django-gisserver-2.0 → django_gisserver-2.1.1}/django_gisserver.egg-info/dependency_links.txt +0 -0
  69. {django-gisserver-2.0 → django_gisserver-2.1.1}/django_gisserver.egg-info/not-zip-safe +0 -0
  70. {django-gisserver-2.0 → django_gisserver-2.1.1}/django_gisserver.egg-info/top_level.txt +0 -0
  71. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/compat.py +0 -0
  72. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/extensions/__init__.py +0 -0
  73. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/management/__init__.py +0 -0
  74. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/management/commands/__init__.py +0 -0
  75. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/operations/__init__.py +0 -0
  76. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/iters.py +0 -0
  77. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/stored.py +0 -0
  78. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/output/xmlschema.py +0 -0
  79. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/__init__.py +0 -0
  80. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/parsers/ows/__init__.py +0 -0
  81. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/templates/gisserver/wfs/2.0.0/get_capabilities.xml +0 -0
  82. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/templatetags/__init__.py +0 -0
  83. {django-gisserver-2.0 → django_gisserver-2.1.1}/gisserver/templatetags/gisserver_tags.py +0 -0
  84. {django-gisserver-2.0 → django_gisserver-2.1.1}/pyproject.toml +0 -0
  85. {django-gisserver-2.0 → django_gisserver-2.1.1}/setup.cfg +0 -0
@@ -1,4 +1,33 @@
1
- # 2024-04-28 (2.0)
1
+ # 2025-06-06 (2.1.1)
2
+
3
+ * Fixed using legacy longitude/latitude rendering for `EPSG:4326` and `:http://www.opengis.net/gml/srs/epsg.xml#xxxx` SRS names.
4
+ * Improved styling for the default HTML page.
5
+
6
+ This increases interoperability with web-based clients and legacy libraries. GeoServer applies the same heuristic.
7
+ Clients that use the official OGC notations such as `urn:ogc:def:crs:EPSG::4326` and `http://www.opengis.net/def/crs/epsg/0/4326`
8
+ are not affected. If needed, this behavior can be disabled using `GISSERVER_FORCE_XY_EPSG_4326=False` and `GISSERVER_FORCE_XY_OLD_CRS=False`.
9
+
10
+
11
+ # 2025-05-29 (2.1)
12
+
13
+ * Added support for `ArrayField` field in CSV exports.
14
+ * Added support for `models.DurationField` for features.
15
+ * Added proper axis ordering handling.
16
+ * Changed built-in fes functions to match current GeoServer signatures.
17
+ * Improved error handling for invalid filter input (also fixes 500 errors).
18
+ * Improved error handling for database query errors during rendering.
19
+ * Improved error messages for unexpected tags in the XML body.
20
+ * Improved error handling for fes 1.0 arithmetic operators (e.g. typing: `date > 2020-01-01` in QGis).
21
+ * Improved HTML index page, make it easier to override and restyle.
22
+ * Improved documentation, added API documentation.
23
+ * Fixed axis ordering handling for `EPSG:4326` and other longitude/latitude CRS definitions.
24
+ * Fixed comparing to `NULL` when date/time input is invalid.
25
+ * Fixed filter comparisons for `<`, `<=`, `>`, `>=` when using a reversed "value < property" ordering.
26
+ * Fixed crash when receiving WFS 1.0 POST requests.
27
+ * Fixed building readthedocs.
28
+
29
+
30
+ # 2025-04-28 (2.0)
2
31
 
3
32
  * Added support for XML POST requests.
4
33
  * Added support for geometry elements on child nodes.
@@ -1,12 +1,11 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: django-gisserver
3
- Version: 2.0
3
+ Version: 2.1.1
4
4
  Summary: Django speaking WFS 2.0 (exposing GeoDjango model fields)
5
5
  Home-page: https://github.com/amsterdam/django-gisserver
6
6
  Author: Diederik van der Boor
7
7
  Author-email: opensource@edoburu.nl
8
8
  License: Mozilla Public License 2.0
9
- Platform: UNKNOWN
10
9
  Classifier: Development Status :: 5 - Production/Stable
11
10
  Classifier: Environment :: Web Environment
12
11
  Classifier: Intended Audience :: Developers
@@ -31,8 +30,37 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
31
30
  Requires: Django (>=3.2)
32
31
  Requires-Python: >=3.9
33
32
  Description-Content-Type: text/markdown
34
- Provides-Extra: tests
35
33
  License-File: LICENSE
34
+ Requires-Dist: Django>=3.2
35
+ Requires-Dist: defusedxml>=0.7.1
36
+ Requires-Dist: lru_dict>=1.1.7
37
+ Requires-Dist: orjson>=3.9.15
38
+ Requires-Dist: pyproj>=3.6.1
39
+ Provides-Extra: tests
40
+ Requires-Dist: django-environ>=0.4.5; extra == "tests"
41
+ Requires-Dist: psycopg2-binary>=2.8.4; extra == "tests"
42
+ Requires-Dist: lxml>=4.9.1; extra == "tests"
43
+ Requires-Dist: pytest>=6.2.3; extra == "tests"
44
+ Requires-Dist: pytest-django>=4.1.0; extra == "tests"
45
+ Requires-Dist: pytest-cov>=2.11.1; extra == "tests"
46
+ Provides-Extra: docs
47
+ Requires-Dist: Django~=5.0; extra == "docs"
48
+ Requires-Dist: sphinxcontrib-django>=2.5; extra == "docs"
49
+ Requires-Dist: myst-parser>=3.0.1; extra == "docs"
50
+ Requires-Dist: psycopg2-binary>=2.8.4; extra == "docs"
51
+ Dynamic: author
52
+ Dynamic: author-email
53
+ Dynamic: classifier
54
+ Dynamic: description
55
+ Dynamic: description-content-type
56
+ Dynamic: home-page
57
+ Dynamic: license
58
+ Dynamic: license-file
59
+ Dynamic: provides-extra
60
+ Dynamic: requires
61
+ Dynamic: requires-dist
62
+ Dynamic: requires-python
63
+ Dynamic: summary
36
64
 
37
65
  [![Documentation](https://readthedocs.org/projects/django-gisserver/badge/?version=latest)](https://django-gisserver.readthedocs.io/en/latest/?badge=latest)
38
66
  [![Actions](https://github.com/Amsterdam/django-gisserver/actions/workflows/tests.yaml/badge.svg?branch=main)](https://github.com/Amsterdam/django-gisserver/actions/workflows/tests.yaml)
@@ -100,12 +128,13 @@ class Restaurant(models.Model):
100
128
  Write a view that exposes this model as a WFS feature:
101
129
 
102
130
  ```python
131
+ from gisserver.crs import CRS, CRS84, WEB_MERCATOR
103
132
  from gisserver.features import FeatureType, ServiceDescription
104
- from gisserver.geometries import CRS, WGS84
105
133
  from gisserver.views import WFSView
106
134
  from .models import Restaurant
107
135
 
108
- RD_NEW = CRS.from_srid(28992)
136
+ # As example, the local coordinate system for The Netherlands
137
+ RD_NEW = CRS.from_string("urn:ogc:def:crs:EPSG::28992")
109
138
 
110
139
 
111
140
  class PlacesWFSView(WFSView):
@@ -128,7 +157,7 @@ class PlacesWFSView(WFSView):
128
157
  FeatureType(
129
158
  Restaurant.objects.all(),
130
159
  fields="__all__",
131
- other_crs=[RD_NEW]
160
+ other_crs=[RD_NEW, CRS84, WEB_MERCATOR]
132
161
  ),
133
162
  ]
134
163
  ```
@@ -166,5 +195,3 @@ software developed with public money is also publicly available.
166
195
 
167
196
  This package is initially developed by the City of Amsterdam, but the tools
168
197
  and concepts created in this project can be used in any city.
169
-
170
-
@@ -64,12 +64,13 @@ class Restaurant(models.Model):
64
64
  Write a view that exposes this model as a WFS feature:
65
65
 
66
66
  ```python
67
+ from gisserver.crs import CRS, CRS84, WEB_MERCATOR
67
68
  from gisserver.features import FeatureType, ServiceDescription
68
- from gisserver.geometries import CRS, WGS84
69
69
  from gisserver.views import WFSView
70
70
  from .models import Restaurant
71
71
 
72
- RD_NEW = CRS.from_srid(28992)
72
+ # As example, the local coordinate system for The Netherlands
73
+ RD_NEW = CRS.from_string("urn:ogc:def:crs:EPSG::28992")
73
74
 
74
75
 
75
76
  class PlacesWFSView(WFSView):
@@ -92,7 +93,7 @@ class PlacesWFSView(WFSView):
92
93
  FeatureType(
93
94
  Restaurant.objects.all(),
94
95
  fields="__all__",
95
- other_crs=[RD_NEW]
96
+ other_crs=[RD_NEW, CRS84, WEB_MERCATOR]
96
97
  ),
97
98
  ]
98
99
  ```
@@ -1,12 +1,11 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: django-gisserver
3
- Version: 2.0
3
+ Version: 2.1.1
4
4
  Summary: Django speaking WFS 2.0 (exposing GeoDjango model fields)
5
5
  Home-page: https://github.com/amsterdam/django-gisserver
6
6
  Author: Diederik van der Boor
7
7
  Author-email: opensource@edoburu.nl
8
8
  License: Mozilla Public License 2.0
9
- Platform: UNKNOWN
10
9
  Classifier: Development Status :: 5 - Production/Stable
11
10
  Classifier: Environment :: Web Environment
12
11
  Classifier: Intended Audience :: Developers
@@ -31,8 +30,37 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
31
30
  Requires: Django (>=3.2)
32
31
  Requires-Python: >=3.9
33
32
  Description-Content-Type: text/markdown
34
- Provides-Extra: tests
35
33
  License-File: LICENSE
34
+ Requires-Dist: Django>=3.2
35
+ Requires-Dist: defusedxml>=0.7.1
36
+ Requires-Dist: lru_dict>=1.1.7
37
+ Requires-Dist: orjson>=3.9.15
38
+ Requires-Dist: pyproj>=3.6.1
39
+ Provides-Extra: tests
40
+ Requires-Dist: django-environ>=0.4.5; extra == "tests"
41
+ Requires-Dist: psycopg2-binary>=2.8.4; extra == "tests"
42
+ Requires-Dist: lxml>=4.9.1; extra == "tests"
43
+ Requires-Dist: pytest>=6.2.3; extra == "tests"
44
+ Requires-Dist: pytest-django>=4.1.0; extra == "tests"
45
+ Requires-Dist: pytest-cov>=2.11.1; extra == "tests"
46
+ Provides-Extra: docs
47
+ Requires-Dist: Django~=5.0; extra == "docs"
48
+ Requires-Dist: sphinxcontrib-django>=2.5; extra == "docs"
49
+ Requires-Dist: myst-parser>=3.0.1; extra == "docs"
50
+ Requires-Dist: psycopg2-binary>=2.8.4; extra == "docs"
51
+ Dynamic: author
52
+ Dynamic: author-email
53
+ Dynamic: classifier
54
+ Dynamic: description
55
+ Dynamic: description-content-type
56
+ Dynamic: home-page
57
+ Dynamic: license
58
+ Dynamic: license-file
59
+ Dynamic: provides-extra
60
+ Dynamic: requires
61
+ Dynamic: requires-dist
62
+ Dynamic: requires-python
63
+ Dynamic: summary
36
64
 
37
65
  [![Documentation](https://readthedocs.org/projects/django-gisserver/badge/?version=latest)](https://django-gisserver.readthedocs.io/en/latest/?badge=latest)
38
66
  [![Actions](https://github.com/Amsterdam/django-gisserver/actions/workflows/tests.yaml/badge.svg?branch=main)](https://github.com/Amsterdam/django-gisserver/actions/workflows/tests.yaml)
@@ -100,12 +128,13 @@ class Restaurant(models.Model):
100
128
  Write a view that exposes this model as a WFS feature:
101
129
 
102
130
  ```python
131
+ from gisserver.crs import CRS, CRS84, WEB_MERCATOR
103
132
  from gisserver.features import FeatureType, ServiceDescription
104
- from gisserver.geometries import CRS, WGS84
105
133
  from gisserver.views import WFSView
106
134
  from .models import Restaurant
107
135
 
108
- RD_NEW = CRS.from_srid(28992)
136
+ # As example, the local coordinate system for The Netherlands
137
+ RD_NEW = CRS.from_string("urn:ogc:def:crs:EPSG::28992")
109
138
 
110
139
 
111
140
  class PlacesWFSView(WFSView):
@@ -128,7 +157,7 @@ class PlacesWFSView(WFSView):
128
157
  FeatureType(
129
158
  Restaurant.objects.all(),
130
159
  fields="__all__",
131
- other_crs=[RD_NEW]
160
+ other_crs=[RD_NEW, CRS84, WEB_MERCATOR]
132
161
  ),
133
162
  ]
134
163
  ```
@@ -166,5 +195,3 @@ software developed with public money is also publicly available.
166
195
 
167
196
  This package is initially developed by the City of Amsterdam, but the tools
168
197
  and concepts created in this project can be used in any city.
169
-
170
-
@@ -13,6 +13,7 @@ django_gisserver.egg-info/top_level.txt
13
13
  gisserver/__init__.py
14
14
  gisserver/compat.py
15
15
  gisserver/conf.py
16
+ gisserver/crs.py
16
17
  gisserver/db.py
17
18
  gisserver/exceptions.py
18
19
  gisserver/features.py
@@ -64,6 +65,7 @@ gisserver/parsers/wfs20/projection.py
64
65
  gisserver/parsers/wfs20/requests.py
65
66
  gisserver/parsers/wfs20/stored.py
66
67
  gisserver/static/gisserver/index.css
68
+ gisserver/templates/gisserver/base.html
67
69
  gisserver/templates/gisserver/index.html
68
70
  gisserver/templates/gisserver/service_description.html
69
71
  gisserver/templates/gisserver/wfs/feature_field.html
@@ -1,7 +1,14 @@
1
1
  Django>=3.2
2
- defusedxml>=0.6.0
2
+ defusedxml>=0.7.1
3
3
  lru_dict>=1.1.7
4
4
  orjson>=3.9.15
5
+ pyproj>=3.6.1
6
+
7
+ [docs]
8
+ Django~=5.0
9
+ sphinxcontrib-django>=2.5
10
+ myst-parser>=3.0.1
11
+ psycopg2-binary>=2.8.4
5
12
 
6
13
  [tests]
7
14
  django-environ>=0.4.5
@@ -0,0 +1 @@
1
+ __version__ = "2.1.1" # follows PEP440
@@ -4,6 +4,8 @@ from django.conf import settings
4
4
  from django.core.signals import setting_changed
5
5
  from django.dispatch import receiver
6
6
 
7
+ _originals = {}
8
+
7
9
  # -- feature flags
8
10
 
9
11
  # Configure whether the <ows:WGS84BoundingBox> should be included in GetCapabilities.
@@ -30,6 +32,17 @@ GISSERVER_COUNT_NUMBER_MATCHED = getattr(settings, "GISSERVER_COUNT_NUMBER_MATCH
30
32
 
31
33
  # -- output rendering
32
34
 
35
+ # Following https://docs.geoserver.org/stable/en/user/services/wfs/axis_order.html here:
36
+ # Whether the older EPSG:4326 notation (instead of the OGC recommended styles)
37
+ # should render in legacy longitude/latitude (x/y) ordering.
38
+ # This increases interoperability with legacy web clients,
39
+ # as others use urn:ogc:def:crs:EPSG::4326 or http://www.opengis.net/def/crs/epsg/0/4326.
40
+ GISSERVER_FORCE_XY_EPSG_4326 = getattr(settings, "GISSERVER_FORCE_XY_EPSG_4326", True)
41
+
42
+ # Whether the legacy CRS notation http://www.opengis.net/gml/srs/epsg.xml# should render in X/Y
43
+ GISSERVER_FORCE_XY_OLD_CRS = getattr(settings, "GISSERVER_FORCE_XY_OLD_CRS", True)
44
+
45
+ # Extra output formats for GetFeature (see documentation for details)
33
46
  GISSERVER_EXTRA_OUTPUT_FORMATS = getattr(settings, "GISSERVER_EXTRA_OUTPUT_FORMATS", {})
34
47
  GISSERVER_GET_FEATURE_OUTPUT_FORMATS = getattr(
35
48
  settings, "GISSERVER_GET_FEATURE_OUTPUT_FORMATS", {}
@@ -59,4 +72,13 @@ def _on_settings_change(setting, value, enter, **kwargs):
59
72
  if not setting.startswith("GISSERVER_"):
60
73
  return
61
74
 
62
- globals()[setting] = value
75
+ conf_module = globals()
76
+ if value is None and not enter:
77
+ # override_settings().disable() returns what the django settings module had.
78
+ # Revert to our defaults here instead.
79
+ value = _originals.get(setting)
80
+ else:
81
+ # Track defaults of this file for reverting to them
82
+ _originals.setdefault(setting, conf_module[setting])
83
+
84
+ conf_module[setting] = value