From cf930cfd0699e6f5afb1f250c55192f6a0462c40 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 4 Nov 2021 16:32:47 +0100 Subject: [PATCH] maps: move properties from layer to cell (#57760) --- combo/apps/maps/forms.py | 1 - .../migrations/0017_auto_20211104_1559.py | 23 +++++++++++++ .../migrations/0018_auto_20211104_1559.py | 34 +++++++++++++++++++ .../migrations/0019_auto_20211104_1603.py | 17 ++++++++++ combo/apps/maps/models.py | 22 ++++++------ combo/apps/maps/views.py | 2 +- tests/test_maps_cells.py | 9 +++-- tests/test_maps_manager.py | 2 -- 8 files changed, 92 insertions(+), 18 deletions(-) create mode 100644 combo/apps/maps/migrations/0017_auto_20211104_1559.py create mode 100644 combo/apps/maps/migrations/0018_auto_20211104_1559.py create mode 100644 combo/apps/maps/migrations/0019_auto_20211104_1603.py diff --git a/combo/apps/maps/forms.py b/combo/apps/maps/forms.py index 45d8c877..707ebf47 100644 --- a/combo/apps/maps/forms.py +++ b/combo/apps/maps/forms.py @@ -66,7 +66,6 @@ class MapLayerForm(forms.ModelForm): 'icon_colour', 'cache_duration', 'include_user_identifier', - 'properties', 'geojson_query_parameter', 'geojson_accepts_circle_param', ] diff --git a/combo/apps/maps/migrations/0017_auto_20211104_1559.py b/combo/apps/maps/migrations/0017_auto_20211104_1559.py new file mode 100644 index 00000000..f0355ae6 --- /dev/null +++ b/combo/apps/maps/migrations/0017_auto_20211104_1559.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.19 on 2021-11-04 14:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('maps', '0016_auto_20210927_1945'), + ] + + operations = [ + migrations.AddField( + model_name='map', + name='properties', + field=models.CharField( + blank=True, + help_text='List of properties to include, separated by commas', + max_length=500, + verbose_name='Properties', + ), + ), + ] diff --git a/combo/apps/maps/migrations/0018_auto_20211104_1559.py b/combo/apps/maps/migrations/0018_auto_20211104_1559.py new file mode 100644 index 00000000..27e005c5 --- /dev/null +++ b/combo/apps/maps/migrations/0018_auto_20211104_1559.py @@ -0,0 +1,34 @@ +# Generated by Django 2.2.19 on 2021-11-04 14:59 + +from django.db import migrations + + +def populate_cell_properties(apps, schema_editor): + MapLayer = apps.get_model('maps', 'MapLayer') + Map = apps.get_model('maps', 'Map') + + for cell in Map.objects.all(): + properties = [layer.properties for layer in cell.layers.all() if layer.properties.strip()] + cell.properties = ','.join(properties) + cell.save() + + +def populate_layer_properties(apps, schema_editor): + MapLayer = apps.get_model('maps', 'MapLayer') + Map = apps.get_model('maps', 'Map') + + for cell in Map.objects.all(): + for layer in cell.layers.all(): + layer.properties = cell.properties + layer.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('maps', '0017_auto_20211104_1559'), + ] + + operations = [ + migrations.RunPython(populate_cell_properties, populate_layer_properties), + ] diff --git a/combo/apps/maps/migrations/0019_auto_20211104_1603.py b/combo/apps/maps/migrations/0019_auto_20211104_1603.py new file mode 100644 index 00000000..c4f86bb9 --- /dev/null +++ b/combo/apps/maps/migrations/0019_auto_20211104_1603.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.19 on 2021-11-04 15:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('maps', '0018_auto_20211104_1559'), + ] + + operations = [ + migrations.RemoveField( + model_name='maplayer', + name='properties', + ), + ] diff --git a/combo/apps/maps/models.py b/combo/apps/maps/models.py index dde62eca..6b38866e 100644 --- a/combo/apps/maps/models.py +++ b/combo/apps/maps/models.py @@ -129,12 +129,6 @@ class MapLayer(models.Model): icon_colour = models.CharField(_('Icon colour'), max_length=7, default='#000000') cache_duration = models.PositiveIntegerField(_('Cache duration'), default=60, help_text=_('In seconds.')) include_user_identifier = models.BooleanField(_('Include user identifier in request'), default=True) - properties = models.CharField( - _('Properties'), - max_length=500, - blank=True, - help_text=_('List of properties to include, separated by commas'), - ) geojson_query_parameter = models.CharField( _("Query parameter for fulltext requests"), max_length=100, @@ -195,7 +189,7 @@ class MapLayer(models.Model): layer = next(serializers.deserialize('json', json.dumps([json_layer]), ignorenonexistent=True)) layer.save() - def get_geojson(self, request): + def get_geojson(self, request, properties=''): geojson_url = get_templated_url(self.geojson_url) query_parameter = self.geojson_query_parameter @@ -252,9 +246,8 @@ class MapLayer(models.Model): else: features = data - properties = [] - if self.properties: - properties = [x.strip() for x in self.properties.split(',')] + properties = [x.strip() for x in properties.split(',') if x.strip()] + if properties: for feature in features: if 'display_fields' in feature['properties']: # w.c.s. content, filter fields on varnames @@ -375,6 +368,12 @@ class Map(CellBase): _('Marker behaviour on click'), max_length=32, default='none', choices=MARKER_BEHAVIOUR_ONCLICK ) layers = models.ManyToManyField(MapLayer, through='MapLayerOptions', verbose_name=_('Layers'), blank=True) + properties = models.CharField( + _('Properties'), + max_length=500, + blank=True, + help_text=_('List of properties to include, separated by commas'), + ) default_template_name = 'maps/map_cell.html' manager_form_template = 'maps/map_cell_form.html' @@ -407,6 +406,7 @@ class Map(CellBase): 'max_zoom', 'group_markers', 'marker_behaviour_onclick', + 'properties', ) return forms.models.modelform_factory(self.__class__, fields=fields) @@ -464,7 +464,7 @@ class Map(CellBase): 'icon': l.icon, 'icon_colour': l.icon_colour, 'marker_colour': l.marker_colour, - 'properties': [x.strip() for x in l.properties.split(',')], + 'properties': [x.strip() for x in self.properties.split(',')], } for l in self.layers.filter(kind='geojson') ] diff --git a/combo/apps/maps/views.py b/combo/apps/maps/views.py index 865a3ad5..75d2c28d 100644 --- a/combo/apps/maps/views.py +++ b/combo/apps/maps/views.py @@ -29,6 +29,6 @@ class GeojsonView(View): layer = get_object_or_404(cell.layers.all(), kind='geojson', slug=kwargs['layer_slug']) if not cell.page.is_visible(request.user) or not cell.is_visible(user=request.user): return HttpResponseForbidden() - geojson = layer.get_geojson(request) + geojson = layer.get_geojson(request, cell.properties) content_type = 'application/json' return HttpResponse(json.dumps(geojson), content_type=content_type) diff --git a/tests/test_maps_cells.py b/tests/test_maps_cells.py index fce9c674..5276e135 100644 --- a/tests/test_maps_cells.py +++ b/tests/test_maps_cells.py @@ -596,8 +596,9 @@ def test_get_geojson_properties(app, layer, user): with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get: layer.geojson_url = 'http://example.org/geojson?t2' - layer.properties = 'name, hop' layer.save() + cell.properties = 'name, hop' + cell.save() requests_get.return_value = mock.Mock( content=SAMPLE_GEOJSON_CONTENT, json=lambda: json.loads(SAMPLE_GEOJSON_CONTENT), status_code=200 ) @@ -608,8 +609,9 @@ def test_get_geojson_properties(app, layer, user): with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get: layer.geojson_url = 'http://example.org/geojson?t3' - layer.properties = '' layer.save() + cell.properties = '' + cell.save() requests_get.return_value = mock.Mock( content=SAMPLE_WCS_GEOJSON_CONTENT, json=lambda: json.loads(SAMPLE_WCS_GEOJSON_CONTENT), @@ -621,8 +623,9 @@ def test_get_geojson_properties(app, layer, user): with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as requests_get: layer.geojson_url = 'http://example.org/geojson?t4' - layer.properties = 'id' layer.save() + cell.properties = 'id' + cell.save() requests_get.return_value = mock.Mock( content=SAMPLE_WCS_GEOJSON_CONTENT, json=lambda: json.loads(SAMPLE_WCS_GEOJSON_CONTENT), diff --git a/tests/test_maps_manager.py b/tests/test_maps_manager.py index a8046f0d..22d4581a 100644 --- a/tests/test_maps_manager.py +++ b/tests/test_maps_manager.py @@ -88,7 +88,6 @@ def test_add_tiles_layer(app, admin_user): assert 'marker_colour' not in resp.context['form'].fields assert 'icon' not in resp.context['form'].fields assert 'icon_colour' not in resp.context['form'].fields - assert 'properties' not in resp.context['form'].fields assert 'geojson_query_parameter' not in resp.context['form'].fields assert 'geojson_accepts_circle_param' not in resp.context['form'].fields resp.forms[0]['label'] = 'Test' @@ -150,7 +149,6 @@ def test_edit_tiles_layer(app, admin_user, tiles_layer): assert 'marker_colour' not in resp.context['form'] assert 'icon' not in resp.context['form'] assert 'icon_colour' not in resp.context['form'] - assert 'properties' not in resp.context['form'] resp.forms[0]['tiles_default'] = False resp = resp.forms[0].submit() assert resp.location.endswith('/manage/maps/') -- 2.30.2