prije gemini provjere
This commit is contained in:
110
001.BACKEND/operations/serializers.py
Normal file
110
001.BACKEND/operations/serializers.py
Normal file
@@ -0,0 +1,110 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user