Jul 16 - Fill the gaps between Single-tenant mode and Multi-tenant mode - MT2

This commit is contained in:
2026-07-16 16:59:17 -04:00
parent 8ff38578ad
commit a60afc6c41
10 changed files with 478 additions and 44 deletions
+47 -4
View File
@@ -657,6 +657,27 @@ def _notes_section(inspection):
# ── Public entry point ────────────────────────────────────────────────────────
def _collect_media_keys(form_data):
"""Return the set of 'uploads/...' storage keys referenced in form_data
(image field values, including any nested in lists/dicts). Signature values
are inline 'data:' base64 and are naturally excluded."""
keys = set()
def _walk(v):
if isinstance(v, str):
if v.startswith('uploads/'):
keys.add(v)
elif isinstance(v, dict):
for x in v.values():
_walk(x)
elif isinstance(v, (list, tuple)):
for x in v:
_walk(x)
_walk(form_data or {})
return keys
def generate_inspection_pdf(inspection, form_fields, form_data, issues,
static_folder) -> bytes:
"""
@@ -674,6 +695,14 @@ def generate_inspection_pdf(inspection, form_fields, form_data, issues,
generated_at = datetime.now().strftime('%B %d, %Y %I:%M %p ET')
report_title = f'Inspection Report — {inspection.template.name}'
# Make referenced photos available as local file paths for ReportLab/PIL.
# local backend: no-op (returns the real static folder); s3 backend:
# downloads the form's image keys to a temp dir. Cleaned up after build.
from app.utils import storage
static_folder, _cleanup_media = storage.materialize_to_dir(
_collect_media_keys(form_data)
)
doc = SimpleDocTemplate(
buf,
pagesize=letter,
@@ -723,8 +752,11 @@ def generate_inspection_pdf(inspection, form_fields, form_data, issues,
]))
story.append(sig_tbl)
doc.build(story, onFirstPage=_page_cb, onLaterPages=_page_cb)
return buf.getvalue()
try:
doc.build(story, onFirstPage=_page_cb, onLaterPages=_page_cb)
return buf.getvalue()
finally:
_cleanup_media()
# ══════════════════════════════════════════════════════════════════════════════
@@ -743,6 +775,14 @@ def generate_issue_pdf(issue, static_folder: str) -> bytes:
generated_at = datetime.now().strftime('%B %d, %Y %I:%M %p ET')
report_title = f'Issue Report — Issue #{issue.id}'
# Make referenced photos available as local file paths for ReportLab/PIL.
# local backend: no-op; s3 backend: downloads the issue's photo keys to a
# temp dir. Cleaned up after build.
from app.utils import storage
_issue_keys = [issue.photo_path] + list(issue.mobile_photo_paths or []) \
+ list(issue.result_photos or [])
static_folder, _cleanup_media = storage.materialize_to_dir(_issue_keys)
doc = SimpleDocTemplate(
buf,
pagesize=letter,
@@ -936,8 +976,11 @@ def generate_issue_pdf(issue, static_folder: str) -> bytes:
]))
story.append(v_tbl)
doc.build(story, onFirstPage=_page_cb, onLaterPages=_page_cb)
return buf.getvalue()
try:
doc.build(story, onFirstPage=_page_cb, onLaterPages=_page_cb)
return buf.getvalue()
finally:
_cleanup_media()
# ══════════════════════════════════════════════════════════════════════════════