feat: WorkOrderPhoto izolacija, upload modal i SN stupac u tablici putnih naloga
Some checks failed
ERP CI/CD Pipeline / test (push) Has been cancelled
ERP CI/CD Pipeline / Deploy (server git pull + compose) (push) Has been cancelled

- Dodan WorkOrderPhoto model (FK na WorkOrder, odvojen od VehicleServicePhoto)
- Migracija 0022_workorderphoto
- WorkOrderViewSet.images action refaktoriran: GET/POST koristi WorkOrderPhoto
- WorkOrderPhotoSerializer dodan u serializers.py
- WorkOrderPhotoInline dodan u admin.py
- Novi WorkOrderPhotoUpload.jsx modal s podrskom za onBack prop i z-[60]
- WorkOrderDetailModal: gumb Dodaj fotografije u editMode, photoUploadOpen state,
  ispravljen onSuccess callback (map na URL stringove), reset pri zatvaranju
- FleetDashboardShell: stupac SN u tablici putnih naloga (craneInfo.crane_serial_number)
- fleetDashboardStore: uklonjen dupli toast iz uploadWorkOrderPhoto
- Dodan test test_work_order_images_endpoint.py

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
mariomitte
2026-07-16 06:33:08 +02:00
parent 1ab2bfb3c3
commit 8e4b3f8aea
11 changed files with 539 additions and 58 deletions

View File

@@ -0,0 +1,96 @@
from django.contrib.auth import get_user_model
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import TestCase
from django.urls import reverse
from rest_framework.test import APIClient
import uuid
from io import BytesIO
from PIL import Image
from modules.fleet.models import Vehicle, WorkOrder, VehicleServiceRecord, VehicleServicePhoto
def create_test_image(filename='test.jpg', size=(40, 40), color='red'):
file = BytesIO()
image = Image.new('RGB', size=size, color=color)
image.save(file, 'JPEG')
file.seek(0)
return SimpleUploadedFile(
name=filename,
content=file.getvalue(),
content_type='image/jpeg',
)
class WorkOrderImagesEndpointTests(TestCase):
def setUp(self):
user_model = get_user_model()
suffix = uuid.uuid4().hex[:8]
self.user = user_model.objects.create_user(
username=f'wo-img-user-{suffix}',
email=f'wo-img-user-{suffix}@example.test',
password='test1234',
)
self.client = APIClient()
self.client.force_authenticate(user=self.user)
self.vehicle = Vehicle.objects.create(
asset_type='crane',
registration_number='WO-IMG-001',
crane_serial_number='123456',
)
self.work_order = WorkOrder.objects.create(
vehicle=self.vehicle,
creator=self.user,
purpose='kontrola',
)
self.service_record = VehicleServiceRecord.objects.create(
vehicle=self.vehicle,
performed_by=self.user,
description='Servisni zapis za test izolacije fotografija.',
service_title='Test servis',
)
def test_work_order_images_endpoint_isolated_from_service_record_photos(self):
# Existing service photo must NOT appear in work-order images response
VehicleServicePhoto.objects.create(
service_record=self.service_record,
image=create_test_image('service.jpg'),
description='Service photo',
uploaded_by=self.user,
)
upload_url = reverse('workorder-images', kwargs={'pk': self.work_order.pk})
response = self.client.post(
upload_url,
data={
'image': create_test_image('workorder.jpg'),
'description': 'Work order photo',
},
format='multipart',
)
self.assertEqual(response.status_code, 201, response.data)
self.assertEqual(str(response.data.get('work_order')), str(self.work_order.pk))
list_response = self.client.get(upload_url)
self.assertEqual(list_response.status_code, 200)
images = list_response.data.get('images', [])
self.assertEqual(len(images), 1)
self.assertEqual(str(images[0].get('work_order_id')), str(self.work_order.pk))
def test_service_record_files_endpoint_does_not_return_work_order_images(self):
upload_url = reverse('workorder-images', kwargs={'pk': self.work_order.pk})
self.client.post(
upload_url,
data={
'image': create_test_image('workorder-2.jpg'),
'description': 'WO isolated',
},
format='multipart',
)
service_photos_url = f"{reverse('service-photo-list')}?service_record_id={self.service_record.pk}"
response = self.client.get(service_photos_url)
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 0)