81 lines
3.1 KiB
Python
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',) |