|
|
|
|
@ -337,43 +337,55 @@ def _normalize_devices(payload):
|
|
|
|
|
index
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
device_terminals = item.get("terminals", [])
|
|
|
|
|
if device_terminals is None:
|
|
|
|
|
device_terminals = []
|
|
|
|
|
if not isinstance(device_terminals, list):
|
|
|
|
|
raise ExchangeValidationError(
|
|
|
|
|
"Field 'terminals' in device entry #{0} must be a list.".format(index)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
normalized_terminals = []
|
|
|
|
|
for terminal_index, terminal_item in enumerate(device_terminals):
|
|
|
|
|
terminal_entry_label = "device entry #{0} terminal entry #{1}".format(
|
|
|
|
|
index, terminal_index
|
|
|
|
|
)
|
|
|
|
|
if not isinstance(terminal_item, dict):
|
|
|
|
|
raise ExchangeValidationError(
|
|
|
|
|
"{0} must be an object.".format(terminal_entry_label.capitalize())
|
|
|
|
|
)
|
|
|
|
|
terminal_uuid = _require_string(terminal_item, "terminal_uuid")
|
|
|
|
|
terminal_element_uuid = _optional_string(
|
|
|
|
|
terminal_item, "element_uuid", terminal_entry_label
|
|
|
|
|
) or element_uuid
|
|
|
|
|
normalized_terminals.append(
|
|
|
|
|
{
|
|
|
|
|
"terminal_uuid": terminal_uuid,
|
|
|
|
|
"instance_id": _normalize_instance_id(terminal_item)
|
|
|
|
|
or _normalize_instance_id(item),
|
|
|
|
|
"element_uuid": terminal_element_uuid,
|
|
|
|
|
"terminal_display": _optional_string(
|
|
|
|
|
terminal_item, "terminal_display", terminal_entry_label
|
|
|
|
|
),
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
normalized.append(
|
|
|
|
|
{
|
|
|
|
|
"element_uuid": element_uuid,
|
|
|
|
|
"instance_id": _normalize_instance_id(item),
|
|
|
|
|
"display_tag": display_tag.strip() if isinstance(display_tag, str) else "",
|
|
|
|
|
"terminals": normalized_terminals,
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
return normalized
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _normalize_terminals(payload):
|
|
|
|
|
terminals = payload.get("terminals", [])
|
|
|
|
|
if not isinstance(terminals, list):
|
|
|
|
|
raise ExchangeValidationError("Field 'terminals' must be a list.")
|
|
|
|
|
|
|
|
|
|
def _normalize_terminals(devices):
|
|
|
|
|
normalized = []
|
|
|
|
|
for index, item in enumerate(terminals):
|
|
|
|
|
if not isinstance(item, dict):
|
|
|
|
|
raise ExchangeValidationError(
|
|
|
|
|
"Terminal entry #{0} must be an object.".format(index)
|
|
|
|
|
)
|
|
|
|
|
terminal_uuid = _require_string(item, "terminal_uuid")
|
|
|
|
|
element_uuid = item.get("element_uuid", "")
|
|
|
|
|
if element_uuid and not isinstance(element_uuid, str):
|
|
|
|
|
raise ExchangeValidationError(
|
|
|
|
|
"Field 'element_uuid' in terminal entry #{0} must be a string.".format(
|
|
|
|
|
index
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
normalized.append(
|
|
|
|
|
{
|
|
|
|
|
"terminal_uuid": terminal_uuid,
|
|
|
|
|
"instance_id": _normalize_instance_id(item),
|
|
|
|
|
"element_uuid": element_uuid.strip() if isinstance(element_uuid, str) else "",
|
|
|
|
|
"terminal_display": _optional_string(item, "terminal_display", "terminal entry #{0}".format(index)),
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
for device in devices:
|
|
|
|
|
for terminal in device.get("terminals", []) or []:
|
|
|
|
|
normalized.append(dict(terminal))
|
|
|
|
|
return normalized
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -562,14 +574,16 @@ def load_exchange_payload(json_path):
|
|
|
|
|
if not isinstance(schema_version, str) or not schema_version.strip():
|
|
|
|
|
raise ExchangeValidationError("Field 'schema_version' must be a string.")
|
|
|
|
|
|
|
|
|
|
normalized_devices = _normalize_devices(payload)
|
|
|
|
|
|
|
|
|
|
normalized = {
|
|
|
|
|
"schema_version": schema_version.strip(),
|
|
|
|
|
"project_uuid": project_uuid,
|
|
|
|
|
"generated_at": payload.get("generated_at", ""),
|
|
|
|
|
"source": payload.get("source", {}),
|
|
|
|
|
"cabinet": _normalize_cabinet(payload),
|
|
|
|
|
"devices": _normalize_devices(payload),
|
|
|
|
|
"terminals": _normalize_terminals(payload),
|
|
|
|
|
"devices": normalized_devices,
|
|
|
|
|
"terminals": _normalize_terminals(normalized_devices),
|
|
|
|
|
"device_models": _normalize_device_models(payload),
|
|
|
|
|
"wires": _normalize_wires(payload),
|
|
|
|
|
}
|
|
|
|
|
|