from django.contrib import admin from django.utils.html import format_html from .models import Dogadaj @admin.register(Dogadaj) class DogadajAdmin(admin.ModelAdmin): # 1. Postavke liste (Dashboard pregled) list_display = ('prikaz_naslova', 'tip_ikona', 'pocetak', 'kraj', 'get_izvrsitelj', 'link_na_rn') list_filter = ('tip', 'pocetak', 'serviser_u_kalendaru') search_fields = ('naslov', 'opis', 'radni_nalog__broj_naloga', 'klijent__naziv') ordering = ('-pocetak',) # 2. Optimizacija baze (Spriječava N+1 problem zbog @property-ja) def get_queryset(self, request): return super().get_queryset(request).select_related( 'radni_nalog__izvrsitelj', 'serviser_u_kalendaru', 'klijent', 'vozilo' ) # --- CUSTOM METODE ZA PRIKAZ --- def prikaz_naslova(self, obj): """Bojanje naslova prema tipu za brzu vizualnu orijentaciju""" boje = { 'servis': '#2980b9', # Plava 'isporuka': '#27ae60', # Zelena 'sastanak': '#f39c12', # Narančasta 'biljeska': '#7f8c8d', # Siva } boja = boje.get(obj.tip, 'black') return format_html('{}', boja, obj.naslov) prikaz_naslova.short_description = "Naslov" def tip_ikona(self, obj): """Dodaje malu ikonu uz tip događaja""" ikone = { 'servis': '🛠️', 'isporuka': '🏗️', 'sastanak': '🤝', 'biljeska': '📝', } return format_html('{} {}', ikone.get(obj.tip, '📅'), obj.get_tip_display()) tip_ikona.short_description = "Tip" def get_izvrsitelj(self, obj): """Prikazuje izvršitelja koristeći logiku iz model @property""" korisnik = obj.izvrsitelj if korisnik: return korisnik.get_full_name() or korisnik.username return format_html('Nije dodijeljeno') get_izvrsitelj.short_description = "Izvršitelj (Serviser)" def link_na_rn(self, obj): """Prikazuje broj radnog naloga ako postoji""" if obj.radni_nalog: return format_html('#{}', obj.radni_nalog.broj_naloga) return "-" link_na_rn.short_description = "Radni Nalog" # 3. Organizacija polja u formi (Fieldsets) fieldsets = ( ('Glavne informacije', { 'fields': (('naslov', 'tip'), 'opis') }), ('Vrijeme održavanja', { 'fields': (('pocetak', 'kraj'),) }), ('Poveznice sustava', { 'fields': ('radni_nalog', 'klijent', 'vozilo'), 'description': "Povežite događaj s klijentom ili radnim nalogom za bolju evidenciju." }), ('Odgovornost', { 'fields': ('serviser_u_kalendaru',), 'description': "NAPOMENA: Ako je povezan Radni Nalog, sustav ignorira ovo polje i koristi servisera s naloga." }), ) # Postavljanje radnog naloga kao readonly ako želiš spriječiti ručno mijenjanje veza # readonly_fields = ('radni_nalog',)