prije gemini provjere
This commit is contained in:
77
001.BACKEND/kalendar/serializers.py
Normal file
77
001.BACKEND/kalendar/serializers.py
Normal file
@@ -0,0 +1,77 @@
|
||||
from rest_framework import serializers
|
||||
from .models import Dogadaj
|
||||
import re
|
||||
|
||||
class DogadajSerializer(serializers.ModelSerializer):
|
||||
# 1. Mapiranje za standardne kalendarske knjižnice
|
||||
title = serializers.CharField(source='naslov')
|
||||
start = serializers.DateTimeField(source='pocetak')
|
||||
end = serializers.DateTimeField(source='kraj')
|
||||
|
||||
# 2. Dinamički podaci (korištenje @property-ja i Choice polja)
|
||||
izvrsitelj_ime = serializers.SerializerMethodField()
|
||||
tip_display = serializers.CharField(source='get_tip_display', read_only=True)
|
||||
|
||||
# 3. Dodatne informacije za UI
|
||||
boja = serializers.SerializerMethodField()
|
||||
je_radni_nalog = serializers.SerializerMethodField()
|
||||
|
||||
# 4. NOVA RAZDVOJENA POLJA ZA VOCILO I ČISTI OPIS KWARTA
|
||||
vozilo_naziv = serializers.SerializerMethodField()
|
||||
opis_cisti = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Dogadaj
|
||||
fields = [
|
||||
'id', 'title', 'start', 'end', 'tip', 'tip_display',
|
||||
'opis', 'opis_cisti', 'vozilo_naziv', 'izvrsitelj_ime',
|
||||
'boja', 'je_radni_nalog', 'klijent', 'vozilo', 'radni_nalog'
|
||||
]
|
||||
|
||||
def get_izvrsitelj_ime(self, obj):
|
||||
"""Dohvaća ime preko tvog @property izvrsitelj u modelu"""
|
||||
korisnik = obj.izvrsitelj
|
||||
if korisnik:
|
||||
return korisnik.get_full_name() or korisnik.username
|
||||
return "Nije dodijeljeno"
|
||||
|
||||
def get_boja(self, obj):
|
||||
"""Dodjeljuje boju ovisno o tipu događaja"""
|
||||
boje = {
|
||||
'servis': '#3498db', # Plava
|
||||
'isporuka': '#2ecc71', # Zelena
|
||||
'sastanak': '#f1c40f', # Žuta
|
||||
'biljeska': '#95a5a6', # Siva
|
||||
}
|
||||
return boje.get(obj.tip, '#34495e')
|
||||
|
||||
def get_je_radni_nalog(self, obj):
|
||||
"""Pomaže frontendu da zna treba li prikazati link na radni nalog"""
|
||||
return obj.radni_nalog is not None
|
||||
|
||||
def _parsiraj_spojeni_opis(self, obj):
|
||||
"""Pomoćna metoda koja analizira tekst i vraća (vozilo, opis)"""
|
||||
sirovi_tekst = obj.opis or ""
|
||||
|
||||
# Ako tekst sadrži ključne riječi, razdvajamo ga pomoću Regexa na backendu
|
||||
if "Vozilo:" in sirovi_tekst or "Opis kvara:" in sirovi_tekst:
|
||||
vozilo_match = re.search(r"Vozilo:\s*(.*?)(?=\s*Opis kvara:|$)", sirovi_tekst, re.IGNORECASE)
|
||||
opis_match = re.search(r"Opis kvara:\s*(.*)", sirovi_tekst, re.IGNORECASE)
|
||||
|
||||
vozilo = vozilo_match.group(1).strip() if vozilo_match else None
|
||||
opis = opis_match.group(1).strip() if opis_match else sirovi_tekst
|
||||
return vozilo, opis
|
||||
|
||||
# Ako je polje vozilo na modelu već popunjeno kao relacija/tekst, iskoristi ga
|
||||
model_vozilo = str(obj.vozilo) if obj.vozilo else None
|
||||
return model_vozilo, sirovi_tekst
|
||||
|
||||
def get_vozilo_naziv(self, obj):
|
||||
"""Vraća samo čisti naziv vozila"""
|
||||
vozilo, _ = self._parsiraj_spojeni_opis(obj)
|
||||
return vozilo
|
||||
|
||||
def get_opis_cisti(self, obj):
|
||||
"""Vraća samo čisti tekst opisa kvara"""
|
||||
_, opis = self._parsiraj_spojeni_opis(obj)
|
||||
return opis if opis else "Nema dodatnog opisa."
|
||||
Reference in New Issue
Block a user