summaryrefslogtreecommitdiff
path: root/ishtar_common/views_api.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-07-22 10:52:02 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-10-15 19:32:59 +0200
commitc39a24a50e4b4c9acbd8c04537aab0e24ffe9781 (patch)
tree32df32b8d9d4a9a6eb5aa27ea7446486ad524357 /ishtar_common/views_api.py
parentd74d9c7e9f2da23c070ba15d8885c130956fd259 (diff)
downloadIshtar-c39a24a50e4b4c9acbd8c04537aab0e24ffe9781.tar.bz2
Ishtar-c39a24a50e4b4c9acbd8c04537aab0e24ffe9781.zip
✨ GIS API: import data from QGIS view
Diffstat (limited to 'ishtar_common/views_api.py')
-rw-r--r--ishtar_common/views_api.py51
1 files changed, 44 insertions, 7 deletions
diff --git a/ishtar_common/views_api.py b/ishtar_common/views_api.py
index a8d6b9648..1186b5fea 100644
--- a/ishtar_common/views_api.py
+++ b/ishtar_common/views_api.py
@@ -22,11 +22,11 @@ from django.http import Http404
from urllib.parse import unquote_plus
-from rest_framework import serializers
+from rest_framework import serializers, status
from rest_framework.response import Response
from ishtar_common.models_common import GeneralType
-from ishtar_common.models_imports import ImporterType
+from ishtar_common.models_imports import ImporterType, ImportChunk
from ishtar_common.rest import GISAPIView
from ishtar_common.views_item import get_item
@@ -77,13 +77,25 @@ class GISTypeAPI(GISAPIView):
return Response(serializer.data)
-class GISImportAPI(GISAPIView):
+class GISBaseImportView:
+ def get_importer(self, request, importer_slug, can_import=None):
+ user = request.user
+ q = ImporterType.q_qgis_importers(user.ishtaruser).filter(slug=importer_slug)
+ if can_import:
+ q = q.filter(is_import=True)
+ else:
+ q = q.filter(is_template=True)
+ if not user.ishtaruser or not q.count():
+ return
+ return q.all()[0]
+
+
+class GISExportAPI(GISBaseImportView, GISAPIView):
PAGE_LEN = 50
def get(self, request, importer_slug, page=1, format=None):
- user = self.request.user
- q = ImporterType.q_qgis_importers(user.ishtaruser).filter(slug=importer_slug)
- if not user.ishtaruser or not q.count():
+ importer = self.get_importer(request, importer_slug)
+ if not importer:
return Response([])
query = None
if request.GET and request.GET["query"]:
@@ -91,7 +103,7 @@ class GISImportAPI(GISAPIView):
dct = {"query": query, "length": self.PAGE_LEN}
if page > 1:
dct["start"] = (page - 1) * self.PAGE_LEN + 1
- importer = q.all()[0]
+
importer_class = importer.get_importer_class()
cols, col_names = importer.get_columns(importer_class=importer_class)
obj_name = importer_class.OBJECT_CLS.__name__.lower()
@@ -102,3 +114,28 @@ class GISImportAPI(GISAPIView):
col_types=importer.get_columns_types(),
**dct
)
+
+
+class ImportChunkSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = ImportChunk
+ exclude = []
+
+
+class GISImportAPI(GISBaseImportView, GISAPIView):
+ def post(self, request, importer_slug, format=None):
+ importer = self.get_importer(request, importer_slug, can_import=True)
+ if not importer:
+ return Response({"error": "Importer not found"},
+ status=status.HTTP_400_BAD_REQUEST)
+ data = {}
+ for k in request.data:
+ data[k] = request.data.get(k)
+ data["importer"] = importer.pk
+ data["user"] = request.user.ishtaruser.pk
+ serializer = ImportChunkSerializer(data=data)
+ if serializer.is_valid():
+ serializer.save()
+ chunk_slug = f"{importer_slug}-{data['send_datetime']}-{data['number']}"
+ return Response({"chunk": chunk_slug}, status=status.HTTP_201_CREATED)
+ return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)