Source code for PartSegCore.json_hooks
import local_migrator
from PartSegCore._old_json_hooks import part_hook
PLUGINS_STR = "plugins."
PLUGINS_STR_LEN = len(PLUGINS_STR)
[docs]class PartSegEncoder(local_migrator.Encoder):
pass
def _validate_plugin_prefix(dkt: dict):
if dkt["__class__"].startswith(PLUGINS_STR):
# workaround for plans exported from an old PartSeg bundle
dkt["__class__"] = dkt["__class__"][PLUGINS_STR_LEN:]
if "__class_version_dkt__" in dkt:
for name, value in list(dkt["__class_version_dkt__"].items()):
if name.startswith(PLUGINS_STR):
dkt["__class_version_dkt__"][name[PLUGINS_STR_LEN:]] = value
del dkt["__class_version_dkt__"][name]
def partseg_object_hook(dkt: dict):
if "__class__" in dkt:
_validate_plugin_prefix(dkt)
return local_migrator.object_hook(dkt)
if "__ReadOnly__" in dkt or "__Serializable__" in dkt or "__Enum__" in dkt:
if problematic_fields := local_migrator.check_for_errors_in_dkt_values(dkt):
dkt["__error__"] = f"Error in fields: {', '.join(problematic_fields)}"
return dkt
is_enum = "__Enum__" in dkt
for el in ("__Enum__", "__Serializable__", "__ReadOnly__"):
dkt.pop(el, None)
cls_str = dkt["__subtype__"]
del dkt["__subtype__"]
try:
dkt_migrated = local_migrator.REGISTER.migrate_data(cls_str, {}, dkt)
cls = local_migrator.REGISTER.get_class(cls_str)
return cls(**dkt_migrated)
except Exception: # pylint: disable=broad-except
dkt["__subtype__"] = cls_str
dkt["__Enum__" if is_enum else "__Serializable__"] = True
return part_hook(dkt)