84 lines
3 KiB
Python
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
|