prvi kod za live uporabu
Some checks failed
ERP CI Pipeline / test (push) Has been cancelled

This commit is contained in:
mariomitte
2026-07-09 21:21:17 +02:00
parent 857bb65d52
commit 5d39e048ba
239 changed files with 25151 additions and 0 deletions

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