add from v002
This commit is contained in:
81
001.BACKEND/kalendar/admin.py
Normal file
81
001.BACKEND/kalendar/admin.py
Normal file
@@ -0,0 +1,81 @@
|
||||
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',)
|
||||
Reference in New Issue
Block a user