diff options
-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) |