diff options
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 |
commit | c39a24a50e4b4c9acbd8c04537aab0e24ffe9781 (patch) | |
tree | 32df32b8d9d4a9a6eb5aa27ea7446486ad524357 /ishtar_common/views_api.py | |
parent | d74d9c7e9f2da23c070ba15d8885c130956fd259 (diff) | |
download | Ishtar-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.py | 51 |
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) |