Skip to content

Commit

Permalink
Merge pull request #180 from Georiviere/feat_add_pictogram_api
Browse files Browse the repository at this point in the history
✨ Add informations sensitivity
  • Loading branch information
LePetitTim committed Jun 6, 2023
2 parents 6c1bc96 + 040fc2f commit 5057cc0
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 13 deletions.
19 changes: 17 additions & 2 deletions georiviere/functions.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
from django.contrib.gis.db.models.functions import GeoFunc, GeomOutputGeoFunc
from django.db.models import FloatField

from django.db.models import CharField, FloatField
from georiviere.fields import ElevationInfosField


class Area(GeoFunc):
""" ST_Area postgis function """
output_field = FloatField()


class Buffer(GeomOutputGeoFunc):
""" ST_Buffer postgis function """
pass


class GeometryType(GeoFunc):
""" GeometryType postgis function """
output_field = CharField()
function = 'GeometryType'


class ElevationInfos(GeoFunc):
function = 'ft_elevation_infos'
geom_param_pos = (0, )
Expand Down
38 changes: 35 additions & 3 deletions georiviere/portal/serializers/sensitivity.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,55 @@
from rest_framework_gis.serializers import GeoFeatureModelSerializer, GeometryField

from georiviere.portal.serializers.main import AttachmentSerializer
from geotrek.sensitivity.models import SensitiveArea
from geotrek.sensitivity.models import SensitiveArea, Species


class SpeciesGeojsonSerializer(serializers.ModelSerializer):
class Meta:
model = Species
fields = ('id', 'pictogram', 'name')


class SensitivityGeojsonSerializer(GeoFeatureModelSerializer):
geometry = GeometryField(read_only=True, precision=7, source='geom_transformed')
species = SpeciesGeojsonSerializer(many=False)
attachments = AttachmentSerializer(many=True)

class Meta:
model = SensitiveArea
geo_field = 'geometry'
id_field = False
fields = ('id', 'species')
fields = ('id', 'attachments', 'description', 'species')


class SpeciesSerializer(serializers.ModelSerializer):
period01 = serializers.BooleanField(read_only=True)
period02 = serializers.BooleanField(read_only=True)
period03 = serializers.BooleanField(read_only=True)
period04 = serializers.BooleanField(read_only=True)
period05 = serializers.BooleanField(read_only=True)
period06 = serializers.BooleanField(read_only=True)
period07 = serializers.BooleanField(read_only=True)
period08 = serializers.BooleanField(read_only=True)
period09 = serializers.BooleanField(read_only=True)
period10 = serializers.BooleanField(read_only=True)
period11 = serializers.BooleanField(read_only=True)
period12 = serializers.BooleanField(read_only=True)
url = serializers.URLField(read_only=True)

class Meta:
model = Species
fields = (
'id', 'period01', 'period02', 'period03', 'period04', 'period05', 'period06', 'period07',
'period08', 'period09', 'period10', 'period11', 'period12', 'url', 'pictogram'
)


class SensitivitySerializer(serializers.ModelSerializer):
attachments = AttachmentSerializer(many=True)
name = serializers.CharField(source='species.name')
species = SpeciesSerializer(many=False)

class Meta:
model = SensitiveArea
fields = ('id', 'name', 'description', 'attachments')
fields = ('id', 'name', 'species', 'description', 'attachments')
4 changes: 2 additions & 2 deletions georiviere/portal/tests/test_views/test_sensitivity.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,15 @@ def test_sensitivity_detail_json_structure(self):
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

self.assertSetEqual(set(response.json().keys()), {'id', 'name', 'description', 'attachments'})
self.assertSetEqual(set(response.json().keys()), {'id', 'name', 'description', 'attachments', 'species'})

def test_sensitivity_list_json_structure(self):
url = reverse('api_portal:sensitivities-list',
kwargs={'lang': 'fr'})
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

self.assertSetEqual(set(response.json()[0].keys()), {'id', 'name', 'description', 'attachments'})
self.assertSetEqual(set(response.json()[0].keys()), {'id', 'name', 'description', 'attachments', 'species'})

def test_sensitivity_list_geojson_structure(self):
url = reverse('api_portal:sensitivities-list',
Expand Down
30 changes: 24 additions & 6 deletions georiviere/portal/views/sensitivity.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from django.conf import settings
from django.db.models import F
from django.db.models import F, Case, Prefetch, When
from django.contrib.gis.db.models.functions import Transform

from djangorestframework_camel_case.render import CamelCaseJSONRenderer

from georiviere.functions import Area, Buffer, GeometryType
from georiviere.portal.serializers.sensitivity import SensitivityGeojsonSerializer, SensitivitySerializer
from georiviere.main.models import Attachment
from georiviere.main.renderers import GeoJSONRenderer
from geotrek.sensitivity.models import SensitiveArea

Expand All @@ -24,11 +26,27 @@ class SensitivityViewSet(viewsets.ModelViewSet):
search_fields = ['species__name', ]

def get_queryset(self):
qs = SensitiveArea.objects.select_related('species').filter(published=True)
qs = qs.annotate(geom_transformed=Transform(F('geom'),
settings.API_SRID))
qs = qs.only('id', 'species')
return qs
queryset = (
SensitiveArea.objects.existing()
.filter(published=True)
.select_related('species')
.prefetch_related(
'species__practices',
Prefetch('attachments',
queryset=Attachment.objects.select_related('filetype')
)
)
.annotate(geom_type=GeometryType(F('geom')))
)

queryset = queryset.annotate(geom_transformed=Case(
When(geom_type='POINT', then=Transform(Buffer(F('geom'), F('species__radius'), 4), settings.API_SRID)),
default=Transform(F('geom'), settings.API_SRID)
))
queryset = queryset.order_by(Area('geom_transformed').desc(), 'pk')
if self.format_kwarg == 'geojson':
queryset = queryset.only('id', 'species', 'attachments', 'description')
return queryset.defer('geom')

def get_serializer_class(self):
""" Use specific Serializer for GeoJSON """
Expand Down

0 comments on commit 5057cc0

Please sign in to comment.