This commit is contained in:
86
backend/modules/crm/admin.py
Normal file
86
backend/modules/crm/admin.py
Normal file
@@ -0,0 +1,86 @@
|
||||
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')
|
||||
Reference in New Issue
Block a user