fix: use task-specific service report context
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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user