From 4f63d267663ffb0f0405b5643009543fcc05826c Mon Sep 17 00:00:00 2001 From: Nguyen Ngo Date: Tue, 5 May 2026 17:36:44 -0400 Subject: [PATCH] 05/05 Update API for iPad inspection follow-up --- app/api/inspections.py | 62 +++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/app/api/inspections.py b/app/api/inspections.py index a07096a..a9ca59a 100644 --- a/app/api/inspections.py +++ b/app/api/inspections.py @@ -51,20 +51,24 @@ def _parse_datetime(value): def _inspection_payload(inspection): """Serialize an Inspection to the dict returned in API responses.""" return { - 'id': inspection.id, - 'template_id': inspection.template_id, - 'template_name': inspection.template.name if inspection.template else '', - 'facility_id': inspection.facility_id, - 'facility_name': inspection.facility.name if inspection.facility else '', - 'area_id': inspection.area_id, - 'area_name': inspection.area.name if inspection.area else None, - 'status': inspection.status, - 'overall_score': inspection.overall_score, - 'inspection_date': inspection.inspection_date.isoformat() - if inspection.inspection_date else None, - 'completed_at': inspection.completed_at.isoformat() - if inspection.completed_at else None, - 'mobile_local_id': inspection.mobile_local_id, + 'id': inspection.id, + 'template_id': inspection.template_id, + 'template_name': inspection.template.name if inspection.template else '', + 'facility_id': inspection.facility_id, + 'facility_name': inspection.facility.name if inspection.facility else '', + 'area_id': inspection.area_id, + 'area_name': inspection.area.name if inspection.area else None, + 'status': inspection.status, + 'overall_score': inspection.overall_score, + 'inspection_date': inspection.inspection_date.isoformat() + if inspection.inspection_date else None, + 'completed_at': inspection.completed_at.isoformat() + if inspection.completed_at else None, + 'mobile_local_id': inspection.mobile_local_id, + # ── Follow-up / re-inspection fields ────────────────────────────── + 'follow_up_required': inspection.follow_up_required, + 'follow_up_note': inspection.follow_up_note, + 'parent_inspection_id': inspection.parent_inspection_id, } @@ -214,6 +218,13 @@ def create_inspection(): if status not in ('in_progress', 'completed'): return api_error('status must be "in_progress" or "completed"', 400) + # ── Optional parent link (re-inspection) ────────────────────────────── + parent_inspection_id = data.get('parent_inspection_id') + if parent_inspection_id: + parent = db.session.get(Inspection, parent_inspection_id) + if parent is None: + return api_error('Parent inspection not found', 404) + # ── Score calculation ───────────────────────────────────────────────── overall_score = data.get('overall_score') if overall_score is None and status == 'completed': @@ -232,16 +243,17 @@ def create_inspection(): notes_payload['_form_data'] = form_data inspection = Inspection( - template_id = template_id, - facility_id = facility_id, - area_id = area_id, - inspector_id = user.id, - inspection_date = inspection_date, - overall_score = overall_score, - status = status, - notes = json.dumps(notes_payload), - completed_at = completed_at if status == 'completed' else None, - mobile_local_id = mobile_local_id, + template_id = template_id, + facility_id = facility_id, + area_id = area_id, + inspector_id = user.id, + inspection_date = inspection_date, + overall_score = overall_score, + status = status, + notes = json.dumps(notes_payload), + completed_at = completed_at if status == 'completed' else None, + mobile_local_id = mobile_local_id, + parent_inspection_id = parent_inspection_id, ) db.session.add(inspection) @@ -276,7 +288,7 @@ def create_inspection(): log_action(ACTION_CREATE, 'Inspection', inspection.id, f'{template.name} @ {facility.name}', f'source=mobile; status={status}; score={overall_score}; ' - f'local_id={mobile_local_id}') + f'local_id={mobile_local_id}; parent_id={parent_inspection_id}') logger.info('API INSPECTIONS | created | inspection_id=%d | facility=%s | ' 'template=%s | status=%s | score=%s | user=%s',