From 9f08d76f864ba904e0d77549114e56052f3b4ea7 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Wed, 16 Mar 2022 18:04:57 +0100 Subject: Geodata: form to create GIS import --- ishtar_common/forms_common.py | 95 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 87 insertions(+), 8 deletions(-) (limited to 'ishtar_common/forms_common.py') diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index af41e2fcf..ed59b6c85 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -27,7 +27,7 @@ import requests import shutil import tempfile from urllib.parse import urlparse, quote -from zipfile import ZipFile, BadZipFile +import zipfile from django import forms from django.conf import settings @@ -203,18 +203,21 @@ class BaseImportForm(BSForm, forms.ModelForm): ] self.fields["importer_type"].choices = [("", "--")] + [ (imp.pk, imp.name) - for imp in models.ImporterType.objects.filter(available=True) + for imp in models.ImporterType.objects.filter(available=True, + type=self.importer_type) ] + if "imported_images" in self.fields: + self.fields["imported_images"].validators = [file_size_validator] + self.fields["imported_file"].validators = [file_size_validator] - self.fields["imported_images"].validators = [file_size_validator] self._post_init() def clean(self): data = self.cleaned_data if ( - data.get("conservative_import", None) - and data.get("importer_type") - and not data.get("importer_type").unicity_keys + data.get("conservative_import", None) + and data.get("importer_type") + and not data.get("importer_type").unicity_keys ): raise forms.ValidationError( _( @@ -222,6 +225,35 @@ class BaseImportForm(BSForm, forms.ModelForm): "Conservative import is not possible." ) ) + return data + + +class NewImportForm(NewImportFormBase): + imported_images_link = forms.URLField( + label=_("Associated images (web link to a zip file)"), required=False + ) + + class Meta: + model = models.Import + fields = ( + "name", + "importer_type", + "imported_file", + "encoding", + "csv_sep", + "imported_images", + "imported_images_link", + "associated_group", + "conservative_import", + "skip_lines", + ) + + HEADERS = { + "name": FormHeader(_("Import (table)")), + } + + def clean(self): + data = super().clean() if data.get("imported_images_link", None) and data.get("imported_images", None): raise forms.ValidationError( _( @@ -232,9 +264,9 @@ class BaseImportForm(BSForm, forms.ModelForm): if data.get("imported_images"): try: images = data.get("imported_images") - zf = ZipFile(images) + zf = zipfile.ZipFile(images) zf.testzip() - except BadZipFile: + except zipfile.BadZipFile: raise forms.ValidationError( _("\"Associated images\" field must be a valid zip file.") ) @@ -289,6 +321,53 @@ class BaseImportForm(BSForm, forms.ModelForm): return item +class NewImportGISForm(NewImportFormBase): + error_css_class = "error" + required_css_class = "required" + importer_type = "gis" + + class Meta: + model = models.Import + fields = ( + "name", + "importer_type", + "imported_file", + "associated_group", + "skip_lines", + ) + + HEADERS = { + "name": FormHeader(_("Import (GIS)")), + } + + def clean_imported_file(self): + value = self.cleaned_data.get("imported_file", None) + if value: + try: + ext = value.name.lower().split(".")[-1] + assert ext in ("zip", "gpkg") + if ext == "zip": + zip_file = zipfile.ZipFile(value) + assert not zip_file.testzip() + has_correct_file = False + for name in zip_file.namelist(): + in_ext = name.lower().split(".")[-1] + if in_ext in ("shp", "gpkg"): + filename = name + has_correct_file = True + break + assert has_correct_file + except AssertionError: + raise forms.ValidationError( + _("GIS file must be a zip containing a ShapeFile or GeoPackage file.") + ) + return value + + def save(self, user, commit=True): + item = super(NewImportGISForm, self).save(commit) + return item + + class TargetKeyForm(forms.ModelForm): class Meta: model = models.TargetKey -- cgit v1.2.3