fix: restore archive downloads and task 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

Restore the monthly fleet archive task and routes so generated ZIP downloads work again. Also populate service report DOCX headers from the selected task/work-order context and cover the direct and archived export flows with regression tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
mariomitte
2026-08-06 20:37:30 +02:00
parent ed71bf500f
commit 925cd25d98
5 changed files with 196 additions and 207 deletions

View File

@@ -1839,6 +1839,59 @@ def _docx_remove_empty_page_break_paragraphs(document):
body.remove(element)
def _build_service_report_docx_context(work_order, related_tasks):
primary_task = related_tasks[0] if len(related_tasks) == 1 else None
context_work_order = getattr(primary_task, 'work_order', None) if primary_task else None
if context_work_order is None:
context_work_order = work_order
context_vehicle = getattr(primary_task, 'vehicle', None) if primary_task else None
if context_vehicle is None:
context_vehicle = getattr(context_work_order, 'vehicle', None) or work_order.vehicle
model_parts = [
str(getattr(context_vehicle, 'make', '') or '').strip(),
str(getattr(context_vehicle, 'model', '') or '').strip(),
]
model_label = " ".join(part for part in model_parts if part) or '-'
return {
'work_order': context_work_order,
'vehicle': context_vehicle,
'client_name': getattr(getattr(context_vehicle, 'client', None), 'name', None) or '-',
'location': getattr(context_work_order, 'location', None) or '-',
'servicer_name': _user_display_name(getattr(context_work_order, 'creator', None)) or '-',
'servicer_vehicle_make_model': getattr(context_work_order, 'servicer_vehicle_make_model', None) or '-',
'servicer_vehicle_registration': getattr(context_work_order, 'servicer_vehicle_registration', None) or '-',
'completion_label': "Da ☒ Ne ☐" if getattr(context_work_order, 'status', None) == 'closed' else "Da ☐ Ne ☒",
'model': model_label,
'serial': str(getattr(context_vehicle, 'crane_serial_number', None) or '-'),
'upgrade_hours': str(getattr(context_vehicle, 'superstructure_working_hours', None) or '-'),
'chassis_hours': str(getattr(context_vehicle, 'chassis_working_hours', None) or '-'),
'mileage': str(getattr(context_vehicle, 'current_mileage', None) or '-'),
'work_order_display_code': _work_order_display_code(context_work_order),
}
def _populate_service_report_docx_header(document, context):
for section in getattr(document, 'sections', []):
header = getattr(section, 'header', None)
if header is None:
continue
header_tables = list(getattr(header, 'tables', []))
if len(header_tables) >= 2:
table_meta = header_tables[0]
_set_docx_cell_text(table_meta, 1, 0, context['model'])
_set_docx_cell_text(table_meta, 1, 2, context['serial'])
_set_docx_cell_text(table_meta, 1, 4, context['upgrade_hours'])
_set_docx_cell_text(table_meta, 1, 5, context['chassis_hours'])
_set_docx_cell_text(table_meta, 1, 6, context['mileage'])
_set_docx_cell_text(table_meta, 1, 8, context['work_order_display_code'])
table_title = header_tables[1]
_set_docx_cell_text(table_title, 0, 0, context['client_name'])
_set_docx_cell_text(table_title, 0, 1, 'Izvještaj servisera')
def _build_work_order_docx_bytes(work_order):
vehicle = work_order.vehicle
creator = work_order.creator
@@ -1893,15 +1946,13 @@ def _build_work_order_service_records_docx_bytes(work_order, related_tasks=None)
from docx.shared import Cm
doc = _create_docx_document(SERVICE_REPORT_DOCX_TEMPLATE_NAME)
vehicle = work_order.vehicle
client_name = getattr(getattr(vehicle, 'client', None), 'name', None) or '-'
servicer_name = _user_display_name(work_order.creator) or '-'
completion_label = "Da ☒ Ne ☐" if work_order.status == 'closed' else "Da ☐ Ne ☒"
if related_tasks is None:
related_tasks = list(_work_order_related_tasks_queryset(work_order).select_related('work_hours_table'))
else:
related_tasks = list(related_tasks)
context = _build_service_report_docx_context(work_order, related_tasks)
_populate_service_report_docx_header(doc, context)
normalized_rows = []
for task in related_tasks:
table_data = getattr(getattr(task, 'work_hours_table', None), 'data', None)
@@ -1961,17 +2012,17 @@ def _build_work_order_service_records_docx_bytes(work_order, related_tasks=None)
if len(doc.tables) >= 3:
info_table = doc.tables[0]
_set_docx_cell_text(info_table, 1, 0, client_name)
_set_docx_cell_text(info_table, 1, 1, work_order.location or '-')
_set_docx_cell_text(info_table, 3, 0, servicer_name)
_set_docx_cell_text(info_table, 1, 0, context['client_name'])
_set_docx_cell_text(info_table, 1, 1, context['location'])
_set_docx_cell_text(info_table, 3, 0, context['servicer_name'])
if len(info_table.rows[3].cells) > 1:
_set_docx_cell_text(info_table, 3, 1, '-')
transport_table = doc.tables[1]
_set_docx_cell_text(transport_table, 1, 0, work_order.servicer_vehicle_make_model or '-')
_set_docx_cell_text(transport_table, 1, 1, work_order.servicer_vehicle_registration or '-')
_set_docx_cell_text(transport_table, 1, 0, context['servicer_vehicle_make_model'])
_set_docx_cell_text(transport_table, 1, 1, context['servicer_vehicle_registration'])
_set_docx_cell_text(transport_table, 1, 2, '-')
_set_docx_cell_text(transport_table, 1, 4, completion_label)
_set_docx_cell_text(transport_table, 1, 4, context['completion_label'])
all_task_records = [record for task in related_tasks for record in records_by_task.get(task.id, [])]
summary_table = doc.tables[2]