summaryrefslogtreecommitdiff
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-07-29 08:30:58 +0200
commit9c2af62f11698af2d1ec71ae7bb80cff0c0463d0 (patch)
treec2c7a78b2e825a101443fdcf184bccfee5604d9c
parent3147ec235b10b56d4b7204105b0d7a02d3b07111 (diff)
downloadIshtar-9c2af62f11698af2d1ec71ae7bb80cff0c0463d0.tar.bz2
Ishtar-9c2af62f11698af2d1ec71ae7bb80cff0c0463d0.zip
✨ GIS API: import data from QGIS view
-rw-r--r--ishtar_common/models_imports.py5
-rw-r--r--ishtar_common/urls.py9
-rw-r--r--ishtar_common/views_api.py51
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)