""" Report fields helpers – normalize, extract text/attachment, build stored values. Shared logic used by admin and report routes. """ from lib.utils import slugify, sanitize_field_type def create_default_report_field(overrides: dict | None = None) -> dict: base = { "label": "Nội dung", "key": "noi_dung", "type": "text", "required": False, "allowEvidenceUpload": False, "generateEvidenceLink": False, } if overrides: base.update(overrides) return base def normalize_report_fields(fields_input, default_overrides: dict | None = None) -> list: rows = fields_input if isinstance(fields_input, list) else [] clean = [] for idx, f in enumerate(rows): if not isinstance(f, dict): continue label = str(f.get("label") or "").strip() raw_key = str(f.get("key") or "").strip() or label key = slugify(raw_key) or f"field_{idx + 1}" if not label: continue allow = bool(f.get("allowEvidenceUpload")) clean.append({ "key": key, "label": label, "type": sanitize_field_type(f.get("type")), "required": bool(f.get("required")), "allowEvidenceUpload": allow, "generateEvidenceLink": allow and bool(f.get("generateEvidenceLink")), }) if clean: return clean return [create_default_report_field(default_overrides)] def get_report_value_text(value) -> str: if isinstance(value, dict): return str(value.get("value") or "") return str(value or "") def get_report_value_attachment(value) -> dict: if not isinstance(value, dict): return {"evidenceUrl": "", "evidenceFileName": ""} return { "evidenceUrl": str(value.get("evidenceUrl") or ""), "evidenceFileName": str(value.get("evidenceFileName") or ""), } def build_stored_report_value(text_value: str, upload_result: dict | None = None): text = (text_value or "").strip() if not upload_result: return text return { "value": text, "evidenceUrl": str(upload_result.get("url") or ""), "evidenceFileName": str(upload_result.get("fileName") or ""), }