feat: Add API to get adoption notices of organization
This commit is contained in:
@@ -30,7 +30,7 @@ class AdoptionNoticeSerializer(serializers.HyperlinkedModelSerializer):
|
||||
class Meta:
|
||||
model = AdoptionNotice
|
||||
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):
|
||||
|
@@ -2,7 +2,7 @@ from django.urls import path
|
||||
from .views import (
|
||||
AdoptionNoticeApiView,
|
||||
AnimalApiView, RescueOrganizationApiView, AddImageApiView, SpeciesApiView, LocationApiView,
|
||||
AdoptionNoticeGeoJSONView, RescueOrgGeoJSONView
|
||||
AdoptionNoticeGeoJSONView, RescueOrgGeoJSONView, AdoptionNoticePerOrgApiView
|
||||
)
|
||||
|
||||
urlpatterns = [
|
||||
@@ -14,6 +14,7 @@ urlpatterns = [
|
||||
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>/adoption-notices", AdoptionNoticePerOrgApiView.as_view(), name="api-organization-adoption-notices"),
|
||||
path("images/", AddImageApiView.as_view(), name="api-add-image"),
|
||||
path("species/", SpeciesApiView.as_view(), name="api-species-list"),
|
||||
path("locations/", LocationApiView.as_view(), name="api-locations-list"),
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from django.db.models import Q
|
||||
from drf_spectacular.types import OpenApiTypes
|
||||
from rest_framework.generics import ListAPIView
|
||||
|
||||
from fellchensammlung.api.serializers import LocationSerializer, AdoptionNoticeGeoJSONSerializer
|
||||
@@ -20,7 +21,7 @@ from .serializers import (
|
||||
SpeciesSerializer, RescueOrganizationSerializer,
|
||||
)
|
||||
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):
|
||||
@@ -383,3 +384,69 @@ class RescueOrgGeoJSONView(ListAPIView):
|
||||
queryset = RescueOrganization.objects.select_related('location').filter(location__isnull=False)
|
||||
serializer_class = RescueOrgeGeoJSONSerializer
|
||||
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