fix: use task-specific service report context
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

Ensure service report DOCX/PDF headers and monthly ZIP archives use task/work-order context, with async fallback when the broker is unavailable.
This commit is contained in:
mariomitte
2026-08-07 01:15:31 +02:00
parent 8b90916641
commit cb165df30c
2 changed files with 104 additions and 23 deletions

View File

@@ -9,7 +9,10 @@ import uuid
from io import BytesIO
from datetime import date, timedelta
import zipfile
from unittest.mock import patch
from PIL import Image
from pypdf import PdfReader
from kombu.exceptions import OperationalError as KombuOperationalError
from modules.fleet.models import (
Vehicle,
@@ -324,6 +327,48 @@ class WorkOrderImagesEndpointTests(TestCase):
self.assertNotIn('MT250226', header_xml)
self.assertNotIn('LTM-1350', header_xml)
def test_task_specific_service_records_pdf_uses_task_header_values(self):
vehicle_two = Vehicle.objects.create(
asset_type='crane',
registration_number='WO-IMG-003',
make='Tadano',
model='ATF 120',
crane_serial_number='SN-456',
superstructure_working_hours=777,
chassis_working_hours=888,
current_mileage=99911,
)
work_order_two = WorkOrder.objects.create(
vehicle=vehicle_two,
creator=self.user,
display_code='MT170726',
purpose='kontrola',
)
task_two = Task.objects.create(
title='PDF kontekst task',
assigned_to=self.user,
vehicle=vehicle_two,
work_order=work_order_two,
scheduled_date=date(2033, 12, 27),
)
response = self.client.get(
f"/api/fleet/work-orders/{work_order_two.pk}/service-records-pdf/?task_id={task_two.pk}"
)
self.assertEqual(response.status_code, 200, response.content)
self.assertEqual(response['Content-Type'], 'application/pdf')
reader = PdfReader(BytesIO(response.content))
text = "\n".join((page.extract_text() or '') for page in reader.pages)
self.assertIn('Tadano', text)
self.assertIn('ATF 120', text)
self.assertIn('SN-456', text)
self.assertIn('777', text)
self.assertIn('888', text)
self.assertIn('99911', text)
self.assertIn('MT170726', text)
self.assertNotIn('MT150726', text)
def test_monthly_service_tasks_archive_returns_zip_with_task_docx(self):
response = self.client.get('/api/fleet/reports/monthly-service-tasks-archive/?year=2033&month=12')
self.assertEqual(response.status_code, 200, response.content)
@@ -485,6 +530,33 @@ class WorkOrderImagesEndpointTests(TestCase):
self.assertFalse(stale.is_active)
self.assertEqual(stale.status, 'failed')
def test_monthly_service_tasks_archive_request_uses_async_local_fallback_when_broker_unavailable(self):
with (
patch('modules.fleet.views.build_monthly_archive_cached_task.delay', side_effect=KombuOperationalError('broker-down')),
patch('modules.fleet.views._schedule_monthly_archive_local_fallback') as fallback_mock,
):
response = self.client.post(
'/api/fleet/reports/monthly-service-tasks-archive-request/',
data={'year': 2033, 'month': 12},
format='json',
)
self.assertEqual(response.status_code, 202, response.content)
fallback_mock.assert_called_once()
generated = (
GeneratedFleetArchive.objects
.filter(
requested_by=self.user,
archive_type='service_tasks',
year=2033,
month=12,
)
.order_by('-created_at')
.first()
)
self.assertIsNotNone(generated)
self.assertEqual(generated.status, 'pending')
def test_monthly_work_orders_archive_request_creates_ready_download_with_notification(self):
WorkOrderInvoice.objects.create(
work_order=self.work_order,