summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-07-29 18:08:17 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-10-15 19:32:59 +0200
commit9a380773f208abf5aec6bc7f000cce7e57d2cb8b (patch)
tree96c56c0c2d72cd8b3d3629cc2ea4895d2d2b5350 /ishtar_common
parentc39a24a50e4b4c9acbd8c04537aab0e24ffe9781 (diff)
downloadIshtar-9a380773f208abf5aec6bc7f000cce7e57d2cb8b.tar.bz2
Ishtar-9a380773f208abf5aec6bc7f000cce7e57d2cb8b.zip
✨ GIS API: associate chunks to create an import
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/models_imports.py45
-rw-r--r--ishtar_common/views_api.py10
2 files changed, 53 insertions, 2 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index 1d59ccde0..7d2d1d623 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -1468,6 +1468,51 @@ class ImportChunk(models.Model):
for chunk in list(q.all()):
q.delete()
+ def is_complete(self):
+ base_q = self.__class__.objects.filter(importer=self.importer, user=self.user,
+ send_datetime=self.send_datetime)
+ chunks = []
+ for idx in range(self.total):
+ q = base_q.filter(number=idx + 1)
+ if not q.count():
+ return False
+ chunks.append(q.all()[0])
+ return chunks
+
+ def create_import(self, chunks):
+ contents = []
+ for chunk in chunks:
+ try:
+ contents += json.loads(chunk.chunk)["features"]
+ except (json.JSONDecodeError, KeyError):
+ return False
+ with tempfile.TemporaryDirectory() as tmp_dir_name:
+ filename = f"{tmp_dir_name}/import.csv"
+ with open(filename, "w") as tf:
+ w = csv.writer(tf)
+ w.writerow(self.importer.get_columns()[1])
+ for content in contents:
+ w.writerow(content)
+ with open(filename, "r") as tf:
+ return Import.objects.create(
+ importer_type=self.importer,
+ user=self.user,
+ name=str(_("Import from QGIS")),
+ imported_file=ContentFile(
+ tf.read(),
+ name=f"import-{self.send_datetime.strftime('%Y-%m-%d-%H%M')}.csv")
+ )
+
+ def associate_chunks(self):
+ chunks = self.is_complete()
+ if not chunks:
+ return
+ new_import = self.create_import(chunks)
+ # delete all chunks - import creation has succeded or data is corrupted
+ for chunk in chunks:
+ chunk.delete()
+ return new_import
+
IMPORT_GEOMETRY = {
"Point": "point_2d",
diff --git a/ishtar_common/views_api.py b/ishtar_common/views_api.py
index 1186b5fea..14cf6b43c 100644
--- a/ishtar_common/views_api.py
+++ b/ishtar_common/views_api.py
@@ -19,6 +19,7 @@
from django.apps import apps
from django.http import Http404
+import html
from urllib.parse import unquote_plus
@@ -133,9 +134,14 @@ class GISImportAPI(GISBaseImportView, GISAPIView):
data[k] = request.data.get(k)
data["importer"] = importer.pk
data["user"] = request.user.ishtaruser.pk
+ data["chunk"] = html.unescape(data["chunk"])
serializer = ImportChunkSerializer(data=data)
if serializer.is_valid():
- serializer.save()
+ chunk = serializer.save()
+ new_import = chunk.associate_chunks()
chunk_slug = f"{importer_slug}-{data['send_datetime']}-{data['number']}"
- return Response({"chunk": chunk_slug}, status=status.HTTP_201_CREATED)
+ return Response(
+ {"chunk": chunk_slug, "import": new_import.id if new_import else None},
+ status=status.HTTP_201_CREATED
+ )
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)