college-api/library_api/api_v1/views.py
2026-09-07 03:50:17 +03:00

84 lines
3 KiB
Python

# views.py
from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from .models import Plant, Greenhouse
from .serializers import PlantSerializer, GreenhouseSerializer
class PlantViewSet(viewsets.ModelViewSet):
queryset = Plant.objects.all()
serializer_class = PlantSerializer
def get_queryset(self):
qs = Plant.objects.all()
params = self.request.query_params
greenhouse = params.get("greenhouse")
if greenhouse is not None:
qs = qs.filter(greenhouse_id=greenhouse)
family = params.get("family")
if family is not None:
qs = qs.filter(family__iexact=family)
origin_country = params.get("origin_country")
if origin_country is not None:
qs = qs.filter(origin_country__iexact=origin_country)
is_flowering = params.get("is_flowering")
if is_flowering is not None:
qs = qs.filter(is_flowering=is_flowering.lower() in ("true", "1", "yes"))
endangered = params.get("endangered")
if endangered is not None:
qs = qs.filter(endangered=endangered.lower() in ("true", "1", "yes"))
min_height = params.get("min_height")
if min_height is not None:
qs = qs.filter(height_cm__gte=float(min_height))
max_height = params.get("max_height")
if max_height is not None:
qs = qs.filter(height_cm__lte=float(max_height))
planted_after = params.get("planted_after")
if planted_after is not None:
qs = qs.filter(planted_at__gte=planted_after)
planted_before = params.get("planted_before")
if planted_before is not None:
qs = qs.filter(planted_at__lte=planted_before)
return qs
@action(detail=False, methods=["post"], url_path="bulk-create")
def bulk_create(self, request):
serializer = self.get_serializer(data=request.data, many=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
@action(detail=False, methods=["patch"], url_path="bulk-update")
def bulk_update_plants(self, request):
ids = request.data.get("ids", [])
data = request.data.get("data", {})
if not ids or not data:
return Response(
{"detail": "Нужно передать 'ids' и 'data'."},
status=status.HTTP_400_BAD_REQUEST,
)
updated = Plant.objects.filter(id__in=ids).update(**data)
return Response({"updated_count": updated})
@action(detail=False, methods=["delete"], url_path="bulk-delete")
def bulk_delete(self, request):
qs = self.get_queryset() # фильтры берутся из query_params
count = qs.count()
qs.delete()
return Response({"deleted_count": count})
class GreenhouseViewSet(viewsets.ModelViewSet):
queryset = Greenhouse.objects.all()
serializer_class = GreenhouseSerializer