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-29 08:30:58 +0200 |
commit | 9c2af62f11698af2d1ec71ae7bb80cff0c0463d0 (patch) | |
tree | c2c7a78b2e825a101443fdcf184bccfee5604d9c | |
parent | 3147ec235b10b56d4b7204105b0d7a02d3b07111 (diff) | |
download | Ishtar-9c2af62f11698af2d1ec71ae7bb80cff0c0463d0.tar.bz2 Ishtar-9c2af62f11698af2d1ec71ae7bb80cff0c0463d0.zip |
✨ GIS API: import data from QGIS view
-rw-r--r-- | ishtar_common/models_imports.py | 5 | ||||
-rw-r--r-- | ishtar_common/urls.py | 9 | ||||
-rw-r--r-- | ishtar_common/views_api.py | 51 |
3 files changed, 54 insertions, 11 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 3d47ba263..db5bff219 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -272,8 +272,9 @@ class ImporterType(models.Model): Return QGIS importer query """ # filter available according to permissions - q = cls.objects.filter(type="qgs", is_template=True, available=True) - if not ishtaruser.is_superuser and not ishtaruser.has_permission("change_gis_importer"): + q = cls.objects.filter(type="qgs", available=True) + if not ishtaruser.is_superuser and not ishtaruser.has_permission( + "change_gis_importer"): if not ishtaruser.has_permission("change_own_gis_importer"): return q.filter(pk__isnull=True) q = q.filter(users__pk=ishtaruser.pk) 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..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) |