Files
2026-05-31 19:21:25 +02:00

110 lines
4.7 KiB
Python

# 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