110 lines
4.7 KiB
Python
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 |