115 lines
3.8 KiB
Python
115 lines
3.8 KiB
Python
from rest_framework import serializers
|
|
from .models import Stroj, Vozilo
|
|
|
|
|
|
class StrojShortSerializer(serializers.ModelSerializer):
|
|
"""
|
|
Kraća verzija serijalizatora za brze liste ili dropdown izbornike.
|
|
"""
|
|
class Meta:
|
|
model = Stroj
|
|
fields = ['id', 'naziv', 'serijski_broj', 'registracija']
|
|
|
|
class StrojSerializer(serializers.ModelSerializer):
|
|
"""
|
|
Glavni serializer za strojeve/dizalice.
|
|
"""
|
|
# Prikazuje naziv vlasnika (kupca) umjesto samo ID-a
|
|
# (source='vlasnik.naziv' jer je u modelu ForeignKey nazvan 'vlasnik')
|
|
vlasnik_naziv = serializers.ReadOnlyField(source='vlasnik.naziv')
|
|
|
|
# get_tip_display() pretvara 'dizalica_auto' u 'Autodizalica' (čitljivije za UI)
|
|
tip_human_readable = serializers.CharField(source='get_tip_display', read_only=True)
|
|
|
|
radni_nalozi = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Stroj
|
|
fields = [
|
|
'id',
|
|
'vlasnik',
|
|
'vlasnik_naziv',
|
|
'naziv',
|
|
'marka',
|
|
'model_stroja',
|
|
'serijski_broj',
|
|
'tip',
|
|
'tip_human_readable',
|
|
'godina_proizvodnje',
|
|
'radni_sati',
|
|
'registracija',
|
|
'datum_zadnjeg_atesta',
|
|
'radni_nalozi', # Novo polje
|
|
]
|
|
|
|
def get_radni_nalozi(self, obj):
|
|
# Lokalni import rješava kružni import error s operations aplikacijom
|
|
from operations.serializers import RadniNalogSerializer
|
|
|
|
# Dohvaćamo radne naloge i sortiramo ih tako da najnoviji budu prvi
|
|
queryset = obj.radni_nalozi.all().order_by('-datum_kreiranja')
|
|
|
|
# Vraćamo serijalizirane podatke
|
|
return RadniNalogSerializer(queryset, many=True, context=self.context).data
|
|
|
|
class VoziloSerializer(serializers.ModelSerializer):
|
|
"""
|
|
Osnovni serializer koji se koristi za Create/Update operacije.
|
|
"""
|
|
class Meta:
|
|
model = Vozilo
|
|
fields = '__all__'
|
|
|
|
class VoziloListaSerializer(serializers.ModelSerializer):
|
|
"""
|
|
Serializer za brzi prikaz u tablicama.
|
|
"""
|
|
# Ljudski čitljiv status (npr. 'Na Servisu' umjesto 'servis')
|
|
# status_prikaz = serializers.CharField(source='get_status_display', read_only=True)
|
|
|
|
class Meta:
|
|
model = Vozilo
|
|
fields = ['id', 'naziv', 'registracija', 'trenutni_kilometri', 'status', 'status_prikaz']
|
|
|
|
class VoziloListaSerializer(serializers.ModelSerializer):
|
|
"""
|
|
Serializer za brzi prikaz u tablicama.
|
|
"""
|
|
# Ljudski čitljiv status (npr. 'Na Servisu' umjesto 'servis')
|
|
status_prikaz = serializers.CharField(source='get_status_display', read_only=True)
|
|
|
|
class Meta:
|
|
model = Vozilo
|
|
fields = ['id', 'naziv', 'registracija', 'trenutni_kilometri', 'status', 'status_prikaz']
|
|
|
|
class VoziloDetaljiSerializer(serializers.ModelSerializer):
|
|
"""
|
|
Serializer s dodatnom statistikom za detaljni prikaz vozila.
|
|
"""
|
|
ukupno_predeno = serializers.SerializerMethodField()
|
|
status_prikaz = serializers.CharField(source='get_status_display', read_only=True)
|
|
|
|
putni_nalozi = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Vozilo
|
|
fields = [
|
|
'id',
|
|
'naziv',
|
|
'registracija',
|
|
'pocetni_kilometri',
|
|
'trenutni_kilometri',
|
|
'ukupno_predeno',
|
|
'status',
|
|
'status_prikaz',
|
|
'putni_nalozi',
|
|
]
|
|
|
|
def get_ukupno_predeno(self, obj):
|
|
"""Izračunava razliku između trenutnih i početnih kilometara"""
|
|
return obj.trenutni_kilometri - obj.pocetni_kilometri
|
|
|
|
def get_putni_nalozi(self, obj):
|
|
from operations.serializers import PutniNalogSerializer
|
|
queryset = obj.putni_nalozi.all()
|
|
return PutniNalogSerializer(queryset, many=True, context=self.context).data |