from rest_framework import viewsets, filters from django_filters.rest_framework import DjangoFilterBackend from .models import Stroj, Vozilo from .serializers import ( VoziloSerializer, VoziloListaSerializer, VoziloDetaljiSerializer, StrojSerializer ) class StrojViewSet(viewsets.ModelViewSet): """ ViewSet za pregled, kreiranje i uređivanje strojeva i dizalica. """ # select_related radi SQL JOIN i povlači podatke o kupcu odmah queryset = Stroj.objects.all().select_related('vlasnik').prefetch_related('radni_nalozi') serializer_class = StrojSerializer # Dodajemo mogućnosti filtriranja, pretrage i sortiranja filter_backends = [ DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter ] # Omogućuje filtriranje strojeva po vlasniku ili tipu # npr. /api/strojevi/?vlasnik=1 ili /api/strojevi/?tip=dizalica_auto filterset_fields = ['vlasnik', 'tip'] # Omogućuje pretragu po nazivu, marki ili serijskom broju search_fields = ['naziv', 'marka', 'serijski_broj', 'registracija'] # Omogućuje sortiranje po radnim satima ili godini proizvodnje ordering_fields = ['radni_sati', 'godina_proizvodnje', 'datum_zadnjeg_atesta'] ordering = ['-datum_zadnjeg_atesta'] # Defaultno prikazuje one koji su zadnji atestirani class VoziloViewSet(viewsets.ModelViewSet): """ ViewSet za pregled, kreiranje i uređivanje voznog parka. Usklađen sa StrojViewSet arhitekturom. """ queryset = Vozilo.objects.all() # Postavljanje filter backenda (isto kao u StrojViewSet) filter_backends = [ DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter ] # Omogućuje filtriranje vozila po statusu # npr. /api/fleet/vozila/?status=u_radu filterset_fields = ['status'] # Omogućuje pretragu po nazivu i registraciji search_fields = ['naziv', 'registracija'] # Omogućuje sortiranje po kilometrima ili statusu ordering_fields = ['trenutni_kilometri', 'status'] ordering = ['naziv'] # Defaultno sortiranje po abecedi naziva def get_serializer_class(self): """ Dinamički odabir serializera za optimalne performanse. """ if self.action == 'list': return VoziloListaSerializer if self.action == 'retrieve': return VoziloDetaljiSerializer # Default za POST/PUT/PATCH return VoziloSerializer