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."