1. from django.contrib.gis import admin
    
  2. from django.contrib.gis.geos import Point
    
  3. from django.test import SimpleTestCase, ignore_warnings, override_settings
    
  4. from django.utils.deprecation import RemovedInDjango50Warning
    
  5. 
    
  6. from .admin import UnmodifiableAdmin
    
  7. from .models import City, site
    
  8. 
    
  9. 
    
  10. @ignore_warnings(category=RemovedInDjango50Warning)
    
  11. @override_settings(ROOT_URLCONF="django.contrib.gis.tests.geoadmin.urls")
    
  12. class GeoAdminTest(SimpleTestCase):
    
  13.     def test_ensure_geographic_media(self):
    
  14.         geoadmin = site._registry[City]
    
  15.         admin_js = geoadmin.media.render_js()
    
  16.         self.assertTrue(any(geoadmin.openlayers_url in js for js in admin_js))
    
  17. 
    
  18.     def test_olmap_OSM_rendering(self):
    
  19.         delete_all_btn = (
    
  20.             '<a href="javascript:geodjango_point.clearFeatures()">Delete all Features'
    
  21.             "</a>"
    
  22.         )
    
  23.         original_geoadmin = site._registry[City]
    
  24.         params = original_geoadmin.get_map_widget(City._meta.get_field("point")).params
    
  25.         result = original_geoadmin.get_map_widget(
    
  26.             City._meta.get_field("point")
    
  27.         )().render("point", Point(-79.460734, 40.18476), params)
    
  28.         self.assertIn(
    
  29.             "geodjango_point.layers.base = "
    
  30.             'new OpenLayers.Layer.OSM("OpenStreetMap (Mapnik)");',
    
  31.             result,
    
  32.         )
    
  33. 
    
  34.         self.assertIn(delete_all_btn, result)
    
  35. 
    
  36.         site.unregister(City)
    
  37.         site.register(City, UnmodifiableAdmin)
    
  38.         try:
    
  39.             geoadmin = site._registry[City]
    
  40.             params = geoadmin.get_map_widget(City._meta.get_field("point")).params
    
  41.             result = geoadmin.get_map_widget(City._meta.get_field("point"))().render(
    
  42.                 "point", Point(-79.460734, 40.18476), params
    
  43.             )
    
  44. 
    
  45.             self.assertNotIn(delete_all_btn, result)
    
  46.         finally:
    
  47.             site.unregister(City)
    
  48.             site.register(City, original_geoadmin.__class__)
    
  49. 
    
  50.     def test_olmap_WMS_rendering(self):
    
  51.         geoadmin = admin.GeoModelAdmin(City, site)
    
  52.         result = geoadmin.get_map_widget(City._meta.get_field("point"))().render(
    
  53.             "point", Point(-79.460734, 40.18476)
    
  54.         )
    
  55.         self.assertIn(
    
  56.             'geodjango_point.layers.base = new OpenLayers.Layer.WMS("OpenLayers WMS", '
    
  57.             '"http://vmap0.tiles.osgeo.org/wms/vmap0", '
    
  58.             "{layers: 'basic', format: 'image/jpeg'});",
    
  59.             result,
    
  60.         )
    
  61. 
    
  62.     def test_olwidget_has_changed(self):
    
  63.         """
    
  64.         Changes are accurately noticed by OpenLayersWidget.
    
  65.         """
    
  66.         geoadmin = site._registry[City]
    
  67.         form = geoadmin.get_changelist_form(None)()
    
  68.         has_changed = form.fields["point"].has_changed
    
  69. 
    
  70.         initial = Point(13.4197458572965953, 52.5194108501149799, srid=4326)
    
  71.         data_same = "SRID=3857;POINT(1493879.2754093995 6894592.019687599)"
    
  72.         data_almost_same = "SRID=3857;POINT(1493879.2754093990 6894592.019687590)"
    
  73.         data_changed = "SRID=3857;POINT(1493884.0527237 6894593.8111804)"
    
  74. 
    
  75.         self.assertTrue(has_changed(None, data_changed))
    
  76.         self.assertTrue(has_changed(initial, ""))
    
  77.         self.assertFalse(has_changed(None, ""))
    
  78.         self.assertFalse(has_changed(initial, data_same))
    
  79.         self.assertFalse(has_changed(initial, data_almost_same))
    
  80.         self.assertTrue(has_changed(initial, data_changed))
    
  81. 
    
  82.     def test_olwidget_empty_string(self):
    
  83.         geoadmin = site._registry[City]
    
  84.         form = geoadmin.get_changelist_form(None)({"point": ""})
    
  85.         with self.assertNoLogs("django.contrib.gis", "ERROR"):
    
  86.             output = str(form["point"])
    
  87.         self.assertInHTML(
    
  88.             '<textarea id="id_point" class="vWKTField required" cols="150"'
    
  89.             ' rows="10" name="point"></textarea>',
    
  90.             output,
    
  91.         )
    
  92. 
    
  93.     def test_olwidget_invalid_string(self):
    
  94.         geoadmin = site._registry[City]
    
  95.         form = geoadmin.get_changelist_form(None)({"point": "INVALID()"})
    
  96.         with self.assertLogs("django.contrib.gis", "ERROR") as cm:
    
  97.             output = str(form["point"])
    
  98.         self.assertInHTML(
    
  99.             '<textarea id="id_point" class="vWKTField required" cols="150"'
    
  100.             ' rows="10" name="point"></textarea>',
    
  101.             output,
    
  102.         )
    
  103.         self.assertEqual(len(cm.records), 1)
    
  104.         self.assertEqual(
    
  105.             cm.records[0].getMessage(),
    
  106.             "Error creating geometry from value 'INVALID()' (String input "
    
  107.             "unrecognized as WKT EWKT, and HEXEWKB.)",
    
  108.         )
    
  109. 
    
  110. 
    
  111. class DeprecationTests(SimpleTestCase):
    
  112.     def test_warning(self):
    
  113.         class DeprecatedOSMGeoAdmin(admin.OSMGeoAdmin):
    
  114.             pass
    
  115. 
    
  116.         class DeprecatedGeoModelAdmin(admin.GeoModelAdmin):
    
  117.             pass
    
  118. 
    
  119.         msg = (
    
  120.             "django.contrib.gis.admin.GeoModelAdmin and OSMGeoAdmin are "
    
  121.             "deprecated in favor of django.contrib.admin.ModelAdmin and "
    
  122.             "django.contrib.gis.admin.GISModelAdmin."
    
  123.         )
    
  124.         with self.assertRaisesMessage(RemovedInDjango50Warning, msg):
    
  125.             DeprecatedOSMGeoAdmin(City, site)
    
  126.         with self.assertRaisesMessage(RemovedInDjango50Warning, msg):
    
  127.             DeprecatedGeoModelAdmin(City, site)
    
  128. 
    
  129.     def test_openlayerswidget_warning(self):
    
  130.         msg = "django.contrib.gis.admin.OpenLayersWidget is deprecated."
    
  131.         with self.assertRaisesMessage(RemovedInDjango50Warning, msg):
    
  132.             admin.OpenLayersWidget()