From 09a680d2d029e9265bd2c3d97f55927c4cd14807 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 25 Jan 2023 12:45:42 +0100 Subject: [PATCH 1/2] Update views.py --- signalo/signalo_app/views.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/signalo/signalo_app/views.py b/signalo/signalo_app/views.py index 73a3317a..5d7f0aa7 100644 --- a/signalo/signalo_app/views.py +++ b/signalo/signalo_app/views.py @@ -59,14 +59,16 @@ class PoleViewset(OAPIFDescribeModelViewSetMixin, viewsets.ModelViewSet): def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) - queryset = queryset.values_list("_serialized", flat=True) + # queryset = queryset.values_list("_serialized", flat=True) + queryset = queryset.values_list("id","geom","name") serialized_poles = [] page = self.paginate_queryset(queryset) if page is not None: for pole in page: - serialized_poles.append(pole or "") + serialized_poles.append( + f'{{"id": "{pole[0]}", "type": "Feature", "geometry": {pole[1].hexewkb}, "properties": {{"name": "{pole[2]}"}}}}') return self.get_paginated_response(serialized_poles) for pole in queryset: @@ -79,4 +81,6 @@ def get_queryset(self): my_bbox_polygon = Polygon.from_bbox(coords) return Pole.objects.filter(geom__intersects=my_bbox_polygon) + # for key in request.GET.iterkeys() + return Pole.objects.all() From 4d8903db2ee77fe0323548e8253673d3ef7214c0 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 25 Jan 2023 20:38:24 +0100 Subject: [PATCH 2/2] fixed serialization --- signalo/signalo_app/models.py | 4 ++++ signalo/signalo_app/views.py | 35 ++++++++++------------------------- 2 files changed, 14 insertions(+), 25 deletions(-) diff --git a/signalo/signalo_app/models.py b/signalo/signalo_app/models.py index da8dac0f..df48c219 100644 --- a/signalo/signalo_app/models.py +++ b/signalo/signalo_app/models.py @@ -18,6 +18,10 @@ class Pole(ComputedFieldsModel): def _serialized(self): return f'{{"id": "{str(self.id)}", "type": "Feature", "geometry": {self.geom.geojson}, "properties": {{"name": "{self.name}"}}}}' + @property + def geom_wkb(self): + return self.geom.hexewkb + class Sign(ComputedFieldsModel): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) diff --git a/signalo/signalo_app/views.py b/signalo/signalo_app/views.py index 5d7f0aa7..4306daca 100644 --- a/signalo/signalo_app/views.py +++ b/signalo/signalo_app/views.py @@ -1,9 +1,12 @@ from django.conf import settings from django.contrib.gis.geos import Polygon from django.http import HttpResponse +from rest_framework.response import Response + from django_oapif.mixins import OAPIFDescribeModelViewSetMixin -from rest_framework import viewsets +from rest_framework import viewsets, serializers from rest_framework_gis.serializers import GeoFeatureModelSerializer +from rest_framework.pagination import LimitOffsetPagination from signalo_app.models import Pole, Sign @@ -17,12 +20,13 @@ def __init__(self, data): super(OapifResponse, self).__init__(data) -class PoleSerializer(GeoFeatureModelSerializer): +class PoleSerializer(serializers.ModelSerializer): # used only for API route + geom_wkb = serializers.ReadOnlyField() + class Meta: - model = Sign - fields = "__all__" - geo_field = "geom" + model = Pole + fields = ["id", "geom_wkb", "name", ] class SignSerializer(GeoFeatureModelSerializer): @@ -47,6 +51,7 @@ class SignViewset(OAPIFDescribeModelViewSetMixin, viewsets.ModelViewSet): class PoleViewset(OAPIFDescribeModelViewSetMixin, viewsets.ModelViewSet): serializer_class = PoleSerializer # used only for API route + pagination_class = LimitOffsetPagination oapif_title = "PoleOAPIFModel" oapif_description = "PoleOAPIFModel layer" oapif_geom_lookup = ( @@ -56,24 +61,6 @@ class PoleViewset(OAPIFDescribeModelViewSetMixin, viewsets.ModelViewSet): settings.SRID ) # (one day this will be retrieved automatically from the DB field) - def list(self, request, *args, **kwargs): - queryset = self.filter_queryset(self.get_queryset()) - - # queryset = queryset.values_list("_serialized", flat=True) - queryset = queryset.values_list("id","geom","name") - - serialized_poles = [] - - page = self.paginate_queryset(queryset) - if page is not None: - for pole in page: - serialized_poles.append( - f'{{"id": "{pole[0]}", "type": "Feature", "geometry": {pole[1].hexewkb}, "properties": {{"name": "{pole[2]}"}}}}') - return self.get_paginated_response(serialized_poles) - - for pole in queryset: - serialized_poles.append(pole or "") - return OapifResponse(serialized_poles) def get_queryset(self): if self.request.GET.get("bbox"): @@ -81,6 +68,4 @@ def get_queryset(self): my_bbox_polygon = Polygon.from_bbox(coords) return Pole.objects.filter(geom__intersects=my_bbox_polygon) - # for key in request.GET.iterkeys() - return Pole.objects.all()