feat: Add rescue orgs as geojson via API
This commit is contained in:
@@ -21,7 +21,7 @@ class GeoJSONRenderer(BaseRenderer):
|
|||||||
"properties": {
|
"properties": {
|
||||||
k: v for k, v in item.items()
|
k: v for k, v in item.items()
|
||||||
},
|
},
|
||||||
"id": f"adoptionnotice/{item['id']}"
|
"id": f"{item['id']}"
|
||||||
}
|
}
|
||||||
features.append(feature)
|
features.append(feature)
|
||||||
|
|
||||||
|
@@ -83,6 +83,38 @@ class AdoptionNoticeGeoJSONSerializer(serializers.ModelSerializer):
|
|||||||
return f"{obj.location.city}"
|
return f"{obj.location.city}"
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
class RescueOrgeGeoJSONSerializer(serializers.ModelSerializer):
|
||||||
|
name = serializers.CharField()
|
||||||
|
url = serializers.SerializerMethodField()
|
||||||
|
location_hr = serializers.SerializerMethodField()
|
||||||
|
coordinates = serializers.SerializerMethodField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = AdoptionNotice
|
||||||
|
fields = ('id', 'name', 'description', 'url', 'location_hr', 'coordinates')
|
||||||
|
|
||||||
|
def get_url(self, obj):
|
||||||
|
return obj.get_absolute_url()
|
||||||
|
|
||||||
|
def get_coordinates(self, obj):
|
||||||
|
"""
|
||||||
|
Coordinates are randomly moved around real location, roughly in a circle. The object id is used as angle so that
|
||||||
|
points are always displayed at the same location (as if they were a seed for a random function).
|
||||||
|
|
||||||
|
It's not exactly a circle, because the earth is round.
|
||||||
|
"""
|
||||||
|
if obj.location:
|
||||||
|
return [obj.location.longitude, obj.location.latitude]
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_location_hr(self, obj):
|
||||||
|
if obj.location.city:
|
||||||
|
return f"{obj.location.city}"
|
||||||
|
elif obj.location:
|
||||||
|
return f"{obj.location}"
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class AnimalCreateSerializer(serializers.ModelSerializer):
|
class AnimalCreateSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@@ -2,7 +2,7 @@ from django.urls import path
|
|||||||
from .views import (
|
from .views import (
|
||||||
AdoptionNoticeApiView,
|
AdoptionNoticeApiView,
|
||||||
AnimalApiView, RescueOrganizationApiView, AddImageApiView, SpeciesApiView, LocationApiView,
|
AnimalApiView, RescueOrganizationApiView, AddImageApiView, SpeciesApiView, LocationApiView,
|
||||||
AdoptionNoticeGeoJSONView
|
AdoptionNoticeGeoJSONView, RescueOrgGeoJSONView
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@@ -12,6 +12,7 @@ urlpatterns = [
|
|||||||
path("animals/", AnimalApiView.as_view(), name="api-animal-list"),
|
path("animals/", AnimalApiView.as_view(), name="api-animal-list"),
|
||||||
path("animals/<int:id>/", AnimalApiView.as_view(), name="api-animal-detail"),
|
path("animals/<int:id>/", AnimalApiView.as_view(), name="api-animal-detail"),
|
||||||
path("organizations/", RescueOrganizationApiView.as_view(), name="api-organization-list"),
|
path("organizations/", RescueOrganizationApiView.as_view(), name="api-organization-list"),
|
||||||
|
path("organizations.geojson", RescueOrgGeoJSONView.as_view(), name="api-organization-list-geojson"),
|
||||||
path("organizations/<int:id>/", RescueOrganizationApiView.as_view(), name="api-organization-detail"),
|
path("organizations/<int:id>/", RescueOrganizationApiView.as_view(), name="api-organization-detail"),
|
||||||
path("images/", AddImageApiView.as_view(), name="api-add-image"),
|
path("images/", AddImageApiView.as_view(), name="api-add-image"),
|
||||||
path("species/", SpeciesApiView.as_view(), name="api-species-list"),
|
path("species/", SpeciesApiView.as_view(), name="api-species-list"),
|
||||||
|
@@ -14,7 +14,7 @@ from .renderers import GeoJSONRenderer
|
|||||||
from .serializers import (
|
from .serializers import (
|
||||||
AnimalGetSerializer,
|
AnimalGetSerializer,
|
||||||
AnimalCreateSerializer,
|
AnimalCreateSerializer,
|
||||||
RescueOrganizationSerializer,
|
RescueOrgeGeoJSONSerializer,
|
||||||
AdoptionNoticeSerializer,
|
AdoptionNoticeSerializer,
|
||||||
ImageCreateSerializer,
|
ImageCreateSerializer,
|
||||||
SpeciesSerializer, RescueOrganizationSerializer,
|
SpeciesSerializer, RescueOrganizationSerializer,
|
||||||
@@ -364,3 +364,9 @@ class AdoptionNoticeGeoJSONView(ListAPIView):
|
|||||||
adoptionnoticestatus__major_status=AdoptionNoticeStatus.ACTIVE)
|
adoptionnoticestatus__major_status=AdoptionNoticeStatus.ACTIVE)
|
||||||
serializer_class = AdoptionNoticeGeoJSONSerializer
|
serializer_class = AdoptionNoticeGeoJSONSerializer
|
||||||
renderer_classes = [GeoJSONRenderer]
|
renderer_classes = [GeoJSONRenderer]
|
||||||
|
|
||||||
|
|
||||||
|
class RescueOrgGeoJSONView(ListAPIView):
|
||||||
|
queryset = RescueOrganization.objects.select_related('location').filter(location__isnull=False)
|
||||||
|
serializer_class = RescueOrgeGeoJSONSerializer
|
||||||
|
renderer_classes = [GeoJSONRenderer]
|
||||||
|
Reference in New Issue
Block a user