50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
"""ViewSets для API модуля закупок."""
|
||
|
||
from django_filters.rest_framework import DjangoFilterBackend
|
||
from rest_framework import filters, viewsets
|
||
from rest_framework.decorators import action
|
||
from rest_framework.response import Response
|
||
|
||
from procurement.models import (
|
||
Supplier,
|
||
)
|
||
|
||
from ..permissions import (
|
||
CanManageSupplier,
|
||
)
|
||
from ..serializers import (
|
||
SupplierSerializer,
|
||
)
|
||
|
||
|
||
class SupplierViewSet(viewsets.ModelViewSet):
|
||
"""ViewSet для поставщиков."""
|
||
|
||
queryset = Supplier.objects.all()
|
||
serializer_class = SupplierSerializer
|
||
filter_backends = [
|
||
DjangoFilterBackend,
|
||
filters.SearchFilter,
|
||
filters.OrderingFilter,
|
||
]
|
||
filterset_fields = ["is_active"]
|
||
search_fields = ["name", "contact_person", "inn"]
|
||
ordering_fields = ["name", "rating"]
|
||
ordering = ["name"]
|
||
|
||
def get_permissions(self):
|
||
"""Права доступа."""
|
||
permission_classes = [CanManageSupplier]
|
||
return [permission() for permission in permission_classes]
|
||
|
||
@action(detail=False, methods=["get"])
|
||
def top_rated(self, request):
|
||
"""Получить поставщиков с лучшим рейтингом."""
|
||
queryset = (
|
||
self.get_queryset()
|
||
.filter(is_active=True, rating__gte=4.0)
|
||
.order_by("-rating")[:10]
|
||
)
|
||
serializer = self.get_serializer(queryset, many=True)
|
||
return Response(serializer.data)
|