86 lines
3.3 KiB
Python
86 lines
3.3 KiB
Python
from django import forms
|
|
from django.contrib import admin
|
|
from django.contrib.admin.widgets import FilteredSelectMultiple
|
|
from django.utils.translation import gettext_lazy as _
|
|
from modules.fleet.models import Crane
|
|
from .models import Client
|
|
|
|
|
|
class ClientAdminForm(forms.ModelForm):
|
|
customer_cranes = forms.ModelMultipleChoiceField(
|
|
label=_("Vozila kupca"),
|
|
queryset=Crane.objects.filter(is_active=True, asset_type='crane').order_by('registration_number'),
|
|
required=False,
|
|
widget=FilteredSelectMultiple(_("Dizalice"), is_stacked=False),
|
|
help_text=_("Odaberite postojeće dizalice koje pripadaju kupcu."),
|
|
)
|
|
|
|
class Meta:
|
|
model = Client
|
|
fields = '__all__'
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
if self.instance.pk:
|
|
self.fields['customer_cranes'].initial = Crane.objects.filter(client=self.instance, is_active=True, asset_type='crane')
|
|
|
|
|
|
@admin.register(Client)
|
|
class ClientAdmin(admin.ModelAdmin):
|
|
form = ClientAdminForm
|
|
# Polja koja se prikazuju u listi
|
|
list_display = ('name', 'tax_id', 'city', 'client_type', 'vehicle_count', 'is_active', 'created_at')
|
|
|
|
# Polja koja omogućuju klik na objekt
|
|
list_display_links = ('name', 'tax_id')
|
|
|
|
# Filteri sa strane (vrlo korisno za ERP)
|
|
list_filter = ('client_type', 'is_active', 'created_at')
|
|
|
|
# Polja po kojima admin može pretraživati
|
|
search_fields = ('name', 'tax_id', 'email')
|
|
|
|
readonly_fields = ('created_at', 'updated_at', 'linked_cranes_preview')
|
|
|
|
# Grupiranje polja u formi za ljepši pregled
|
|
fieldsets = (
|
|
(_('Osnovni podaci'), {
|
|
'fields': ('name', 'client_type', 'tax_id')
|
|
}),
|
|
(_('Kontakt podaci'), {
|
|
'fields': ('email', 'phone', 'address', 'city', 'postal_code')
|
|
}),
|
|
(_('Vozila kupca'), {
|
|
'fields': ('customer_cranes', 'linked_cranes_preview')
|
|
}),
|
|
(_('Sustavni podaci'), {
|
|
'fields': ('is_active', 'created_at', 'updated_at'),
|
|
'classes': ('collapse',)
|
|
}),
|
|
)
|
|
|
|
list_per_page = 50
|
|
|
|
@admin.display(description="Dizalice")
|
|
def vehicle_count(self, obj):
|
|
return obj.vehicles.filter(asset_type='crane').count()
|
|
|
|
@admin.display(description="Povezane dizalice")
|
|
def linked_cranes_preview(self, obj):
|
|
if not obj.pk:
|
|
return _("Spremite klijenta za prikaz povezanih dizalica.")
|
|
cranes = Crane.objects.filter(client=obj, is_active=True, asset_type='crane').order_by('registration_number')
|
|
if not cranes.exists():
|
|
return _("Nema povezanih dizalica.")
|
|
return ", ".join(str(crane) for crane in cranes)
|
|
|
|
def save_related(self, request, form, formsets, change):
|
|
super().save_related(request, form, formsets, change)
|
|
selected_cranes = form.cleaned_data.get('customer_cranes')
|
|
if selected_cranes is None:
|
|
return
|
|
|
|
selected_ids = list(selected_cranes.values_list('id', flat=True))
|
|
Crane.objects.filter(client=form.instance, asset_type='crane').exclude(pk__in=selected_ids).update(client=None)
|
|
if selected_ids:
|
|
Crane.objects.filter(pk__in=selected_ids).update(client=form.instance, is_company_vehicle=False, asset_type='crane') |