fix: restore archive downloads and task report context
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:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user