baocaodulieu / lib /report_fields.py
hoangthiencm's picture
Upload 13 files
3cf8a00 verified
"""
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 ""),
}