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')