add from v002
This commit is contained in:
112
001.BACKEND/operations/admin.py
Normal file
112
001.BACKEND/operations/admin.py
Normal file
@@ -0,0 +1,112 @@
|
||||
# src/operations/admin.py
|
||||
from django.contrib import admin
|
||||
from django.utils.html import format_html
|
||||
from .models import RadniNalog, RadniNalogSlika, PutniNalog
|
||||
|
||||
# --- INLINES ---
|
||||
|
||||
class RadniNalogSlikaInline(admin.TabularInline):
|
||||
"""Omogućuje dodavanje više slika unutar samog radnog naloga."""
|
||||
model = RadniNalogSlika
|
||||
extra = 1
|
||||
fields = ('slika', 'opis')
|
||||
|
||||
class RadniNalogInline(admin.StackedInline):
|
||||
"""
|
||||
Omogućuje dodavanje i pregled radnih naloga direktno unutar Putnog naloga.
|
||||
Ovo je ključno za terenski rad (jedno putovanje -> više odrađenih strojeva).
|
||||
"""
|
||||
model = RadniNalog
|
||||
extra = 0
|
||||
autocomplete_fields = ['stroj', 'klijent', 'izvrsitelj']
|
||||
fieldsets = (
|
||||
(None, {
|
||||
'fields': (('broj_naloga', 'status'), ('klijent', 'stroj'), 'opis_kvara')
|
||||
}),
|
||||
)
|
||||
|
||||
# --- ADMIN REGISTRACIJE ---
|
||||
|
||||
@admin.register(PutniNalog)
|
||||
class PutniNalogAdmin(admin.ModelAdmin):
|
||||
list_display = ('broj_naloga', 'prikaz_vozila', 'korisnik', 'pocetna_km', 'zavrsna_km', 'status_marker')
|
||||
list_filter = ('status', 'datum_izdavanja', 'vozilo')
|
||||
search_fields = ('broj_naloga', 'vozilo__registracija', 'korisnik__last_name')
|
||||
autocomplete_fields = ['vozilo', 'korisnik']
|
||||
|
||||
# Inlines omogućuju da vidiš servise (RN) unutar putovanja (PN)
|
||||
inlines = [RadniNalogInline]
|
||||
|
||||
# pocetna_km je readonly jer se automatski povlači iz flote pri kreiranju
|
||||
readonly_fields = ('pocetna_km',)
|
||||
|
||||
fieldsets = (
|
||||
('Logistika puta', {
|
||||
'fields': (('broj_naloga', 'status'), ('vozilo', 'korisnik'), 'relacija', 'mjesto_odredista')
|
||||
}),
|
||||
('Kilometraža i vrijeme', {
|
||||
'fields': (('pocetna_km', 'zavrsna_km'), ('vrijeme_polaska', 'vrijeme_povratka')),
|
||||
'description': 'Završni kilometri će automatski ažurirati bazu vozila po zatvaranju naloga.'
|
||||
}),
|
||||
)
|
||||
|
||||
def prikaz_vozila(self, obj):
|
||||
return format_html('<b>{}</b>', obj.vozilo.registracija)
|
||||
prikaz_vozila.short_description = "Vozilo"
|
||||
|
||||
def status_marker(self, obj):
|
||||
color = 'green' if obj.status == 'ZAVRSEN' else 'orange'
|
||||
return format_html('<span style="color: {}; font-weight: bold;">{}</span>', color, obj.get_status_display())
|
||||
status_marker.short_description = "Status"
|
||||
|
||||
|
||||
@admin.register(RadniNalog)
|
||||
class RadniNalogAdmin(admin.ModelAdmin):
|
||||
# Prikazujemo stroj i putni nalog kako bismo znali gdje je servis odrađen
|
||||
list_display = ('prikaz_broja', 'datum_kreiranja', 'klijent', 'stroj', 'status_boja', 'povezani_pn')
|
||||
list_filter = ('status', 'datum_kreiranja', 'izvrsitelj', 'stroj__tip')
|
||||
|
||||
# Pretraga po serijskom broju stroja je ključna za servisere
|
||||
search_fields = (
|
||||
'broj_naloga',
|
||||
'klijent__naziv',
|
||||
'stroj__naziv',
|
||||
'stroj__serijski_broj'
|
||||
)
|
||||
|
||||
# Autocomplete za lakše biranje među stotinama strojeva i klijenata
|
||||
autocomplete_fields = ['klijent', 'stroj', 'putni_nalog', 'izvrsitelj']
|
||||
|
||||
inlines = [RadniNalogSlikaInline]
|
||||
|
||||
fieldsets = (
|
||||
('Subjekt servisa', {
|
||||
'fields': (('broj_naloga', 'status'), ('klijent', 'stroj'), ('izvrsitelj', 'putni_nalog'))
|
||||
}),
|
||||
('Opis i dokumentacija', {
|
||||
'fields': ('opis_kvara', 'slika_kvara', 'potpis_klijenta')
|
||||
}),
|
||||
)
|
||||
|
||||
def prikaz_broja(self, obj):
|
||||
return format_html('<b>RN-{}</b>', obj.broj_naloga)
|
||||
prikaz_broja.short_description = "Nalog"
|
||||
|
||||
def povezani_pn(self, obj):
|
||||
if obj.putni_nalog:
|
||||
return obj.putni_nalog.broj_naloga
|
||||
return "Nema (Radiona)"
|
||||
povezani_pn.short_description = "Putni nalog"
|
||||
|
||||
def status_boja(self, obj):
|
||||
boje = {
|
||||
'PLANIRANO': '#6b7280',
|
||||
'U_RADU': '#2563eb',
|
||||
'ZAVRSENO': '#10b981',
|
||||
}
|
||||
return format_html(
|
||||
'<span style="color: {}; font-weight: bold;">{}</span>',
|
||||
boje.get(obj.status, 'black'),
|
||||
obj.get_status_display()
|
||||
)
|
||||
status_boja.short_description = "Status"
|
||||
Reference in New Issue
Block a user