# 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