From 19dc964121e484e455d0dec6278ba48d58116c45 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 10:38:42 +0100 Subject: [PATCH 01/21] support python 3.12 --- .github/workflows/python-package.yml | 8 ++++++-- CHANGES.md | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index d02cef6d..a665f60a 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -38,9 +38,13 @@ jobs: needs: [lint] strategy: matrix: - python-version: ['3.8', '3.10'] - django-version: ['3.2.*', '4.2.*'] + python-version: ['3.8', '3.10', '3.12'] + django-version: ['3.2.*', '4.2.*', '5.0.*'] postgis-image: ['postgis/postgis:12-2.5'] + exclude: + - python-version: '3.8' + django-version: '5.0.*' + services: postgres: image: ${{ matrix.postgis-image }} diff --git a/CHANGES.md b/CHANGES.md index b36775fd..9b90a4da 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,8 @@ CHANGELOG --------------------------- * Works with fiona >= 1.9 +* Add support for django 5.0 +* Add support for python 3.12 0.7.3 (2023-04-17) From 8407ceb7e2e40d9c4365fa0139e0ed808c40ab0e Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 10:43:43 +0100 Subject: [PATCH 02/21] support python 3.12 --- .github/workflows/python-package.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index a665f60a..5bc86386 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -41,9 +41,9 @@ jobs: python-version: ['3.8', '3.10', '3.12'] django-version: ['3.2.*', '4.2.*', '5.0.*'] postgis-image: ['postgis/postgis:12-2.5'] - exclude: - - python-version: '3.8' - django-version: '5.0.*' + exclude: + - python-version: '3.8' + django-version: '5.0.*' services: postgres: From 23dfced7d2c8786b0359293f76a0dd67159fe34e Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 10:48:22 +0100 Subject: [PATCH 03/21] support python 3.12 --- test_geostore/test_app/admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test_geostore/test_app/admin.py b/test_geostore/test_app/admin.py index 3d7f6da2..440b8689 100644 --- a/test_geostore/test_app/admin.py +++ b/test_geostore/test_app/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from django.contrib.gis.admin import OSMGeoAdmin +from django.contrib.gis.admin import GISModelAdmin from geostore.models import Layer, Feature, LayerExtraGeom, FeatureExtraGeom, LayerRelation @@ -24,6 +24,6 @@ class FeatureExtraGeomInline(admin.TabularInline): @admin.register(Feature) -class FeatureAdmin(OSMGeoAdmin): +class FeatureAdmin(GISModelAdmin): list_filter = ('layer', ) inlines = [FeatureExtraGeomInline] From be1953b4fd613d74a86c6ef8a8112a357de1d71d Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 10:54:01 +0100 Subject: [PATCH 04/21] support python 3.12 --- test_geostore/test_app/admin.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test_geostore/test_app/admin.py b/test_geostore/test_app/admin.py index 440b8689..4b0c5129 100644 --- a/test_geostore/test_app/admin.py +++ b/test_geostore/test_app/admin.py @@ -1,5 +1,8 @@ from django.contrib import admin -from django.contrib.gis.admin import GISModelAdmin +try: + from django.contrib.gis.admin import GISModelAdmin +except ImportError: + from django.contrib.admin import OSMGeoAdmin as GISModelAdmin from geostore.models import Layer, Feature, LayerExtraGeom, FeatureExtraGeom, LayerRelation From 0db181e87ce03047d4ed11e42e04f8c396547d3a Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 12:16:38 +0100 Subject: [PATCH 05/21] squash migrations --- ..._squashed_0047_alter_feature_properties.py | 284 ++++++++++++++++++ 1 file changed, 284 insertions(+) create mode 100644 geostore/migrations/0100_squashed_0047_alter_feature_properties.py diff --git a/geostore/migrations/0100_squashed_0047_alter_feature_properties.py b/geostore/migrations/0100_squashed_0047_alter_feature_properties.py new file mode 100644 index 00000000..294cafaf --- /dev/null +++ b/geostore/migrations/0100_squashed_0047_alter_feature_properties.py @@ -0,0 +1,284 @@ +# Generated by Django 5.0.1 on 2024-01-12 11:12 + +import django.contrib.gis.db.models.fields +import django.contrib.postgres.indexes +import django.contrib.postgres.operations +import django.core.serializers.json +import django.db.migrations.operations.special +import django.db.models.deletion +import django.utils.timezone +import geostore +import geostore.validators +import uuid +from django.db import migrations, models + + +# Functions from the following migrations need manual copying. +# Move them and any dependencies into this file, then update the +# RunPython operations to refer to the local versions: +# geostore.migrations.0013_auto_20180919_1146 +# geostore.migrations.0027_layergroup + +class Migration(migrations.Migration): + replaces = [ + ('geostore', '0001_initial'), ('geostore', '0011_auto_20180711_0831'), + ('geostore', '0013_auto_20180919_1146'), ('geostore', '0014_auto_20180918_1210'), + ('geostore', '0015_auto_20181005_1302'), ('geostore', '0016_auto_20181120_1059'), + ('geostore', '0017_auto_20181114_0806'), ('geostore', '0018_auto_20190326_1049'), + ('geostore', '0018_auto_20190228_1655'), ('geostore', '0019_merge_20190329_1056'), + ('geostore', '0020_auto_20190401_1139'), ('geostore', '0021_auto_20190415_0945'), + ('geostore', '0022_auto_20190417_1610'), ('geostore', '0023_layer_type_geom'), + ('geostore', '0024_layer_geom_type'), ('geostore', '0025_auto_20190613_1341'), + ('geostore', '0026_auto_20190613_1529'), ('geostore', '0027_layergroup'), + ('geostore', '0028_remove_layer_group'), ('geostore', '0029_auto_20190926_0803'), + ('geostore', '0030_auto_20191007_1459'), ('geostore', '0031_layer_authorized_groups'), + ('geostore', '0032_auto_20191016_0844'), ('geostore', '0033_featureextrageom_layerextrageom'), + ('geostore', '0034_auto_20191209_0902'), ('geostore', '0035_layerextrageom_editable'), + ('geostore', '0036_auto_20200116_0926'), ('geostore', '0037_auto_20200127_1357'), + ('geostore', '0038_auto_20200128_1442'), ('geostore', '0039_auto_20200131_1758'), + ('geostore', '0037_auto_20200624_1440'), ('geostore', '0038_auto_20200625_1244'), + ('geostore', '0040_merge_20200625_1508'), ('geostore', '0041_auto_20200625_1515'), + ('geostore', '0042_layer_routable'), ('geostore', '0042_auto_20201015_1328'), + ('geostore', '0043_merge_20201023_1209'), ('geostore', '0044_auto_20201106_1638'), + ('geostore', '0045_auto_20210429_0818'), ('geostore', '0046_auto_20211013_1334'), + ('geostore', '0047_alter_feature_properties') + ] + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='Layer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('settings', models.JSONField(blank=True, default=dict)), + ('geom_type', models.IntegerField( + choices=[(0, 'Point'), (1, 'LineString'), (3, 'Polygon'), (4, 'MultiPoint'), (5, 'MultiLineString'), + (6, 'MultiPolygon'), (7, 'GeometryCollection')], null=True)), + ('routable', models.BooleanField(default=False, help_text='Used for make layer routable')), + ('name', models.CharField(default=uuid.uuid4, max_length=256, unique=True, verbose_name='Name')), + ('schema', + models.JSONField(blank=True, default=dict, validators=[geostore.validators.validate_json_schema], + verbose_name='Schema')), + ('authorized_groups', + models.ManyToManyField(blank=True, related_name='authorized_layers', to='auth.group', + verbose_name='Authorized groups')), + ], + options={ + 'ordering': ['id'], + 'permissions': (('can_manage_layers', 'Has all permissions on layers'), + ('can_export_layers', 'Is able to export layers'), + ('can_import_layers', 'Is able to import layers')), + }, + bases=(geostore.import_export.imports.LayerImportMixin, geostore.import_export.exports.LayerExportMixin, + models.Model), + ), + migrations.CreateModel( + name='Feature', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('source', models.IntegerField(blank=True, editable=False, help_text='Internal field used by pgRouting', + null=True)), + ('target', models.IntegerField(blank=True, editable=False, help_text='Internal field used by pgRouting', + null=True)), + ('geom', django.contrib.gis.db.models.fields.GeometryField(srid=4326)), + ('identifier', models.CharField(default=uuid.uuid4, max_length=255, verbose_name='Identifier')), + ('properties', + models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder, + verbose_name='Properties')), + ('layer', + models.ForeignKey(db_index=False, on_delete=django.db.models.deletion.PROTECT, related_name='features', + to='geostore.layer', verbose_name='Layer')), + ], + options={ + 'ordering': ['id'], + }, + ), + migrations.CreateModel( + name='LayerExtraGeom', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('settings', models.JSONField(blank=True, default=dict)), + ('geom_type', models.IntegerField( + choices=[(0, 'Point'), (1, 'LineString'), (3, 'Polygon'), (4, 'MultiPoint'), (5, 'MultiLineString'), + (6, 'MultiPolygon'), (7, 'GeometryCollection')], null=True)), + ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Order')), + ('slug', models.SlugField(editable=False)), + ('title', models.CharField(max_length=250, verbose_name='Title')), + ('editable', models.BooleanField(default=True, verbose_name='Editable')), + ('layer', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extra_geometries', + to='geostore.layer', verbose_name='Layer')), + ], + options={ + 'ordering': ('layer', 'order'), + }, + ), + migrations.CreateModel( + name='FeatureExtraGeom', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('geom', django.contrib.gis.db.models.fields.GeometryField(spatial_index=False, srid=4326)), + ('properties', models.JSONField(blank=True, default=dict, verbose_name='Properties')), + ('identifier', models.UUIDField(blank=True, default=uuid.uuid4, editable=False, null=True, + verbose_name='Identifier')), + ('feature', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extra_geometries', + to='geostore.feature', verbose_name='Feature')), + ('layer_extra_geom', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='features', + to='geostore.layerextrageom', verbose_name='Feature')), + ], + ), + migrations.CreateModel( + name='LayerGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('name', models.CharField(max_length=256, unique=True, verbose_name='Name')), + ('slug', models.SlugField(unique=True)), + ('layers', + models.ManyToManyField(related_name='layer_groups', to='geostore.layer', verbose_name='Layers')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='LayerRelation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=250)), + ('slug', models.SlugField(editable=False)), + ('relation_type', models.CharField(blank=True, choices=[(None, 'Manual'), ('intersects', 'Intersects'), + ('distance', 'Distance')], + default=(None, 'Manual'), max_length=25)), + ('settings', models.JSONField(blank=True, default=dict)), + ('exclude', models.JSONField(blank=True, default=dict, + help_text='qs exclude (ex: {"pk__in": [...], "identifier__in":[...]}')), + ('destination', + models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='relations_as_destination', + to='geostore.layer')), + ('origin', + models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='relations_as_origin', + to='geostore.layer')), + ], + options={ + 'ordering': ['id'], + }, + ), + migrations.CreateModel( + name='FeatureRelation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('properties', models.JSONField(blank=True, default=dict, verbose_name='Properties')), + ('destination', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relations_as_destination', + to='geostore.feature', verbose_name='Destination')), + ('origin', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='relations_as_origin', + to='geostore.feature', verbose_name='Origin')), + ('relation', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='related_features', + to='geostore.layerrelation', verbose_name='Relation')), + ], + options={ + 'ordering': ['id'], + }, + ), + migrations.AddIndex( + model_name='feature', + index=models.Index(fields=['layer'], name='geostore_fe_layer_i_71cad6_idx'), + ), + migrations.AddIndex( + model_name='feature', + index=models.Index(fields=['updated_at'], name='geostore_fe_updated_fcdc6b_idx'), + ), + migrations.AddIndex( + model_name='feature', + index=models.Index(fields=['updated_at', 'layer'], name='geostore_fe_updated_bdb823_idx'), + ), + migrations.AddIndex( + model_name='feature', + index=models.Index(fields=['layer', 'identifier'], name='geostore_fe_layer_i_141c81_idx'), + ), + migrations.AddIndex( + model_name='feature', + index=models.Index(fields=['id', 'layer'], name='geostore_fe_id_bb7476_idx'), + ), + migrations.AddIndex( + model_name='feature', + index=models.Index(fields=['source', 'layer'], name='geostore_fe_source_cdd710_idx'), + ), + migrations.AddIndex( + model_name='feature', + index=models.Index(fields=['target', 'layer'], name='geostore_fe_target_b00bb7_idx'), + ), + migrations.AddIndex( + model_name='feature', + index=models.Index(fields=['source', 'target', 'layer'], name='geostore_fe_source_155396_idx'), + ), + migrations.AddIndex( + model_name='feature', + index=django.contrib.postgres.indexes.GistIndex(fields=['layer', 'geom'], + name='geostore_fe_layer_i_c3168f_gist'), + ), + migrations.AddIndex( + model_name='feature', + index=django.contrib.postgres.indexes.GinIndex(fields=['properties'], name='properties_gin_index'), + ), + migrations.AddConstraint( + model_name='feature', + constraint=models.CheckConstraint(check=models.Q(('geom__isvalid', True)), name='geom_is_valid'), + ), + migrations.AddConstraint( + model_name='feature', + constraint=models.CheckConstraint(check=models.Q(('geom__isempty', False)), name='geom_is_empty'), + ), + migrations.AlterUniqueTogether( + name='layerextrageom', + unique_together={('layer', 'slug'), ('layer', 'title')}, + ), + migrations.AddIndex( + model_name='featureextrageom', + index=models.Index(fields=['layer_extra_geom', 'identifier'], name='geostore_fe_layer_e_aa3cea_idx'), + ), + migrations.AddIndex( + model_name='featureextrageom', + index=django.contrib.postgres.indexes.GistIndex(fields=['layer_extra_geom', 'geom'], + name='feg_geom_gist_index'), + ), + migrations.AddIndex( + model_name='featureextrageom', + index=django.contrib.postgres.indexes.GinIndex(fields=['properties'], name='feg_properties_gin_index'), + ), + migrations.AddConstraint( + model_name='featureextrageom', + constraint=models.CheckConstraint(check=models.Q(('geom__isvalid', True)), name='geom_extra_is_valid'), + ), + migrations.AddConstraint( + model_name='featureextrageom', + constraint=models.CheckConstraint(check=models.Q(('geom__isempty', False)), name='geom_extra_is_empty'), + ), + migrations.AlterUniqueTogether( + name='featureextrageom', + unique_together={('feature', 'layer_extra_geom')}, + ), + migrations.AlterUniqueTogether( + name='layerrelation', + unique_together={('name', 'origin')}, + ), + ] From c4633fe96c81b5e70c239f2fe97b72305616dd08 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 12:28:42 +0100 Subject: [PATCH 06/21] fix indexes --- ...eostore_fe_layer_i_c3168f_gist_and_more.py | 30 +++++++++++++++++++ ..._squashed_0047_alter_feature_properties.py | 8 ++--- geostore/models.py | 4 +-- 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 geostore/migrations/0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more.py diff --git a/geostore/migrations/0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more.py b/geostore/migrations/0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more.py new file mode 100644 index 00000000..a59c1503 --- /dev/null +++ b/geostore/migrations/0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more.py @@ -0,0 +1,30 @@ +# Generated by Django 5.0.1 on 2024-01-12 11:26 + +import django.contrib.postgres.indexes +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('geostore', '0047_alter_feature_properties'), + ] + + operations = [ + migrations.RemoveIndex( + model_name='feature', + name='geostore_fe_layer_i_c3168f_gist', + ), + migrations.RemoveIndex( + model_name='featureextrageom', + name='feg_geom_gist_index', + ), + migrations.AddIndex( + model_name='feature', + index=django.contrib.postgres.indexes.GistIndex(fields=['geom'], name='geostore_fe_geom_cff9a1_gist'), + ), + migrations.AddIndex( + model_name='featureextrageom', + index=django.contrib.postgres.indexes.GistIndex(fields=['geom'], name='feg_geom_gist_index'), + ), + ] diff --git a/geostore/migrations/0100_squashed_0047_alter_feature_properties.py b/geostore/migrations/0100_squashed_0047_alter_feature_properties.py index 294cafaf..900e29a9 100644 --- a/geostore/migrations/0100_squashed_0047_alter_feature_properties.py +++ b/geostore/migrations/0100_squashed_0047_alter_feature_properties.py @@ -41,7 +41,7 @@ class Migration(migrations.Migration): ('geostore', '0042_layer_routable'), ('geostore', '0042_auto_20201015_1328'), ('geostore', '0043_merge_20201023_1209'), ('geostore', '0044_auto_20201106_1638'), ('geostore', '0045_auto_20210429_0818'), ('geostore', '0046_auto_20211013_1334'), - ('geostore', '0047_alter_feature_properties') + ('geostore', '0047_alter_feature_properties'), ('geostore', '0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more') ] initial = True @@ -233,8 +233,8 @@ class Migration(migrations.Migration): ), migrations.AddIndex( model_name='feature', - index=django.contrib.postgres.indexes.GistIndex(fields=['layer', 'geom'], - name='geostore_fe_layer_i_c3168f_gist'), + index=django.contrib.postgres.indexes.GistIndex(fields=['geom'], + name='geostore_fe_geom_cff9a1_gist'), ), migrations.AddIndex( model_name='feature', @@ -258,7 +258,7 @@ class Migration(migrations.Migration): ), migrations.AddIndex( model_name='featureextrageom', - index=django.contrib.postgres.indexes.GistIndex(fields=['layer_extra_geom', 'geom'], + index=django.contrib.postgres.indexes.GistIndex(fields=['geom'], name='feg_geom_gist_index'), ), migrations.AddIndex( diff --git a/geostore/models.py b/geostore/models.py index 365bc8dd..df38bf3e 100644 --- a/geostore/models.py +++ b/geostore/models.py @@ -283,7 +283,7 @@ class Meta: models.Index(fields=['source', 'layer', ]), models.Index(fields=['target', 'layer', ]), models.Index(fields=['source', 'target', 'layer']), - GistIndex(fields=['layer', 'geom']), + GistIndex(fields=['geom']), GinIndex(name='properties_gin_index', fields=['properties']), ] constraints = [ @@ -410,7 +410,7 @@ class Meta: ) indexes = [ models.Index(fields=['layer_extra_geom', 'identifier']), - GistIndex(name='feg_geom_gist_index', fields=['layer_extra_geom', 'geom']), + GistIndex(name='feg_geom_gist_index', fields=['geom']), GinIndex(name='feg_properties_gin_index', fields=['properties']), ] constraints = [ From ad4edc7bd972a95d133f5d744a4547844f760bab Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 12:32:09 +0100 Subject: [PATCH 07/21] fix indexes --- test_geostore/test_app/admin.py | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 test_geostore/test_app/admin.py diff --git a/test_geostore/test_app/admin.py b/test_geostore/test_app/admin.py deleted file mode 100644 index 4b0c5129..00000000 --- a/test_geostore/test_app/admin.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.contrib import admin -try: - from django.contrib.gis.admin import GISModelAdmin -except ImportError: - from django.contrib.admin import OSMGeoAdmin as GISModelAdmin - -from geostore.models import Layer, Feature, LayerExtraGeom, FeatureExtraGeom, LayerRelation - - -class LayerExtraGeomInline(admin.TabularInline): - model = LayerExtraGeom - - -class LayerRelationInline(admin.TabularInline): - fk_name = 'origin' - model = LayerRelation - extra = 0 - - -@admin.register(Layer) -class LayerAdmin(admin.ModelAdmin): - inlines = [LayerExtraGeomInline, LayerRelationInline] - - -class FeatureExtraGeomInline(admin.TabularInline): - model = FeatureExtraGeom - - -@admin.register(Feature) -class FeatureAdmin(GISModelAdmin): - list_filter = ('layer', ) - inlines = [FeatureExtraGeomInline] From 8019222f26a6e835920e606f36f01bc98d05ffee Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 13:58:50 +0100 Subject: [PATCH 08/21] fix indexes --- .github/workflows/python-package.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 5bc86386..39c68923 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -34,7 +34,7 @@ jobs: build: runs-on: ubuntu-20.04 #TODO: Fix when github action do not show failed for the workflow with continue-on-error - #continue-on-error: ${{ matrix.experimental }} + continue-on-error: ${{ matrix.experimental }} needs: [lint] strategy: matrix: @@ -63,7 +63,7 @@ jobs: - name: Install dependencies run: | - sudo apt update && sudo apt-get -yq install libproj-dev binutils gdal-bin libgdal-dev + sudo apt-get -q update && sudo apt-get -yqq install libproj-dev binutils gdal-bin libgdal-dev python -m pip install --upgrade pip setuptools wheel pip install .[dev] -U if [[ ${{ matrix.django-version }} == dev ]]; then From 8b7572423bc170ccc09d9c95c960b2cd5d1bca5d Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 14:03:40 +0100 Subject: [PATCH 09/21] fix indexes --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 39c68923..0284f309 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -34,7 +34,7 @@ jobs: build: runs-on: ubuntu-20.04 #TODO: Fix when github action do not show failed for the workflow with continue-on-error - continue-on-error: ${{ matrix.experimental }} + continue-on-error: true needs: [lint] strategy: matrix: From 7db8fa1ffaf5464ddc1e464f1dd6976e23e8fb4c Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 14:07:11 +0100 Subject: [PATCH 10/21] fix datetime --- geostore/tests/test_views/test_async_exports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geostore/tests/test_views/test_async_exports.py b/geostore/tests/test_views/test_async_exports.py index dbaec908..731aa3d8 100644 --- a/geostore/tests/test_views/test_async_exports.py +++ b/geostore/tests/test_views/test_async_exports.py @@ -1,4 +1,5 @@ import json +from datetime import datetime from tempfile import TemporaryDirectory from unittest import mock, skipIf from xml.etree import ElementTree as ET @@ -8,7 +9,6 @@ from django.core.files.storage import default_storage from django.test import override_settings from django.urls import reverse -from django.utils.datetime_safe import datetime from rest_framework import status from rest_framework.test import APITestCase From 095fc91c39d4c498d277d977697453b3ee0656e8 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 14:13:49 +0100 Subject: [PATCH 11/21] fix test --- geostore/tests/test_models/test_relations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geostore/tests/test_models/test_relations.py b/geostore/tests/test_models/test_relations.py index df5f33dd..1be73d83 100644 --- a/geostore/tests/test_models/test_relations.py +++ b/geostore/tests/test_models/test_relations.py @@ -34,7 +34,7 @@ def test_sync_relations_intersects(self): [self.city_cover.pk]) # city cover should not be present after deletion intersect_relation.delete() - self.assertListEqual(list(self.trek.relations_as_origin.filter(relation=intersect_relation) + self.assertListEqual(list(self.trek.relations_as_origin.all() .values_list('destination__pk', flat=True)), []) From 30111276f8a8f55aa63c2ed2361286f59effca75 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 14:21:08 +0100 Subject: [PATCH 12/21] fix test --- geostore/tests/test_models/test_relations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geostore/tests/test_models/test_relations.py b/geostore/tests/test_models/test_relations.py index 1be73d83..ca08ff5f 100644 --- a/geostore/tests/test_models/test_relations.py +++ b/geostore/tests/test_models/test_relations.py @@ -52,7 +52,7 @@ def test_sync_relations_distance(self): [self.city_cover.pk]) # city cover should not be present after deletion distance_relation.delete() - self.assertListEqual(list(self.trek.relations_as_origin.filter(relation=distance_relation) + self.assertListEqual(list(self.trek.relations_as_origin.all() .values_list('destination__pk', flat=True)), []) From 4409951a26beb9eed8f95ce37d109412065f3788 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 14:39:55 +0100 Subject: [PATCH 13/21] fix test --- geostore/db/mixins.py | 2 +- ...eom_type_alter_layerextrageom_geom_type.py | 23 +++++++++++++++++++ ..._squashed_0047_alter_feature_properties.py | 12 ++++++---- 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 geostore/migrations/0049_alter_layer_geom_type_alter_layerextrageom_geom_type.py diff --git a/geostore/db/mixins.py b/geostore/db/mixins.py index abdadd27..be665e49 100644 --- a/geostore/db/mixins.py +++ b/geostore/db/mixins.py @@ -39,7 +39,7 @@ class LayerBasedModelMixin(BaseUpdatableModel): } } settings = JSONField(default=dict, blank=True) - geom_type = models.IntegerField(choices=GeometryTypes.choices(), null=True) + geom_type = models.IntegerField(choices=GeometryTypes.choices, null=True) @property def is_point(self): diff --git a/geostore/migrations/0049_alter_layer_geom_type_alter_layerextrageom_geom_type.py b/geostore/migrations/0049_alter_layer_geom_type_alter_layerextrageom_geom_type.py new file mode 100644 index 00000000..ce9108b6 --- /dev/null +++ b/geostore/migrations/0049_alter_layer_geom_type_alter_layerextrageom_geom_type.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0.1 on 2024-01-12 13:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('geostore', '0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='layer', + name='geom_type', + field=models.IntegerField(choices=[(0, 'Point'), (1, 'Linestring'), (3, 'Polygon'), (4, 'Multipoint'), (5, 'Multilinestring'), (6, 'Multipolygon'), (7, 'Geometrycollection')], null=True), + ), + migrations.AlterField( + model_name='layerextrageom', + name='geom_type', + field=models.IntegerField(choices=[(0, 'Point'), (1, 'Linestring'), (3, 'Polygon'), (4, 'Multipoint'), (5, 'Multilinestring'), (6, 'Multipolygon'), (7, 'Geometrycollection')], null=True), + ), + ] diff --git a/geostore/migrations/0100_squashed_0047_alter_feature_properties.py b/geostore/migrations/0100_squashed_0047_alter_feature_properties.py index 900e29a9..abb981b7 100644 --- a/geostore/migrations/0100_squashed_0047_alter_feature_properties.py +++ b/geostore/migrations/0100_squashed_0047_alter_feature_properties.py @@ -41,7 +41,9 @@ class Migration(migrations.Migration): ('geostore', '0042_layer_routable'), ('geostore', '0042_auto_20201015_1328'), ('geostore', '0043_merge_20201023_1209'), ('geostore', '0044_auto_20201106_1638'), ('geostore', '0045_auto_20210429_0818'), ('geostore', '0046_auto_20211013_1334'), - ('geostore', '0047_alter_feature_properties'), ('geostore', '0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more') + ('geostore', '0047_alter_feature_properties'), + ('geostore', '0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more'), + ('geostore', '0049_alter_layer_geom_type_alter_layerextrageom_geom_type') ] initial = True @@ -59,8 +61,8 @@ class Migration(migrations.Migration): ('updated_at', models.DateTimeField(auto_now=True)), ('settings', models.JSONField(blank=True, default=dict)), ('geom_type', models.IntegerField( - choices=[(0, 'Point'), (1, 'LineString'), (3, 'Polygon'), (4, 'MultiPoint'), (5, 'MultiLineString'), - (6, 'MultiPolygon'), (7, 'GeometryCollection')], null=True)), + choices=[(0, 'Point'), (1, 'Linestring'), (3, 'Polygon'), (4, 'Multipoint'), (5, 'Multilinestring'), + (6, 'Multipolygon'), (7, 'Geometrycollection')], null=True)), ('routable', models.BooleanField(default=False, help_text='Used for make layer routable')), ('name', models.CharField(default=uuid.uuid4, max_length=256, unique=True, verbose_name='Name')), ('schema', @@ -110,8 +112,8 @@ class Migration(migrations.Migration): ('updated_at', models.DateTimeField(auto_now=True)), ('settings', models.JSONField(blank=True, default=dict)), ('geom_type', models.IntegerField( - choices=[(0, 'Point'), (1, 'LineString'), (3, 'Polygon'), (4, 'MultiPoint'), (5, 'MultiLineString'), - (6, 'MultiPolygon'), (7, 'GeometryCollection')], null=True)), + choices=[(0, 'Point'), (1, 'Linestring'), (3, 'Polygon'), (4, 'Multipoint'), (5, 'Multilinestring'), + (6, 'Multipolygon'), (7, 'Geometrycollection')], null=True)), ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Order')), ('slug', models.SlugField(editable=False)), ('title', models.CharField(max_length=250, verbose_name='Title')), From a90eb16d37e4113d190c1a91911f8c30238a6850 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 14:44:02 +0100 Subject: [PATCH 14/21] fix test --- geostore/__init__.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/geostore/__init__.py b/geostore/__init__.py index 103d525c..636f326f 100644 --- a/geostore/__init__.py +++ b/geostore/__init__.py @@ -1,9 +1,11 @@ from enum import IntEnum +from django.db.models import IntegerChoices + default_app_config = 'geostore.apps.GeostoreConfig' -class GeometryTypes(IntEnum): +class GeometryTypes(IntegerChoices): Point = 0 LineString = 1 # LinearRing 2 @@ -13,16 +15,12 @@ class GeometryTypes(IntEnum): MultiPolygon = 6 GeometryCollection = 7 - @classmethod - def choices(cls): - return [(geom_type.value, str(geom_type).split('.')[-1]) for geom_type in cls] - @classmethod def shape_allowed_types(cls): """ Types allowed in shapefile export """ - excluded = [GeometryTypes.GeometryCollection] + excluded = [cls.GeometryCollection] return [geom_type for geom_type in cls if geom_type not in excluded] @classmethod From a40ecc9495e4f52754130b718888b044d7c8e775 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 14:51:20 +0100 Subject: [PATCH 15/21] fix test --- geostore/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/geostore/__init__.py b/geostore/__init__.py index 636f326f..a4f09a7a 100644 --- a/geostore/__init__.py +++ b/geostore/__init__.py @@ -1,5 +1,3 @@ -from enum import IntEnum - from django.db.models import IntegerChoices default_app_config = 'geostore.apps.GeostoreConfig' From fcdcf85e0dece4d4806d2030789cdd9dc6c36518 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 14:59:59 +0100 Subject: [PATCH 16/21] fix test --- geostore/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geostore/__init__.py b/geostore/__init__.py index a4f09a7a..a46ab8bc 100644 --- a/geostore/__init__.py +++ b/geostore/__init__.py @@ -26,4 +26,4 @@ def shape_allowed_type_names(cls): """ Name types allowed in shapefile export """ - return [str(geom_type).split('.')[-1] for geom_type in cls.shape_allowed_types()] + return [geom_type.label.split('.')[-1] for geom_type in cls.shape_allowed_types()] From cad7dc89ce36bf82a8e4b81605a6ef518f9d7089 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 15:04:02 +0100 Subject: [PATCH 17/21] fix test --- geostore/__init__.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/geostore/__init__.py b/geostore/__init__.py index a46ab8bc..97db2345 100644 --- a/geostore/__init__.py +++ b/geostore/__init__.py @@ -14,16 +14,9 @@ class GeometryTypes(IntegerChoices): GeometryCollection = 7 @classmethod - def shape_allowed_types(cls): + def shape_allowed_type_names(cls): """ Types allowed in shapefile export """ excluded = [cls.GeometryCollection] return [geom_type for geom_type in cls if geom_type not in excluded] - - @classmethod - def shape_allowed_type_names(cls): - """ - Name types allowed in shapefile export - """ - return [geom_type.label.split('.')[-1] for geom_type in cls.shape_allowed_types()] From bd68edaac76b9524b5fef01d1f63bc4218a226dd Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 15:10:13 +0100 Subject: [PATCH 18/21] fix test --- geostore/__init__.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/geostore/__init__.py b/geostore/__init__.py index 97db2345..3cadfcf0 100644 --- a/geostore/__init__.py +++ b/geostore/__init__.py @@ -4,19 +4,26 @@ class GeometryTypes(IntegerChoices): - Point = 0 - LineString = 1 + Point = 0, 'Point' + LineString = 1, 'LineString' # LinearRing 2 - Polygon = 3 - MultiPoint = 4 - MultiLineString = 5 - MultiPolygon = 6 - GeometryCollection = 7 + Polygon = 3, 'Polygon' + MultiPoint = 4, 'MultiPoint' + MultiLineString = 5, 'MultiLineString' + MultiPolygon = 6, 'MultiPolygon' + GeometryCollection = 7, 'GeometryCollection' @classmethod - def shape_allowed_type_names(cls): + def shape_allowed_types(cls): """ Types allowed in shapefile export """ - excluded = [cls.GeometryCollection] - return [geom_type for geom_type in cls if geom_type not in excluded] + return [cls.Point, cls.LineString, cls.Polygon, cls.MultiPoint, + cls.MultiLineString, cls.MultiPolygon] + + @classmethod + def shape_allowed_type_names(cls): + """ + Name types allowed in shapefile export + """ + return [geom_type.label for geom_type in cls.shape_allowed_types()] From c23503cff948336e37f0f19379a414d3c2d44121 Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 15:15:15 +0100 Subject: [PATCH 19/21] fix test --- geostore/db/mixins.py | 2 +- ...eom_type_alter_layerextrageom_geom_type.py | 23 ------------------- ..._squashed_0047_alter_feature_properties.py | 9 ++++---- 3 files changed, 5 insertions(+), 29 deletions(-) delete mode 100644 geostore/migrations/0049_alter_layer_geom_type_alter_layerextrageom_geom_type.py diff --git a/geostore/db/mixins.py b/geostore/db/mixins.py index be665e49..a72d44f1 100644 --- a/geostore/db/mixins.py +++ b/geostore/db/mixins.py @@ -39,7 +39,7 @@ class LayerBasedModelMixin(BaseUpdatableModel): } } settings = JSONField(default=dict, blank=True) - geom_type = models.IntegerField(choices=GeometryTypes.choices, null=True) + geom_type = models.IntegerField(choices=GeometryTypes, null=True) @property def is_point(self): diff --git a/geostore/migrations/0049_alter_layer_geom_type_alter_layerextrageom_geom_type.py b/geostore/migrations/0049_alter_layer_geom_type_alter_layerextrageom_geom_type.py deleted file mode 100644 index ce9108b6..00000000 --- a/geostore/migrations/0049_alter_layer_geom_type_alter_layerextrageom_geom_type.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.0.1 on 2024-01-12 13:35 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('geostore', '0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='layer', - name='geom_type', - field=models.IntegerField(choices=[(0, 'Point'), (1, 'Linestring'), (3, 'Polygon'), (4, 'Multipoint'), (5, 'Multilinestring'), (6, 'Multipolygon'), (7, 'Geometrycollection')], null=True), - ), - migrations.AlterField( - model_name='layerextrageom', - name='geom_type', - field=models.IntegerField(choices=[(0, 'Point'), (1, 'Linestring'), (3, 'Polygon'), (4, 'Multipoint'), (5, 'Multilinestring'), (6, 'Multipolygon'), (7, 'Geometrycollection')], null=True), - ), - ] diff --git a/geostore/migrations/0100_squashed_0047_alter_feature_properties.py b/geostore/migrations/0100_squashed_0047_alter_feature_properties.py index abb981b7..7bbc8d08 100644 --- a/geostore/migrations/0100_squashed_0047_alter_feature_properties.py +++ b/geostore/migrations/0100_squashed_0047_alter_feature_properties.py @@ -43,7 +43,6 @@ class Migration(migrations.Migration): ('geostore', '0045_auto_20210429_0818'), ('geostore', '0046_auto_20211013_1334'), ('geostore', '0047_alter_feature_properties'), ('geostore', '0048_remove_feature_geostore_fe_layer_i_c3168f_gist_and_more'), - ('geostore', '0049_alter_layer_geom_type_alter_layerextrageom_geom_type') ] initial = True @@ -61,8 +60,8 @@ class Migration(migrations.Migration): ('updated_at', models.DateTimeField(auto_now=True)), ('settings', models.JSONField(blank=True, default=dict)), ('geom_type', models.IntegerField( - choices=[(0, 'Point'), (1, 'Linestring'), (3, 'Polygon'), (4, 'Multipoint'), (5, 'Multilinestring'), - (6, 'Multipolygon'), (7, 'Geometrycollection')], null=True)), + choices=[(0, 'Point'), (1, 'LineString'), (3, 'Polygon'), (4, 'MultiPoint'), (5, 'MultiLineString'), + (6, 'MultiPolygon'), (7, 'GeometryCollection')], null=True)), ('routable', models.BooleanField(default=False, help_text='Used for make layer routable')), ('name', models.CharField(default=uuid.uuid4, max_length=256, unique=True, verbose_name='Name')), ('schema', @@ -112,8 +111,8 @@ class Migration(migrations.Migration): ('updated_at', models.DateTimeField(auto_now=True)), ('settings', models.JSONField(blank=True, default=dict)), ('geom_type', models.IntegerField( - choices=[(0, 'Point'), (1, 'Linestring'), (3, 'Polygon'), (4, 'Multipoint'), (5, 'Multilinestring'), - (6, 'Multipolygon'), (7, 'Geometrycollection')], null=True)), + choices=[(0, 'Point'), (1, 'LineString'), (3, 'Polygon'), (4, 'MultiPoint'), (5, 'MultiLineString'), + (6, 'MultiPolygon'), (7, 'GeometryCollection')], null=True)), ('order', models.PositiveSmallIntegerField(default=0, verbose_name='Order')), ('slug', models.SlugField(editable=False)), ('title', models.CharField(max_length=250, verbose_name='Title')), From fa0c815a7889817de933fbbcd4ee2c8579e898eb Mon Sep 17 00:00:00 2001 From: J-E Castagnede Date: Fri, 12 Jan 2024 15:17:59 +0100 Subject: [PATCH 20/21] fix test --- geostore/db/mixins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/geostore/db/mixins.py b/geostore/db/mixins.py index a72d44f1..be665e49 100644 --- a/geostore/db/mixins.py +++ b/geostore/db/mixins.py @@ -39,7 +39,7 @@ class LayerBasedModelMixin(BaseUpdatableModel): } } settings = JSONField(default=dict, blank=True) - geom_type = models.IntegerField(choices=GeometryTypes, null=True) + geom_type = models.IntegerField(choices=GeometryTypes.choices, null=True) @property def is_point(self): From 52b58ddac9f0132c6b711a9496faea2ecf771464 Mon Sep 17 00:00:00 2001 From: Jean-Etienne Castagnede Date: Fri, 12 Jan 2024 15:27:05 +0100 Subject: [PATCH 21/21] Update .github/workflows/python-package.yml --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 0284f309..48e05353 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -34,7 +34,7 @@ jobs: build: runs-on: ubuntu-20.04 #TODO: Fix when github action do not show failed for the workflow with continue-on-error - continue-on-error: true + # continue-on-error: true needs: [lint] strategy: matrix: