Fix form selection and common form rendering
CI / python (push) Has been cancelled
CI / rust (push) Has been cancelled

This commit is contained in:
2026-05-21 17:03:32 +03:00
parent a5e0c8bf0f
commit 9f1f1a8ee1
3 changed files with 82 additions and 10 deletions
+59 -5
View File
@@ -4748,12 +4748,20 @@ async def get_object_ui(project_id: str, object_name: str) -> ObjectUiResponse:
snapshot, graph = _snapshot_and_graph(project_id)
object_node = _find_graph_node(graph, object_name, _ACCESS_TARGET_KINDS)
if object_node is None:
object_node = _find_graph_node(graph, object_name, {NodeKind.FORM})
if object_node is None:
common_form = _common_form_ui_from_source(project_id, object_name)
if common_form is not None:
return common_form
raise HTTPException(status_code=404, detail=f"Object not found: {object_name}")
form_lineages = {
edge.target_lineage
for edge in graph.edges.values()
if edge.kind == EdgeKind.HAS_FORM and edge.source_lineage == object_node.lineage_id
}
if object_node.kind == NodeKind.FORM:
form_lineages = {object_node.lineage_id}
else:
form_lineages = {
edge.target_lineage
for edge in graph.edges.values()
if edge.kind == EdgeKind.HAS_FORM and edge.source_lineage == object_node.lineage_id
}
return ObjectUiResponse(
object=_named_node(object_node),
forms=_hydrate_object_ui_forms_from_source(
@@ -7924,6 +7932,52 @@ def _hydrate_object_ui_forms_from_source(
]
def _common_form_ui_from_source(project_id: str, object_name: str) -> ObjectUiResponse | None:
if not object_name.startswith("ОбщаяФорма."):
return None
source_root = _current_project_source_root(project_id)
if source_root is None:
return None
form_name = object_name.split(".", 1)[1]
form_file = _edt_form_file_for_object(source_root, object_name, form_name)
if form_file is None:
return None
try:
xml_objects = parse_one_c_xml_file(form_file)
except (OSError, UnicodeDecodeError, ET.ParseError):
return None
form_object = next((item for item in xml_objects if item.object_kind == "FORM"), None)
if form_object is None:
return None
source_path = form_file.as_posix()
form_node = NamedNode(
lineage_id=make_lineage_id(
NodeKind.FORM.value,
f"{project_id}:{source_path}:FORM:{form_object.qualified_name}",
),
kind=NodeKind.FORM.value,
name=form_object.name,
qualified_name=form_object.qualified_name,
attributes=form_object.attributes,
)
elements = [
NamedNode(
lineage_id=make_lineage_id(
NodeKind.FORM_ELEMENT.value,
f"{project_id}:{source_path}:ELEMENT:{item.qualified_name}",
),
kind=NodeKind.FORM_ELEMENT.value,
name=item.name,
qualified_name=item.qualified_name,
attributes=item.attributes,
)
for item in xml_objects
if item.object_kind == "ELEMENT" and item.qualified_name.startswith(f"{form_node.qualified_name}.")
]
form = FormSemanticsResponse(form=form_node, commands=[], elements=elements, command_handlers={})
return ObjectUiResponse(object=form_node, forms=[form])
def _hydrate_form_elements_from_source(
project_id: str,
source_root: Path,