summaryrefslogtreecommitdiff
path: root/ishtar_common/forms_common.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r--ishtar_common/forms_common.py95
1 files changed, 87 insertions, 8 deletions
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