- Dodano polje 'display_code' na WorkOrder model (format: 2 inicijala + ddmmyy) - Migracije za kreiranje polja i backfill postojećih naloga - Ažuriran WorkOrderSerializer za validaciju i serijalizaciju display_code - Backend tasks za auto-generiranje display_code pri kreiranju - Frontend komponente ažurirane za prikaz display_code umjesto UUID: * FleetDashboardShell tablica putnih naloga * WorkOrderDetailModal * TaskCreateModal * Sve PDF stranice - displayIds.js utility za formatiranjeDisplay ID-eva - Admin interface prikazuje display_code
73 lines
2.7 KiB
Python
73 lines
2.7 KiB
Python
from rest_framework import serializers
|
|
from .models import CustomUser
|
|
|
|
class UserSerializer(serializers.ModelSerializer):
|
|
assigned_vehicle = serializers.SerializerMethodField()
|
|
assigned_crane = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = CustomUser
|
|
fields = ['id', 'email', 'first_name', 'last_name', 'is_serviser', 'is_kupac', 'is_team_member', 'telefon', 'oib', 'occupation', 'residence', 'work_position', 'client_profile', 'assigned_vehicle', 'assigned_crane']
|
|
read_only_fields = ['id', 'email']
|
|
extra_kwargs = {
|
|
'first_name': {'required': True, 'allow_blank': False}
|
|
}
|
|
|
|
def _get_assigned_assets(self, obj):
|
|
return obj.assigned_vehicles.all()
|
|
|
|
def _serialize_asset(self, vehicle):
|
|
if not vehicle:
|
|
return None
|
|
return {
|
|
'id': vehicle.id,
|
|
'asset_type': vehicle.asset_type,
|
|
'registration_number': vehicle.registration_number,
|
|
'make': vehicle.make,
|
|
'model': vehicle.model,
|
|
'current_mileage': vehicle.current_mileage,
|
|
'service_interval_km': vehicle.service_interval_km,
|
|
}
|
|
|
|
def get_assigned_vehicle(self, obj):
|
|
assigned = self._get_assigned_assets(obj)
|
|
vehicle = assigned.filter(asset_type='vehicle').first() or assigned.first()
|
|
return self._serialize_asset(vehicle)
|
|
|
|
def get_assigned_crane(self, obj):
|
|
assigned = self._get_assigned_assets(obj)
|
|
crane = assigned.filter(asset_type='crane').first() or assigned.first()
|
|
return self._serialize_asset(crane)
|
|
|
|
def validate(self, data):
|
|
"""
|
|
Provodi poslovnu logiku na razini serializer-a.
|
|
"""
|
|
is_kupac = data.get('is_kupac')
|
|
client_profile = data.get('client_profile')
|
|
|
|
# Logika: Ako je kupac, mora imati profil
|
|
if is_kupac and not client_profile:
|
|
raise serializers.ValidationError({
|
|
"client_profile": "Korisnik označen kao kupac mora imati dodijeljen klijentski profil."
|
|
})
|
|
|
|
# Logika: Ako ima profil, trebao bi biti kupac (opcionalno, ali preporučeno)
|
|
if client_profile and not is_kupac:
|
|
raise serializers.ValidationError({
|
|
"is_kupac": "Korisnik s dodijeljenim klijentskim profilom mora biti označen kao kupac."
|
|
})
|
|
|
|
return data
|
|
|
|
|
|
class TeamMemberSerializer(serializers.ModelSerializer):
|
|
full_name = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = CustomUser
|
|
fields = ['id', 'email', 'full_name', 'is_team_member', 'is_serviser']
|
|
read_only_fields = fields
|
|
|
|
def get_full_name(self, obj):
|
|
return obj.get_full_name() or obj.email |