diff --git a/001.BACKEND/media/radni-nalozi/RN-2026-0031/galerija/20260326_104601.jpg b/001.BACKEND/media/radni-nalozi/RN-2026-0031/galerija/20260326_104601.jpg new file mode 100644 index 0000000..aebf300 Binary files /dev/null and b/001.BACKEND/media/radni-nalozi/RN-2026-0031/galerija/20260326_104601.jpg differ diff --git a/001.BACKEND/media/radni-nalozi/RN-2026-0031/galerija/20260326_104608.jpg b/001.BACKEND/media/radni-nalozi/RN-2026-0031/galerija/20260326_104608.jpg new file mode 100644 index 0000000..c149d88 Binary files /dev/null and b/001.BACKEND/media/radni-nalozi/RN-2026-0031/galerija/20260326_104608.jpg differ diff --git a/001.BACKEND/media/radni-nalozi/RN-2026-0031/galerija/20260326_105128.jpg b/001.BACKEND/media/radni-nalozi/RN-2026-0031/galerija/20260326_105128.jpg new file mode 100644 index 0000000..b5ac231 Binary files /dev/null and b/001.BACKEND/media/radni-nalozi/RN-2026-0031/galerija/20260326_105128.jpg differ diff --git a/001.BACKEND/operations/serializers.py b/001.BACKEND/operations/serializers.py index 0f450ea..b214a74 100644 --- a/001.BACKEND/operations/serializers.py +++ b/001.BACKEND/operations/serializers.py @@ -17,6 +17,21 @@ class PutniNalogMinimalSerializer(serializers.ModelSerializer): model = PutniNalog fields = ['id', 'broj_naloga', 'status', 'pocetna_km'] +# --- NOVI STANDARDNI PUTNI NALOG SERIALIZER (Za rjeÅ”avanje ImportError-a) --- +class PutniNalogSerializer(serializers.ModelSerializer): + vozilo_detalji = VoziloListaSerializer(source='vozilo', read_only=True) + korisnik_ime = serializers.CharField(source='korisnik.get_full_name', read_only=True) + status_display = serializers.CharField(source='get_status_display', read_only=True) + + class Meta: + model = PutniNalog + fields = [ + 'id', 'broj_naloga', 'vozilo', 'vozilo_detalji', 'korisnik', 'korisnik_ime', + 'relacija', 'mjesto_odredista', 'pocetna_km', 'zavrsna_km', 'status', + 'status_display', 'vrijeme_polaska', 'vrijeme_povratka' + ] + read_only_fields = ['id', 'broj_naloga', 'vrijeme_polaska'] + # --- 1. LISTA SERIALIZER --- class RadniNalogListaSerializer(serializers.ModelSerializer): klijent_naziv = serializers.CharField(source='klijent.naziv', read_only=True) diff --git a/001.BACKEND/users/admin.py b/001.BACKEND/users/admin.py index 819c140..1514e3f 100644 --- a/001.BACKEND/users/admin.py +++ b/001.BACKEND/users/admin.py @@ -3,11 +3,21 @@ from django.contrib.auth.admin import UserAdmin from .models import CustomUser class CustomUserAdmin(UserAdmin): - model = CustomUser - # Definiramo koja polja se vide u admin listi i formama - list_display = ['email', 'username', 'first_name', 'last_name', 'is_staff', 'is_serviser'] + # šŸš€ POPRAVLJENO: Zamijenjen 'is_serviser' s 'uloga' u stupcima tablice + list_display = ['email', 'first_name', 'last_name', 'telefon', 'oib', 'uloga', 'is_staff'] + + # Ako filtriraÅ” korisnike na desnoj strani admina, ažuriraj i to: + list_filter = ['uloga', 'is_staff', 'is_active'] + + # šŸš€ POPRAVLJENO: Dodavanje polja u sekciju za uređivanje postojećeg korisnika fieldsets = UserAdmin.fieldsets + ( - ('Dodatni podaci', {'fields': ('telefon', 'oib', 'is_serviser')}), + ('Dodatni podaci tvrtke', {'fields': ('telefon', 'oib', 'uloga')}), ) + # šŸš€ POPRAVLJENO: Dodavanje polja u formu za kreiranje novog korisnika + add_fieldsets = UserAdmin.add_fieldsets + ( + ('Dodatni podaci tvrtke', {'fields': ('telefon', 'oib', 'uloga')}), + ) + +# Registracija modela i tvoje prilagođene admin klase admin.site.register(CustomUser, CustomUserAdmin) \ No newline at end of file diff --git a/001.BACKEND/users/migrations/0002_remove_customuser_is_serviser_customuser_uloga.py b/001.BACKEND/users/migrations/0002_remove_customuser_is_serviser_customuser_uloga.py new file mode 100644 index 0000000..07b1eb2 --- /dev/null +++ b/001.BACKEND/users/migrations/0002_remove_customuser_is_serviser_customuser_uloga.py @@ -0,0 +1,22 @@ +# Generated by Django 6.0.5 on 2026-05-23 12:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.RemoveField( + model_name='customuser', + name='is_serviser', + ), + migrations.AddField( + model_name='customuser', + name='uloga', + field=models.CharField(choices=[('SERVISER', 'Serviser'), ('PRODAJA', 'Prodaja / Operativa'), ('KNJIGOVODSTVO', 'Knjigovodstvo i financije'), ('ADMIN', 'Administrator')], default='SERVISER', help_text='Glavna operativna uloga korisnika u ERP sustavu', max_length=20), + ), + ] diff --git a/001.BACKEND/users/models.py b/001.BACKEND/users/models.py index 5059008..1572fb7 100644 --- a/001.BACKEND/users/models.py +++ b/001.BACKEND/users/models.py @@ -2,17 +2,29 @@ from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): + class Role(models.TextChoices): + SERVISER = 'SERVISER', 'Serviser' + PRODAJA = 'PRODAJA', 'Prodaja / Operativa' + KNJIGOVODSTVO = 'KNJIGOVODSTVO', 'Knjigovodstvo i financije' + ADMIN = 'ADMIN', 'Administrator' + # Email koristimo za login, pa mora biti jedinstven email = models.EmailField(unique=True) # Dodatna polja za tvoju tvrtku telefon = models.CharField(max_length=20, blank=True) oib = models.CharField(max_length=11, blank=True, null=True) - is_serviser = models.BooleanField(default=False) # Razlikovanje uloga + # šŸš€ ZAMJENA: Umjesto is_serviser, uvodimo jedno polje za sve uloge + uloga = models.CharField( + max_length=20, + choices=Role.choices, + default=Role.SERVISER, + help_text="Glavna operativna uloga korisnika u ERP sustavu" + ) # Govorimo Djangu da koristi email umjesto username-a USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username', 'first_name', 'last_name'] def __str__(self): - return f"{self.first_name} {self.last_name} ({self.email})" \ No newline at end of file + return f"{self.first_name} {self.last_name} ({self.email}) - {self.get_uloga_display()}" \ No newline at end of file diff --git a/001.BACKEND/users/serializers.py b/001.BACKEND/users/serializers.py index ee0ce64..e69d115 100644 --- a/001.BACKEND/users/serializers.py +++ b/001.BACKEND/users/serializers.py @@ -1,7 +1,10 @@ from rest_framework import serializers from .models import CustomUser -class UserMeSerializer(serializers.ModelSerializer): +class UserSerializer(serializers.ModelSerializer): + # Prosljeđujemo i ljudski čitljiv naziv (npr. "Knjigovodstvo i financije") + uloga_prikaz = serializers.CharField(source='get_uloga_display', read_only=True) + class Meta: model = CustomUser - fields = ['id', 'email', 'first_name', 'last_name', 'is_serviser'] \ No newline at end of file + fields = ['id', 'first_name', 'last_name', 'email', 'telefon', 'oib', 'uloga', 'uloga_prikaz'] \ No newline at end of file