feat: Add API to get adoption notices of organization
This commit is contained in:
@@ -30,7 +30,7 @@ class AdoptionNoticeSerializer(serializers.HyperlinkedModelSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = AdoptionNotice
|
model = AdoptionNotice
|
||||||
fields = ['created_at', 'last_checked', "searching_since", "name", "description", "further_information",
|
fields = ['created_at', 'last_checked', "searching_since", "name", "description", "further_information",
|
||||||
"group_only", "location", "location_details", "organization", "photos"]
|
"group_only", "location", "location_details", "organization", "photos", "adoption_notice_status"]
|
||||||
|
|
||||||
|
|
||||||
class AdoptionNoticeGeoJSONSerializer(serializers.ModelSerializer):
|
class AdoptionNoticeGeoJSONSerializer(serializers.ModelSerializer):
|
||||||
|
@@ -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, RescueOrgGeoJSONView
|
AdoptionNoticeGeoJSONView, RescueOrgGeoJSONView, AdoptionNoticePerOrgApiView
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@@ -14,6 +14,7 @@ urlpatterns = [
|
|||||||
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.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("organizations/<int:id>/adoption-notices", AdoptionNoticePerOrgApiView.as_view(), name="api-organization-adoption-notices"),
|
||||||
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"),
|
||||||
path("locations/", LocationApiView.as_view(), name="api-locations-list"),
|
path("locations/", LocationApiView.as_view(), name="api-locations-list"),
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
from drf_spectacular.types import OpenApiTypes
|
||||||
from rest_framework.generics import ListAPIView
|
from rest_framework.generics import ListAPIView
|
||||||
|
|
||||||
from fellchensammlung.api.serializers import LocationSerializer, AdoptionNoticeGeoJSONSerializer
|
from fellchensammlung.api.serializers import LocationSerializer, AdoptionNoticeGeoJSONSerializer
|
||||||
@@ -20,7 +21,7 @@ from .serializers import (
|
|||||||
SpeciesSerializer, RescueOrganizationSerializer,
|
SpeciesSerializer, RescueOrganizationSerializer,
|
||||||
)
|
)
|
||||||
from fellchensammlung.models import Animal, RescueOrganization, AdoptionNotice, Species, Image
|
from fellchensammlung.models import Animal, RescueOrganization, AdoptionNotice, Species, Image
|
||||||
from drf_spectacular.utils import extend_schema, inline_serializer
|
from drf_spectacular.utils import extend_schema, inline_serializer, OpenApiParameter
|
||||||
|
|
||||||
|
|
||||||
class AdoptionNoticeApiView(APIView):
|
class AdoptionNoticeApiView(APIView):
|
||||||
@@ -383,3 +384,69 @@ class RescueOrgGeoJSONView(ListAPIView):
|
|||||||
queryset = RescueOrganization.objects.select_related('location').filter(location__isnull=False)
|
queryset = RescueOrganization.objects.select_related('location').filter(location__isnull=False)
|
||||||
serializer_class = RescueOrgeGeoJSONSerializer
|
serializer_class = RescueOrgeGeoJSONSerializer
|
||||||
renderer_classes = [GeoJSONRenderer]
|
renderer_classes = [GeoJSONRenderer]
|
||||||
|
|
||||||
|
|
||||||
|
class AdoptionNoticePerOrgApiView(APIView):
|
||||||
|
permission_classes = [IsAuthenticated]
|
||||||
|
|
||||||
|
@extend_schema(
|
||||||
|
parameters=[
|
||||||
|
OpenApiParameter(
|
||||||
|
name='id',
|
||||||
|
required=False,
|
||||||
|
description='ID of the rescue organization from which to retrieve adoption notices.',
|
||||||
|
type=OpenApiTypes.INT
|
||||||
|
),
|
||||||
|
OpenApiParameter(
|
||||||
|
name='in_hierarchy',
|
||||||
|
type=OpenApiTypes.BOOL,
|
||||||
|
required=False,
|
||||||
|
description='Show all Adoption Notices in hierarchy.',
|
||||||
|
),
|
||||||
|
OpenApiParameter(
|
||||||
|
name='status',
|
||||||
|
type=OpenApiTypes.STR,
|
||||||
|
required=False,
|
||||||
|
description='Show all Adoption Notices in a certain status. Comma separated list of values e.g. '
|
||||||
|
'"active,closed"',
|
||||||
|
),
|
||||||
|
],
|
||||||
|
responses={200: AdoptionNoticeSerializer(many=True)}
|
||||||
|
)
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Retrieve adoption notices with their related animals and images.
|
||||||
|
"""
|
||||||
|
org_id = kwargs.get("id")
|
||||||
|
in_hierarchy = request.query_params.get("in_hierarchy")
|
||||||
|
an_status = request.query_params.get("status")
|
||||||
|
try:
|
||||||
|
org = RescueOrganization.objects.get(id=org_id)
|
||||||
|
except RescueOrganization.DoesNotExist:
|
||||||
|
return Response({"error": "Rescue Organization notice not found."}, status=status.HTTP_404_NOT_FOUND)
|
||||||
|
if in_hierarchy:
|
||||||
|
adoption_notices = org.adoption_notices_in_hierarchy
|
||||||
|
else:
|
||||||
|
adoption_notices = AdoptionNotice.objects.filter(organization=org)
|
||||||
|
if an_status:
|
||||||
|
status_list = an_status.lower().strip().split(",")
|
||||||
|
temporary_an_storage = []
|
||||||
|
if "active" in status_list:
|
||||||
|
active_ans = [adoption_notice for adoption_notice in adoption_notices if
|
||||||
|
adoption_notice.adoption_notice_status in AdoptionNoticeStatusChoices.Active.values]
|
||||||
|
temporary_an_storage.extend(active_ans)
|
||||||
|
if "closed" in status_list:
|
||||||
|
closed_ans = [adoption_notice for adoption_notice in adoption_notices if
|
||||||
|
adoption_notice.adoption_notice_status in AdoptionNoticeStatusChoices.Closed.values]
|
||||||
|
temporary_an_storage.extend(closed_ans)
|
||||||
|
if "disabled" in status_list:
|
||||||
|
disabled_ans = [adoption_notice for adoption_notice in adoption_notices if
|
||||||
|
adoption_notice.adoption_notice_status in AdoptionNoticeStatusChoices.Disabled.values]
|
||||||
|
temporary_an_storage.extend(disabled_ans)
|
||||||
|
if "awaiting_action" in status_list:
|
||||||
|
awaiting_action_ans = [adoption_notice for adoption_notice in adoption_notices if
|
||||||
|
adoption_notice.adoption_notice_status in AdoptionNoticeStatusChoices.AwaitingAction.values]
|
||||||
|
temporary_an_storage.extend(awaiting_action_ans)
|
||||||
|
adoption_notices = temporary_an_storage
|
||||||
|
serializer = AdoptionNoticeSerializer(adoption_notices, many=True, context={"request": request})
|
||||||
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
|
Reference in New Issue
Block a user