Files
2026-05-20 21:24:00 +02:00

81 lines
3.1 KiB
Python

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('<span style="color: {}; font-weight: bold;">{}</span>', 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('<i style="color: #999;">Nije dodijeljeno</i>')
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('<b>#{}</b>', 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',)