diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-07-22 10:52:02 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-07-22 10:52:02 +0200 |
commit | da30e4a7383e769e9838b198bb431f237d56694c (patch) | |
tree | b1422c165a2073e97f3d5406e1efc24b2a959bfd | |
parent | 53b1329634970640c3959a797ed21108466fc8e7 (diff) | |
download | Ishtar-da30e4a7383e769e9838b198bb431f237d56694c.tar.bz2 Ishtar-da30e4a7383e769e9838b198bb431f237d56694c.zip |
✨ GIS API: import data from QGIS view
-rw-r--r-- | ishtar_common/urls.py | 9 | ||||
-rw-r--r-- | ishtar_common/views_api.py | 45 |
2 files changed, 45 insertions, 9 deletions
diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index f062700e4..3d00ea915 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -377,9 +377,14 @@ urlpatterns = [ name="api-gis-sources", ), path( - "api/gis/import/<slug:importer_slug>/<int:page>/", + "api/gis/export/<slug:importer_slug>/<int:page>/", + views_api.GISExportAPI.as_view(), + name="api-gis-export", + ), + path( + "api/gis/import/<slug:importer_slug>/", views_api.GISImportAPI.as_view(), - name="api-gis-sources", + name="api-gis-import", ), path( "api/gis/type/<app>/<model>/", diff --git a/ishtar_common/views_api.py b/ishtar_common/views_api.py index a8d6b9648..99ee48b41 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,21 @@ class GISTypeAPI(GISAPIView): return Response(serializer.data) -class GISImportAPI(GISAPIView): +class GISBaseImportView: + def get_importer(self, request, importer_slug): + user = request.user + q = ImporterType.q_qgis_importers(user.ishtaruser).filter(slug=importer_slug) + 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 +99,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 +110,26 @@ 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) + if not importer: + return Response({"error": "Importer not found"}, + status=status.HTTP_400_BAD_REQUEST) + data = request.data + data.importer = importer + data.user = request.user.ishtaruser + serializer = ImportChunkSerializer(data=data) + if serializer.is_valid(): + serializer.save() + chunk_slug = f"{importer_slug}-{serializer.send_datetime}-{serializer.number}" + return Response({"chunk": chunk_slug}, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) |