diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-08-23 22:15:09 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-12-12 12:23:18 +0100 |
commit | 4d6148a4ff633ab641a4dbecb78e0281c88bd1e6 (patch) | |
tree | 797a5dc84c8a736779b3566479337dec5a88c529 | |
parent | 14079cb2b15a6348bd35ad39a7551b731e9c03c9 (diff) | |
download | Ishtar-4d6148a4ff633ab641a4dbecb78e0281c88bd1e6.tar.bz2 Ishtar-4d6148a4ff633ab641a4dbecb78e0281c88bd1e6.zip |
Add geo buffer type: model, admin, forms
-rw-r--r-- | ishtar_common/admin.py | 3 | ||||
-rw-r--r-- | ishtar_common/forms_common.py | 21 | ||||
-rw-r--r-- | ishtar_common/migrations/0221_auto_20220823_1935.py | 93 | ||||
-rw-r--r-- | ishtar_common/models.py | 2 | ||||
-rw-r--r-- | ishtar_common/models_common.py | 19 |
5 files changed, 135 insertions, 3 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index 602cf23a7..76b585d69 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -1160,6 +1160,7 @@ general_models = [ models_common.GeoProviderType, models_common.GeoDataType, models_common.GeoOriginType, + models_common.GeoBufferType, ] for model in general_models: admin_site.register(model, GeneralTypeAdmin) @@ -2483,4 +2484,4 @@ class GeoVectorDataAdmin(admin.ModelAdmin): list_filter = ["origin", "data_type", "provider"] -admin_site.register(models_common.GeoVectorData, GeoVectorDataAdmin)
\ No newline at end of file +admin_site.register(models_common.GeoVectorData, GeoVectorDataAdmin) diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 822efadda..a24d2396e 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -2603,6 +2603,7 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType): "data_type": models.GeoDataType, "origin": models.GeoOriginType, "provider": models.GeoProviderType, + "buffer_type": models.GeoBufferType, } pk = forms.IntegerField(label="", required=False, widget=forms.HiddenInput) @@ -2631,12 +2632,16 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType): provider = widgets.ModelChoiceField( model=models.GeoProviderType, label=_("Provider"), choices=[], required=False ) + buffer_type = widgets.ModelChoiceField( + model=models.GeoBufferType, label=_("Buffer type"), choices=[], required=False + ) comment = forms.CharField(label=_("Comment"), widget=forms.Textarea, required=False) TYPES = [ FieldType("origin", models.GeoOriginType), FieldType("data_type", models.GeoDataType), FieldType("provider", models.GeoProviderType), + FieldType("buffer_type", models.GeoBufferType), ] class Meta: @@ -2649,6 +2654,7 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType): _("Related items"), collapse=True), "name": FormHeader(_("Meta-data")), "geo_field": FormHeader(_("Geography")), + "buffer": FormHeader(_("Buffer"), collapse=True), } OPTIONS_PERMISSIONS = [ # field name, permission, options @@ -2735,6 +2741,7 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType): def _get_base_geo_keys(self): geo_keys = [] + extra_geo = ["buffer", "buffer_type"] if self.geom_type == "coordinates": geo_keys = [ "x", "estimated_error_x", @@ -2767,7 +2774,7 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType): self.fields.pop(geo_field) if self.geom_type == "point_3d": geo_keys = list(geo_keys) + ["z"] - return geo_keys + return geo_keys + extra_geo def _get_instance_geo_keys(self, instance): # geo keys for an instanced item @@ -2814,6 +2821,18 @@ class GISForm(forms.ModelForm, CustomForm, ManageOldType): def clean(self): cleaned_data = self.cleaned_data + if cleaned_data.get("buffer", None) \ + and not cleaned_data.get("buffer_type", None): + raise forms.ValidationError( + _("If you set a buffer set a buffer type.") + ) + if cleaned_data.get("buffer_type", None) \ + and not cleaned_data.get("buffer", None): + raise forms.ValidationError( + _("If you set a buffer type set a buffer.") + ) + + if "x" not in self.geo_keys: # reverse... geo_value = cleaned_data[self.geo_keys[0]] diff --git a/ishtar_common/migrations/0221_auto_20220823_1935.py b/ishtar_common/migrations/0221_auto_20220823_1935.py new file mode 100644 index 000000000..f86961f05 --- /dev/null +++ b/ishtar_common/migrations/0221_auto_20220823_1935.py @@ -0,0 +1,93 @@ +# Generated by Django 2.2.24 on 2022-08-23 19:35 + +import django.contrib.gis.db.models.fields +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import ishtar_common.models_common +import re + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0220_auto_20220707_1633'), + ] + + operations = [ + migrations.CreateModel( + name='GeoBufferType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('label', models.TextField(verbose_name='Label')), + ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z'), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), + ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), + ('available', models.BooleanField(default=True, verbose_name='Available')), + ('order', models.IntegerField(default=10, verbose_name='Order')), + ], + options={ + 'verbose_name': 'Geographic - Buffer type', + 'verbose_name_plural': 'Geographic - Buffer types', + 'ordering': ('order', 'label'), + }, + bases=(ishtar_common.models_common.Cached, models.Model), + ), + migrations.AlterModelOptions( + name='jsondatafield', + options={'ordering': ['order', 'name'], 'verbose_name': 'Custom data - Field', 'verbose_name_plural': 'Custom data - Fields'}, + ), + migrations.AlterModelOptions( + name='jsondatasection', + options={'ordering': ['order', 'name'], 'verbose_name': 'Custom data - Menu', 'verbose_name_plural': 'Custom data - Menus'}, + ), + migrations.AddField( + model_name='geovectordata', + name='buffer', + field=models.FloatField(blank=True, null=True, verbose_name='Buffer'), + ), + migrations.AlterField( + model_name='apisearchmodel', + name='limit_query', + field=models.TextField(blank=True, help_text='Search query add to each request', null=True, verbose_name='Filter query'), + ), + migrations.AlterField( + model_name='geovectordata', + name='multi_line', + field=django.contrib.gis.db.models.fields.MultiLineStringField(blank=True, null=True, srid=4326, verbose_name='Multi lines'), + ), + migrations.AlterField( + model_name='geovectordata', + name='multi_polygon', + field=django.contrib.gis.db.models.fields.MultiPolygonField(blank=True, null=True, srid=4326, verbose_name='Multi polygons'), + ), + migrations.AlterField( + model_name='geovectordata', + name='origin', + field=models.ForeignKey(blank=True, help_text='For instance: topographical survey, georeferencing, ...', null=True, on_delete=django.db.models.deletion.PROTECT, to='ishtar_common.GeoOriginType', verbose_name='Origin'), + ), + migrations.AlterField( + model_name='import', + name='encoding', + field=models.CharField(choices=[('windows-1252', 'windows-1252'), ('ISO-8859-15', 'ISO-8859-15'), ('utf-8', 'utf-8')], default='utf-8', help_text='Only required for CSV file', max_length=15, verbose_name='Encoding'), + ), + migrations.AlterField( + model_name='import', + name='importer_type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.ImporterType', verbose_name='Importer type'), + ), + migrations.AlterField( + model_name='importertype', + name='is_main_geometry', + field=models.BooleanField(default=True, help_text='Only relevant for GIS files', verbose_name='Set as main geometry'), + ), + migrations.AlterField( + model_name='jsondatafield', + name='section', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='json_data_field', to='ishtar_common.JsonDataSection'), + ), + migrations.AddField( + model_name='geovectordata', + name='buffer_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.GeoBufferType'), + ), + ] diff --git a/ishtar_common/models.py b/ishtar_common/models.py index e7520ee95..4ccc1cc0f 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -149,6 +149,7 @@ from ishtar_common.models_common import ( GeoOriginType, GeoProviderType, GeoVectorData, + GeoBufferType, CompleteIdentifierItem, SearchVectorConfig, DocumentItem, @@ -210,6 +211,7 @@ __all__ = [ "GeoDataType", "GeoOriginType", "GeoProviderType", + "GeoBufferType", ] logger = logging.getLogger(__name__) diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index b2cb095e6..238bbeeac 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -2079,6 +2079,18 @@ class GeoProviderType(HierarchicalType): ) +class GeoBufferType(GeneralType): + order = models.IntegerField(_("Order"), default=10) + + class Meta: + verbose_name = _("Geographic - Buffer type") + verbose_name_plural = _("Geographic - Buffer types") + ordering = ( + "order", + "label", + ) + + GEOJSON_POINT_TPL = { "type": "FeatureCollection", "features": [ @@ -2115,6 +2127,12 @@ class GeoVectorData(Imported, OwnPerms): "related_items_archaeological_warehouse_container", ] + buffer = models.FloatField( + _("Buffer"), blank=True, null=True + ) + buffer_type = models.ForeignKey(GeoBufferType, blank=True, null=True, + on_delete=models.CASCADE) + need_update = models.BooleanField(_("Need update"), default=False) name = models.TextField(_("Name"), default="-") source_content_type = models.ForeignKey( ContentType, related_name="content_type_geovectordata", on_delete=models.CASCADE @@ -2177,7 +2195,6 @@ class GeoVectorData(Imported, OwnPerms): multi_points = models.MultiPointField(_("Multi points"), blank=True, null=True) multi_line = models.MultiLineStringField(_("Multi lines"), blank=True, null=True) multi_polygon = models.MultiPolygonField(_("Multi polygons"), blank=True, null=True) - need_update = models.BooleanField(_("Need update"), default=False) class Meta: verbose_name = _("Geographic - Vector data") |