Spaces:
Sleeping
Sleeping
File size: 5,290 Bytes
4a5269c 7cbc4cf 4a5269c 7cbc4cf 4a5269c 7cbc4cf 4a5269c 7cbc4cf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | from __future__ import annotations
import json
from pathlib import Path
from typing import Any, Dict, List
TEMPLATES_DIR = Path(__file__).resolve().parents[1] / "templates"
FIELDS: List[Dict[str, Any]] = [
{"field_id": "facility_organization", "label": "Facility / Organization", "type": "entity"},
{"field_id": "case_location", "label": "Case Location / Address", "type": "text"},
{"field_id": "vendor", "label": "Vendor", "type": "entity"},
{"field_id": "physician_name", "label": "Physician Name", "type": "person"},
{"field_id": "date_of_surgery", "label": "Date of Surgery", "type": "date"},
{"field_id": "items", "label": "Items / Line Items", "type": "table"},
]
TABLE_ANCHORS = [
{"key": "item_number", "expected_text": "Item Number"},
{"key": "description", "expected_text": "Description"},
{"key": "qty", "expected_text": "Qty"},
]
# Canonical line-item column set. Keep in sync with the UI (src/App.jsx) and prompts.py.
TABLE_COLUMNS = [
{"key": "item_number", "label": "Item Number"},
{"key": "lot_number", "label": "Lot Number"},
{"key": "description", "label": "Description"},
{"key": "qty", "label": "Qty"},
{"key": "price", "label": "Price"},
{"key": "total", "label": "Total"},
{"key": "bundle", "label": "Bundle"},
]
def schema_skeleton(form_id: str) -> Dict[str, Any]:
return {
"form_id": form_id,
"version": 3,
"page": 1,
"scalar_value_region_mode": "offset_from_anchor_v1",
"fields": [
# scalar fields
{
"field_id": "facility_organization",
"label": "Facility / Organization",
"type": "entity",
"anchor_bbox_norm": None,
"value_bbox_norm": None,
"value_offset_norm": None,
},
{
"field_id": "case_location",
"label": "Case Location / Address",
"type": "text",
"anchor_bbox_norm": None,
"value_bbox_norm": None,
"value_offset_norm": None,
},
{
"field_id": "vendor",
"label": "Vendor",
"type": "entity",
"anchor_bbox_norm": None,
"value_bbox_norm": None,
"value_offset_norm": None,
},
{
"field_id": "physician_name",
"label": "Physician Name",
"type": "person",
"anchor_bbox_norm": None,
"value_bbox_norm": None,
"value_offset_norm": None,
},
{
"field_id": "date_of_surgery",
"label": "Date of Surgery",
"type": "date",
"anchor_bbox_norm": None,
"value_bbox_norm": None,
"value_offset_norm": None,
},
# table field
{
"field_id": "items",
"label": "Items / Line Items",
"type": "table",
"table_bbox_norm": None,
"header_bbox_norm": None,
"row_height_hint_norm": None,
"columns": [
{"key": "item_number", "label": "Item Number", "bbox_rel_norm": None},
{"key": "lot_number", "label": "Lot Number", "bbox_rel_norm": None},
{"key": "description", "label": "Description", "bbox_rel_norm": None},
{"key": "qty", "label": "Qty", "bbox_rel_norm": None},
{"key": "price", "label": "Price", "bbox_rel_norm": None},
{"key": "total", "label": "Total", "bbox_rel_norm": None},
{"key": "bundle", "label": "Bundle", "bbox_rel_norm": None},
],
"table_anchors": [
{"key": "item_number", "expected_text": "Item Number", "bbox_norm": None},
{"key": "description", "expected_text": "Description", "bbox_norm": None},
{"key": "qty", "expected_text": "Qty", "bbox_norm": None},
],
"notes": "Anchors are used at runtime to localize table/header/columns under drift.",
},
],
"notes": "Trainer exports config only. Runtime should localize anchors then apply offsets/table mappings to extract values + line items.",
}
def main() -> None:
if not TEMPLATES_DIR.exists():
raise SystemExit(f"templates dir not found: {TEMPLATES_DIR}")
files = sorted(TEMPLATES_DIR.glob("*.json"))
if not files:
raise SystemExit(f"No template json files found in: {TEMPLATES_DIR}")
updated = 0
for fp in files:
data = json.loads(fp.read_text(encoding="utf-8"))
template_id = (data.get("template_id") or fp.stem).strip()
# Overwrite or create schema skeleton
data["schema"] = schema_skeleton(form_id=f"template_{template_id}")
fp.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
print(f"updated schema skeleton: {fp}")
updated += 1
print(f"done. updated {updated} template files.")
if __name__ == "__main__":
main()
|