From b31a1500060ed5b67d2c102f478e5c439e2bfa2b Mon Sep 17 00:00:00 2001 From: Stefan Brand Date: Fri, 12 Feb 2021 13:52:23 +0100 Subject: [PATCH] Correctly build SQL string --- .../test_app/migrations/0003_feature_date.py | 18 +++++++++++++++++ test_vectortiles/test_app/models.py | 1 + test_vectortiles/test_app/views.py | 6 ++++++ test_vectortiles/urls.py | 2 ++ vectortiles/postgis/mixins.py | 5 +++-- vectortiles/tests/test_views.py | 20 +++++++++++++++++-- 6 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 test_vectortiles/test_app/migrations/0003_feature_date.py diff --git a/test_vectortiles/test_app/migrations/0003_feature_date.py b/test_vectortiles/test_app/migrations/0003_feature_date.py new file mode 100644 index 0000000..4431634 --- /dev/null +++ b/test_vectortiles/test_app/migrations/0003_feature_date.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.6 on 2021-02-12 12:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('test_app', '0002_auto_20201020_1615'), + ] + + operations = [ + migrations.AddField( + model_name='feature', + name='date', + field=models.DateField(null=True), + ), + ] diff --git a/test_vectortiles/test_app/models.py b/test_vectortiles/test_app/models.py index 91b8dd9..8082269 100644 --- a/test_vectortiles/test_app/models.py +++ b/test_vectortiles/test_app/models.py @@ -9,6 +9,7 @@ class Feature(models.Model): geom = models.GeometryField(srid=4326) name = models.CharField(max_length=250) layer = models.ForeignKey(Layer, on_delete=models.CASCADE, related_name='features') + date = models.DateField(null=True) class Meta: ordering = ('id', ) diff --git a/test_vectortiles/test_app/views.py b/test_vectortiles/test_app/views.py index 7dd1cb7..c9b02bf 100644 --- a/test_vectortiles/test_app/views.py +++ b/test_vectortiles/test_app/views.py @@ -38,6 +38,12 @@ class PostGISFeatureView(PostgisMVTView, ListView): vector_tile_fields = ('name', ) +class PostGISFeatureWithDateView(PostgisMVTView, ListView): + queryset = Feature.objects.filter(date="2020-07-07") + vector_tile_layer_name = "features" + vector_tile_fields = ('name', ) + + class PostGISLayerView(PostgisMVTView, DetailView): model = Layer vector_tile_fields = ('name', ) diff --git a/test_vectortiles/urls.py b/test_vectortiles/urls.py index 4c89c63..4fa87b7 100644 --- a/test_vectortiles/urls.py +++ b/test_vectortiles/urls.py @@ -24,6 +24,8 @@ # feature level path('features/postgis/tile///', views.PostGISFeatureView.as_view(), name="feature-postgis"), + path('features/postgis/tile/date///', views.PostGISFeatureWithDateView.as_view(), + name="feature-date-postgis"), path('features/postgis/tile/{z}/{x}/{y}', page_not_found, name="feature-postgis-pattern"), path('features/postgis/tilejson', views.PostGISTileJSONFeatureView.as_view(), diff --git a/vectortiles/postgis/mixins.py b/vectortiles/postgis/mixins.py index ec82cb4..2714c09 100644 --- a/vectortiles/postgis/mixins.py +++ b/vectortiles/postgis/mixins.py @@ -28,8 +28,9 @@ def get_tile(self, x, y, z, extent=4096, buffer=256, clip_geom=True): # keep values to include in tile (extra included_fields + geometry) features = features.values(*fields) # generate MVT + sql, params = features.query.sql_with_params() with connection.cursor() as cursor: - cursor.execute("SELECT ST_ASMVT(subquery.*, %s, %s, %s) FROM ({}) as subquery".format(features.query), - params=[self.get_vector_tile_layer_name(), extent, "geom_prepared"]) + cursor.execute("SELECT ST_ASMVT(subquery.*, %s, %s, %s) FROM ({}) as subquery".format(sql), + params=[self.get_vector_tile_layer_name(), extent, "geom_prepared", *params]) row = cursor.fetchone()[0] return row.tobytes() if row else None diff --git a/vectortiles/tests/test_views.py b/vectortiles/tests/test_views.py index e4a2b91..8f7118e 100644 --- a/vectortiles/tests/test_views.py +++ b/vectortiles/tests/test_views.py @@ -15,12 +15,14 @@ def setUpTestData(cls): Feature.objects.create( name="feat1", geom="POINT(0 0)", - layer=cls.layer + layer=cls.layer, + date="2020-07-07" ) Feature.objects.create( name="feat2", geom="LINESTRING(0 0, 1 1)", - layer=cls.layer + layer=cls.layer, + date="2020-08-08" ) @@ -91,6 +93,20 @@ def test_postgis_features(self): 'properties': {'name': 'feat2'}, 'id': 0, 'type': 2}] }}) + def test_postgis_features_with_filtered_date(self): + self.maxDiff = None + response = self.client.get(reverse('feature-date-postgis', args=(0, 0, 0))) + self.assertEqual(response.status_code, 200) + content = mapbox_vector_tile.decode(response.content) + self.assertDictEqual( + content, + {'features': { + 'extent': 4096, + 'version': 2, + 'features': [{'geometry': {'type': 'Point', 'coordinates': [2048, 2048]}, + 'properties': {'name': 'feat1'}, 'id': 0, 'type': 1}] + }}) + class VectorTileTileJSONTestCase(VectorTileBaseTest): def test_mapbox_layer(self):