Compose name-first form write plans
This commit is contained in:
@@ -41169,14 +41169,29 @@ def metadata_saved_state_forms_search(payload: dict[str, Any]) -> dict[str, Any]
|
||||
break
|
||||
if len(rows) >= int(limit or 50):
|
||||
break
|
||||
public_rows = rows if include_storage else [
|
||||
public_saved_state_form_search_row(
|
||||
row,
|
||||
requested_owner_kind=owner_kind,
|
||||
requested_extension=extension_filter or None,
|
||||
)
|
||||
for row in rows
|
||||
]
|
||||
extension_names_by_guid: dict[str, str] = {}
|
||||
if not include_storage and not extension_filter and any(row.get("table") == "ConfigCASSave" for row in rows):
|
||||
extension_names_by_guid = {
|
||||
guid: str(item.get("name") or guid)
|
||||
for guid, item in extension_map_by_guid(base_id).items()
|
||||
}
|
||||
public_rows = rows if include_storage else []
|
||||
if not include_storage:
|
||||
for row in rows:
|
||||
row_extension = extension_filter or None
|
||||
if not row_extension and row.get("table") == "ConfigCASSave":
|
||||
row_source = row.get("source") if isinstance(row.get("source"), dict) else {}
|
||||
row_file_name = str(row.get("file_name") or row_source.get("file_name") or "")
|
||||
extension_guid_from_file = row_file_name.split("__", 1)[0].strip().lower() if "__" in row_file_name else ""
|
||||
if extension_guid_from_file:
|
||||
row_extension = extension_names_by_guid.get(extension_guid_from_file)
|
||||
public_rows.append(
|
||||
public_saved_state_form_search_row(
|
||||
row,
|
||||
requested_owner_kind=owner_kind,
|
||||
requested_extension=row_extension,
|
||||
)
|
||||
)
|
||||
return {
|
||||
"schema": "onec_saved_state_form_search.v1",
|
||||
"status": "ok",
|
||||
@@ -46265,6 +46280,26 @@ def metadata_write_plan_apply_payload_hint(
|
||||
hint["payload"]["attribute"] = path_resolution.get("attribute_name")
|
||||
elif form_member_path:
|
||||
hint["payload"]["element"] = form_member_path[-1]
|
||||
for field in (
|
||||
"extension",
|
||||
"ref",
|
||||
"object_ref",
|
||||
"form",
|
||||
"form_name",
|
||||
"command",
|
||||
"element",
|
||||
"element_name",
|
||||
"attribute",
|
||||
"element_path",
|
||||
"element_id",
|
||||
"id",
|
||||
):
|
||||
value = target.get(field) if target.get(field) not in (None, "") else payload.get(field)
|
||||
if value not in (None, ""):
|
||||
hint["payload"][field] = value
|
||||
edits = payload.get("edits") if isinstance(payload.get("edits"), list) else intent.get("edits")
|
||||
if isinstance(edits, list) and edits:
|
||||
hint["payload"]["edits"] = edits
|
||||
for field in ("table", "property", "value"):
|
||||
value = metadata_write_plan_first_value(payload, target, intent, field)
|
||||
if value is not None:
|
||||
@@ -46681,6 +46716,115 @@ def metadata_write_plan_resolve_public_module_target(
|
||||
}
|
||||
|
||||
|
||||
def metadata_write_plan_resolve_public_form_target(
|
||||
payload: dict[str, Any],
|
||||
target: dict[str, Any],
|
||||
intent: dict[str, Any],
|
||||
) -> tuple[dict[str, Any], dict[str, Any]]:
|
||||
"""Resolve a public 1C form selector to an internal saved-state handle."""
|
||||
selector_ref = str(target.get("ref") or target.get("object_ref") or payload.get("ref") or payload.get("object_ref") or "").strip()
|
||||
selector_kind = str(
|
||||
target.get("object_kind")
|
||||
or target.get("object_type")
|
||||
or payload.get("object_kind")
|
||||
or payload.get("object_type")
|
||||
or ""
|
||||
).strip()
|
||||
selector_name = str(target.get("object_name") or payload.get("object_name") or "").strip()
|
||||
form_name = str(target.get("form") or target.get("form_name") or payload.get("form") or payload.get("form_name") or "").strip()
|
||||
parsed_ref = parse_1c_object_path(selector_ref) if selector_ref else {}
|
||||
if not selector_kind and parsed_ref.get("kind"):
|
||||
selector_kind = str(parsed_ref.get("kind") or "")
|
||||
if not selector_name and parsed_ref.get("name"):
|
||||
selector_name = str(parsed_ref.get("name") or "")
|
||||
if not form_name and canonical_kind(selector_kind) == "CommonForm":
|
||||
form_name = selector_name
|
||||
extension = str(target.get("extension") or payload.get("extension") or "").strip()
|
||||
member_selector: dict[str, Any] = {}
|
||||
for key in ("command", "element", "element_name", "attribute", "element_path", "element_id", "id"):
|
||||
value = target.get(key) if target.get(key) not in (None, "") else payload.get(key)
|
||||
if value not in (None, ""):
|
||||
member_selector[key] = value
|
||||
|
||||
public_selector = {
|
||||
**({"extension": extension} if extension else {}),
|
||||
**({"ref": selector_ref} if selector_ref else {}),
|
||||
**({"kind": canonical_kind(selector_kind)} if selector_kind and not selector_ref else {}),
|
||||
**({"name": selector_name} if selector_name and not selector_ref else {}),
|
||||
**({"form": form_name} if form_name else {}),
|
||||
**member_selector,
|
||||
}
|
||||
if not (selector_ref or (selector_kind and selector_name)):
|
||||
return target, {
|
||||
"status": "not_attempted",
|
||||
"error": "public_object_selector_missing",
|
||||
"selector": public_selector,
|
||||
}
|
||||
if not form_name and canonical_kind(selector_kind) != "CommonForm":
|
||||
return target, {
|
||||
"status": "not_attempted",
|
||||
"error": "public_form_selector_missing",
|
||||
"selector": public_selector,
|
||||
}
|
||||
|
||||
first_edit = next(
|
||||
(item for item in payload.get("edits") or [] if isinstance(item, dict)),
|
||||
{},
|
||||
)
|
||||
property_name = metadata_write_plan_first_value(payload, target, intent, "property")
|
||||
if property_name in (None, ""):
|
||||
property_name = first_edit.get("property")
|
||||
value_present = any(
|
||||
isinstance(source, dict) and "value" in source
|
||||
for source in (intent, target, payload, first_edit)
|
||||
)
|
||||
property_value = metadata_write_plan_first_value(payload, target, intent, "value")
|
||||
if "value" in first_edit and property_value is None:
|
||||
property_value = first_edit.get("value")
|
||||
|
||||
resolve_payload: dict[str, Any] = {
|
||||
"base_id": payload.get("base_id"),
|
||||
"table": str(target.get("table") or payload.get("table") or ("ConfigCASSave" if extension else "ConfigSave")),
|
||||
"include_storage": True,
|
||||
"search_limit": int(payload.get("search_limit") or 10),
|
||||
"scan_limit": int(payload.get("scan_limit") or 1000),
|
||||
"timeout_seconds": int(payload.get("timeout_seconds") or 60),
|
||||
**public_selector,
|
||||
**({"property": property_name} if property_name not in (None, "") else {}),
|
||||
**({"value": property_value} if value_present else {}),
|
||||
}
|
||||
resolved = metadata_form_write_target_resolve(resolve_payload)
|
||||
if resolved.get("status") != "ok":
|
||||
return target, {
|
||||
"status": str(resolved.get("status") or "error"),
|
||||
"error": "public_form_target_not_resolved",
|
||||
"selector": public_selector,
|
||||
"resolution_status": resolved.get("status"),
|
||||
**({"counts": resolved.get("counts")} if isinstance(resolved.get("counts"), dict) else {}),
|
||||
}
|
||||
|
||||
source = resolved.get("source") if isinstance(resolved.get("source"), dict) else {}
|
||||
file_name = str(source.get("file_name") or "").strip()
|
||||
table = str(source.get("table") or resolve_payload.get("table") or "").strip()
|
||||
if not file_name or table not in FORM_ELEMENT_SAVED_STATE_TABLES:
|
||||
return target, {
|
||||
"status": "error",
|
||||
"error": "public_form_target_storage_handle_missing",
|
||||
"selector": public_selector,
|
||||
}
|
||||
resolved_target = {
|
||||
**target,
|
||||
"table": table,
|
||||
"file_name": file_name,
|
||||
}
|
||||
return resolved_target, {
|
||||
"status": "resolved",
|
||||
"method": FORM_WRITE_TARGET_RESOLVE_METHOD,
|
||||
"selector": public_selector,
|
||||
"counts": {"matches": int((resolved.get("counts") or {}).get("matches") or 1)},
|
||||
}
|
||||
|
||||
|
||||
def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
|
||||
method = METADATA_WRITE_PLAN_METHOD
|
||||
target = dict(payload.get("target")) if isinstance(payload.get("target"), dict) else {}
|
||||
@@ -46695,6 +46839,7 @@ def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
|
||||
)
|
||||
target_kind_hint = str(target_kind_raw or "").strip().casefold()
|
||||
module_name_resolution: dict[str, Any] | None = None
|
||||
form_name_resolution: dict[str, Any] | None = None
|
||||
has_public_module_selector = bool(
|
||||
target.get("ref")
|
||||
or target.get("object_ref")
|
||||
@@ -46706,6 +46851,17 @@ def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
|
||||
and has_public_module_selector
|
||||
):
|
||||
target, module_name_resolution = metadata_write_plan_resolve_public_module_target(payload, target)
|
||||
has_public_form_selector = bool(
|
||||
target.get("ref")
|
||||
or target.get("object_ref")
|
||||
or ((target.get("object_kind") or target.get("object_type")) and target.get("object_name"))
|
||||
) and bool(target.get("form") or target.get("form_name") or target.get("command") or target.get("element") or target.get("attribute"))
|
||||
if (
|
||||
target_kind_hint in {"form", "форма"}
|
||||
and not metadata_write_concrete_reference_info(payload, target)
|
||||
and has_public_form_selector
|
||||
):
|
||||
target, form_name_resolution = metadata_write_plan_resolve_public_form_target(payload, target, intent)
|
||||
|
||||
canonical_path = str(
|
||||
target.get("canonical_path")
|
||||
@@ -46757,6 +46913,14 @@ def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
|
||||
"resolution_status": module_name_resolution.get("status"),
|
||||
}
|
||||
)
|
||||
if form_name_resolution and form_name_resolution.get("status") != "resolved":
|
||||
problems.append(
|
||||
{
|
||||
"code": str(form_name_resolution.get("error") or "public_form_target_not_resolved"),
|
||||
"message": "The public 1C form selector did not resolve to exactly one saved-state form target.",
|
||||
"resolution_status": form_name_resolution.get("status"),
|
||||
}
|
||||
)
|
||||
if not path_resolution.get("is_full_path") and not concrete_reference:
|
||||
problems.append(
|
||||
{
|
||||
@@ -46833,6 +46997,8 @@ def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
|
||||
}
|
||||
if module_name_resolution:
|
||||
route["name_resolution"] = module_name_resolution
|
||||
elif form_name_resolution:
|
||||
route["name_resolution"] = form_name_resolution
|
||||
if extension_action:
|
||||
route["extension_action"] = extension_action
|
||||
if operation_was_inferred_from_extension_action:
|
||||
|
||||
Reference in New Issue
Block a user