# operations/serializers.py from rest_framework import serializers from .models import RadniNalog, RadniNalogSlika, PutniNalog from .mixins import DynamicFieldsModelSerializerMixin from .services import generiraj_i_kreiraj_putni_nalog # Uvozimo servisni sloj class RadniNalogSlikaSerializer(serializers.ModelSerializer): class Meta: model = RadniNalogSlika fields = ['id', 'slika', 'opis'] read_only_fields = ['id', 'datum_dodavanja'] class PutniNalogMinimalSerializer(serializers.ModelSerializer): class Meta: model = PutniNalog fields = ['id', 'broj_naloga', 'status', 'pocetna_km'] class RadniNalogDetaljiSerializer(DynamicFieldsModelSerializerMixin, serializers.ModelSerializer): slike = RadniNalogSlikaSerializer(many=True, read_only=True) status_display = serializers.CharField(source='get_status_display', read_only=True) izvrsitelj_ime = serializers.CharField(source='izvrsitelj.get_full_name', read_only=True) vozilo = serializers.SerializerMethodField() class Meta: model = RadniNalog fields = [ 'id', 'broj_naloga', 'klijent', 'stroj', 'putni_nalog', 'vozilo', 'opis_kvara', 'izvrsitelj', 'izvrsitelj_ime', 'status', 'status_display', 'datum_kreiranja', 'datum_azuriranja', 'slika_kvara', 'potpis_klijenta', 'slike' ] read_only_fields = ['datum_kreiranja', 'datum_azuriranja'] nested_fields_config = { 'klijent': 'kupci.serializers.KupacListaSerializer', 'stroj': 'fleet.serializers.StrojSerializer', 'putni_nalog': 'operations.serializers.PutniNalogMinimalSerializer' } def get_vozilo(self, obj): if obj.putni_nalog and obj.putni_nalog.vozilo: return { "id": obj.putni_nalog.vozilo.id, "naziv": obj.putni_nalog.vozilo.naziv, "registracija": obj.putni_nalog.vozilo.registracija, "trenutni_kilometri": obj.putni_nalog.vozilo.trenutni_kilometri, "status_prikaz": obj.putni_nalog.vozilo.status } return None class RadniNalogSerializer(DynamicFieldsModelSerializerMixin, serializers.ModelSerializer): broj_naloga = serializers.CharField(required=False, read_only=True) class Meta: model = RadniNalog fields = '__all__' def validate(self, data): stroj = data.get('stroj') or (self.instance.stroj if self.instance else None) klijent = data.get('klijent') or (self.instance.klijent if self.instance else None) if stroj and klijent and stroj.vlasnik != klijent: raise serializers.ValidationError({"stroj": "Odabrani stroj ne pripada odabranom klijentu."}) return data class KreirajPutniNalogSerializer(DynamicFieldsModelSerializerMixin, serializers.ModelSerializer): radni_nalog_id = serializers.IntegerField(write_only=True) class Meta: model = PutniNalog fields = ['id', 'radni_nalog_id', 'vozilo', 'broj_naloga'] read_only_fields = ['id', 'broj_naloga'] def validate_radni_nalog_id(self, value): try: nalog = RadniNalog.objects.get(id=value) except RadniNalog.DoesNotExist: raise serializers.ValidationError("Radni nalog s ovim ID-jem ne postoji.") if nalog.putni_nalog is not None: raise serializers.ValidationError("Za ovaj radni nalog već je izrađen putni nalog.") if not nalog.izvrsitelj: raise serializers.ValidationError("Radni nalog mora imati dodijeljenog izvršitelja.") return value def create(self, validated_data): # Sva teška logika je uklonjena odavde i poziva se iz operacije.py return generiraj_i_kreiraj_putni_nalog( radni_nalog_id=validated_data['radni_nalog_id'], vozilo=validated_data.get('vozilo') ) class PutniNalogSerializer(serializers.ModelSerializer): vozilo_detalji = serializers.SerializerMethodField() korisnik_ime = serializers.CharField(source='korisnik.get_full_name', read_only=True) status_display = serializers.CharField(source='get_status_display', read_only=True) class Meta: model = PutniNalog fields = [ 'id', 'broj_naloga', 'vozilo', 'vozilo_detalji', 'korisnik', 'korisnik_ime', 'relacija', 'mjesto_odredista', 'pocetna_km', 'zavrsna_km', 'status', 'status_display', 'vrijeme_polaska', 'vrijeme_povratka', 'datum_izdavanja' ] read_only_fields = ['id', 'broj_naloga', 'vrijeme_polaska', 'datum_izdavanja'] def get_vozilo_detalji(self, obj): from fleet.serializers import VoziloListaSerializer if obj.vozilo: return VoziloListaSerializer(obj.vozilo, context=self.context).data return None