72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
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 |