diff options
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 |
commit | 9a380773f208abf5aec6bc7f000cce7e57d2cb8b (patch) | |
tree | 96c56c0c2d72cd8b3d3629cc2ea4895d2d2b5350 | |
parent | c39a24a50e4b4c9acbd8c04537aab0e24ffe9781 (diff) | |
download | Ishtar-9a380773f208abf5aec6bc7f000cce7e57d2cb8b.tar.bz2 Ishtar-9a380773f208abf5aec6bc7f000cce7e57d2cb8b.zip |
✨ GIS API: associate chunks to create an import
-rw-r--r-- | ishtar_common/models_imports.py | 45 | ||||
-rw-r--r-- | ishtar_common/views_api.py | 10 |
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) |