from rest_framework.decorators import action from django.utils import timezone from rest_framework import viewsets, filters, status # Dodan status from django_filters.rest_framework import DjangoFilterBackend from .models import RadniNalog, RadniNalogSlika, PutniNalog from rest_framework.response import Response from .serializers import ( RadniNalogSerializer, RadniNalogListaSerializer, RadniNalogDetaljiSerializer ) from kalendar.services import kreiraj_kalendarski_unos class RadniNalogViewSet(viewsets.ModelViewSet): """ API endpoint za upravljanje radnim nalozima. Vozilo se sada filtrira i pretražuje preko Putnog Naloga. """ # 1. queryset: UKLONJEN 'vozilo' iz select_related queryset = RadniNalog.objects.all().select_related( 'klijent', 'izvrsitelj', 'putni_nalog__vozilo' ) serializer_class = RadniNalogSerializer filter_backends = [ DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter ] # 2. filterset_fields: 'vozilo' zamijenjeno putanjom preko putnog naloga filterset_fields = ['status', 'izvrsitelj', 'klijent', 'putni_nalog__vozilo'] # 3. search_fields: pretraga ide preko putni_nalog__vozilo__registracija search_fields = [ 'broj_naloga', 'klijent__naziv', 'putni_nalog__vozilo__registracija', 'putni_nalog__vozilo__naziv' ] ordering_fields = ['datum_kreiranja', 'status', 'broj_naloga'] ordering = ['-datum_kreiranja'] def get_serializer_class(self): if self.action == 'list': return RadniNalogListaSerializer if self.action == 'retrieve': return RadniNalogDetaljiSerializer return RadniNalogSerializer def get_queryset(self): # Optimizacija upita ovisno o akciji queryset = self.queryset if self.action == 'retrieve': queryset = queryset.prefetch_related('slike') return queryset def perform_create(self, serializer): # Postavljamo izvršitelja ako nije poslan if not serializer.validated_data.get('izvrsitelj'): radni_nalog = serializer.save(izvrsitelj=self.request.user) else: radni_nalog = serializer.save() # Kalendar servis try: kreiraj_kalendarski_unos(radni_nalog) except Exception as e: print(f"Greška pri kreiranju kalendarskog zapisa: {e}") def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) instance = serializer.instance # Obrada višestrukih slika files = request.FILES.getlist('slike') for f in files: RadniNalogSlika.objects.create(radni_nalog=instance, slika=f) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) @action(detail=False, methods=['get'], url_path='sljedeci-broj') def dohvati_sljedeci_broj(self, request): godina = timezone.now().year prefix = f"{godina}-" zadnji_nalog = RadniNalog.objects.filter( broj_naloga__startswith=prefix ).order_by('-broj_naloga').first() if zadnji_nalog: try: zadnji_broj = int(zadnji_nalog.broj_naloga.split('-')[-1]) novi_broj = zadnji_broj + 1 except (ValueError, IndexError): novi_broj = 1 else: novi_broj = 1 return Response({"broj_naloga": f"{prefix}{novi_broj:04d}"})