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 | |
parent | d74d9c7e9f2da23c070ba15d8885c130956fd259 (diff) | |
download | Ishtar-c39a24a50e4b4c9acbd8c04537aab0e24ffe9781.tar.bz2 Ishtar-c39a24a50e4b4c9acbd8c04537aab0e24ffe9781.zip |
✨ GIS API: import data from QGIS view
-rw-r--r-- | ishtar_common/models_imports.py | 7 | ||||
-rw-r--r-- | ishtar_common/urls.py | 9 | ||||
-rw-r--r-- | ishtar_common/views.py | 4 | ||||
-rw-r--r-- | ishtar_common/views_api.py | 51 |
4 files changed, 58 insertions, 13 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 4b72ce985..1d59ccde0 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) @@ -2652,7 +2653,7 @@ class Import(BaseImport): def data_table(self): if self.importer_type.type == "tab": return self._data_table_tab() - if self.importer_type.type == "gis": + if self.importer_type.type in ("gis", "qgs"): return self._data_table_gis() def initialize(self, user=None, session_key=None): 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.py b/ishtar_common/views.py index f89ea865a..037bbd696 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -1952,7 +1952,9 @@ class ImportListView(IshtarMixin, LoginRequiredMixin, ListView): try: imprt = model.objects.get(pk=int(field.split("-")[-1])) except (models.Import.DoesNotExist, ValueError): - continue + put_session_message(request.session.session_key, _("Import not found."), + "warning") + return HttpResponseRedirect(reverse(self.current_url)) can_view, can_edit, can_delete = get_permissions_for_actions( request.user, imprt, owns, permissions ) 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) |