from rest_framework.decorators import action from django.utils import timezone from rest_framework import viewsets, filters, permissions, 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, KreirajPutniNalogSerializer ) 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. """ queryset = RadniNalog.objects.all().select_related( 'klijent', 'izvrsitelj', 'putni_nalog__vozilo' ) serializer_class = RadniNalogSerializer filter_backends = [ DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter ] filterset_fields = ['status', 'izvrsitelj', 'klijent', 'putni_nalog__vozilo'] 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): queryset = self.queryset if self.action == 'retrieve': queryset = queryset.prefetch_related('slike') return queryset def perform_create(self, serializer): if not serializer.validated_data.get('izvrsitelj'): radni_nalog = serializer.save(izvrsitelj=self.request.user) else: radni_nalog = serializer.save() try: kreiraj_kalendarski_unos(radni_nalog) except Exception as e: print(f"Greška pri kreiranju kalendarskog zapisa: {e}") # Uredi isključivo ovu metodu unutar RadniNalogViewSet u tvom views.py 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) # KLJUČNI POPRAVAK: Ponovno osvježavamo instancu iz baze podataka # Ovo povlači čisti 'broj_naloga' nakon što ga je save() u models.py očistio od RN-RN- instance.refresh_from_db() # Za povratni JSON koristimo detaljniji prikaz kako bi Astro odmah dobio ispravno stanje izlazni_serializer = RadniNalogDetaljiSerializer(instance, context={'request': request}) headers = self.get_success_headers(izlazni_serializer.data) return Response(izlazni_serializer.data, status=status.HTTP_201_CREATED, headers=headers) @action(detail=False, methods=['get'], url_path='sljedeci-broj', permission_classes=[permissions.AllowAny]) def dohvati_sljedeci_broj(self, request): """ Dohvaća točan sljedeći broj radnog naloga iz neuništive sekvencijske tablice. """ godina = timezone.now().year kljuc_sekvence = f"radni_nalog_{godina}" prefix = f"RN-{godina}-" # Pogledaj trenutačno stanje u tablici sekvenci (bez uvećavanja) from .models import BrojacSekvence # Lokalni uvoz ako zatreba brojac = BrojacSekvence.objects.filter(naziv_sekvence=kljuc_sekvence).first() if brojac: sljedeci_broj = brojac.zadnji_broj + 1 else: # Ako brojač još ne postoji u sekvencama, baci oko na bazu za prvu inicijalizaciju zadnji_nalog = RadniNalog.objects.filter(broj_naloga__startswith=prefix).order_by('-broj_naloga').first() if zadnji_nalog: try: sljedeci_broj = int(zadnji_nalog.broj_naloga.split('-')[-1]) + 1 except (ValueError, IndexError): sljedeci_broj = 1 else: sljedeci_broj = 1 sljedeci_broj_formatiran = f"{prefix}{sljedeci_broj:04d}" return Response({"broj_naloga": sljedeci_broj_formatiran}) class PutniNalogViewSet(viewsets.ModelViewSet): """ ViewSet za upravljanje putnim nalozima. Podržava izradu novog putnog naloga iz radnog naloga (POST) i pregled (GET). """ queryset = PutniNalog.objects.all().order_by('-datum_izdavanja', '-id') permission_classes = [permissions.IsAuthenticated] # Preporučeno: Otkomentarisano radi getAuthHeaders def get_serializer_class(self): if self.action == 'create': return KreirajPutniNalogSerializer return KreirajPutniNalogSerializer def create(self, request, *args, **kwargs): serializer = self.get_serializer_class()(data=request.data, context={'request': request}) if serializer.is_valid(): putni_nalog = serializer.save() return Response( { "id": putni_nalog.id, "broj_naloga": putni_nalog.broj_naloga, "status": putni_nalog.status, "pocetna_km": putni_nalog.pocetna_km, "message": "Putni nalog uspješno kreiran!" }, status=status.HTTP_201_CREATED ) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)