diff --git a/services/api-server/src/api_server/main.py b/services/api-server/src/api_server/main.py index 006a096..e072c1e 100644 --- a/services/api-server/src/api_server/main.py +++ b/services/api-server/src/api_server/main.py @@ -108,7 +108,6 @@ from api_server.metadata_tree_builder import ( _metadata_tree_children_for_node, _metadata_tree_path_for_node, _metadata_tree_path_steps, - _normalized_all_groups, _normalized_metadata_tree_children_for_node, _project_metadata_tree_response as _builder_project_metadata_tree_response, _project_metadata_tree_response_from_normalized as _builder_project_metadata_tree_response_from_normalized, @@ -121,6 +120,11 @@ from api_server.metadata_tree_models import ( MetadataTreeSearchResponse, ProjectMetadataTreeResponse, ) +from api_server.normalized_project_models import NormalizedProjectSummary +from api_server.normalized_project_service import ( + normalized_all_groups as _normalized_all_groups, + normalized_project_summary as _normalized_project_summary, +) from impact_engine import object_impact, routine_impact from incremental_indexer import rebuild_changed_file from integration_topology import IntegrationKind, build_integration_topology @@ -925,31 +929,6 @@ class ImportSyncPreview(BaseModel): items: list[ImportSyncDiffItem] = Field(default_factory=list) -class NormalizedGroupSummary(BaseModel): - name: str - object_kind: str - object_count: int - - -class NormalizedProjectSummary(BaseModel): - project_id: str | None = None - source_path: str | None = None - group_count: int = 0 - object_count: int = 0 - attribute_count: int = 0 - tabular_section_count: int = 0 - form_count: int = 0 - command_count: int = 0 - role_count: int = 0 - rights_count: int = 0 - module_count: int = 0 - layout_count: int = 0 - movement_count: int = 0 - extension_count: int = 0 - extensions: list[str] = Field(default_factory=list) - groups: list[NormalizedGroupSummary] = Field(default_factory=list) - - class NormalizedObjectDetail(BaseModel): project_id: str | None = None group_name: str @@ -7429,49 +7408,6 @@ def _load_normalized_project(project_id: str) -> NormalizedProject | None: return normalized -def _normalized_project_summary(normalized: NormalizedProject) -> NormalizedProjectSummary: - all_groups = _normalized_all_groups(normalized) - objects = [item for group in all_groups for item in group.objects] - return NormalizedProjectSummary( - project_id=normalized.project_id, - source_path=normalized.source_path, - group_count=len(all_groups), - object_count=len(objects), - attribute_count=sum( - len(item.attributes) - + sum(_normalized_part_descendant_count(section, "ATTRIBUTE") for section in item.tabular_sections) - + sum(_normalized_part_descendant_count(form, "ATTRIBUTE") for form in item.forms) - for item in objects - ), - tabular_section_count=sum(len(item.tabular_sections) for item in objects), - form_count=sum(len(item.forms) for item in objects), - command_count=sum(len(item.commands) for item in objects), - role_count=sum(1 for item in objects if item.object_kind == "ROLE"), - rights_count=sum(len(item.rights) for item in objects), - module_count=sum(len(item.modules) for item in objects), - layout_count=sum(len(item.layouts) for item in objects), - movement_count=sum(len(item.movements) for item in objects), - extension_count=len(normalized.configuration.extensions), - extensions=[item.name for item in normalized.configuration.extensions], - groups=[ - NormalizedGroupSummary( - name=group.name, - object_kind=", ".join(group.object_kinds), - object_count=len(group.objects), - ) - for group in all_groups - ], - ) - - -def _normalized_part_descendant_count(part, kind: str | None = None) -> int: - children = getattr(part, "children", []) - return sum( - (1 if kind is None or child.kind == kind else 0) + _normalized_part_descendant_count(child, kind) - for child in children - ) - - def _quality_check( code: str, title: str, diff --git a/services/api-server/src/api_server/normalized_project_models.py b/services/api-server/src/api_server/normalized_project_models.py new file mode 100644 index 0000000..22a3652 --- /dev/null +++ b/services/api-server/src/api_server/normalized_project_models.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +from pydantic import BaseModel, Field + + +class NormalizedGroupSummary(BaseModel): + name: str + object_kind: str + object_count: int + + +class NormalizedProjectSummary(BaseModel): + project_id: str | None = None + source_path: str | None = None + group_count: int = 0 + object_count: int = 0 + attribute_count: int = 0 + tabular_section_count: int = 0 + form_count: int = 0 + command_count: int = 0 + role_count: int = 0 + rights_count: int = 0 + module_count: int = 0 + layout_count: int = 0 + movement_count: int = 0 + extension_count: int = 0 + extensions: list[str] = Field(default_factory=list) + groups: list[NormalizedGroupSummary] = Field(default_factory=list) diff --git a/services/api-server/src/api_server/normalized_project_service.py b/services/api-server/src/api_server/normalized_project_service.py new file mode 100644 index 0000000..691820b --- /dev/null +++ b/services/api-server/src/api_server/normalized_project_service.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +from api_server.normalized_project_models import NormalizedGroupSummary, NormalizedProjectSummary +from one_c_normalizer import NormalizedProject + + +def normalized_all_groups(normalized: NormalizedProject): + groups = list(normalized.configuration.groups) + for extension in normalized.configuration.extensions: + groups.extend(extension.groups) + return groups + + +def normalized_project_summary(normalized: NormalizedProject) -> NormalizedProjectSummary: + all_groups = normalized_all_groups(normalized) + objects = [item for group in all_groups for item in group.objects] + return NormalizedProjectSummary( + project_id=normalized.project_id, + source_path=normalized.source_path, + group_count=len(all_groups), + object_count=len(objects), + attribute_count=sum( + len(item.attributes) + + sum(normalized_part_descendant_count(section, "ATTRIBUTE") for section in item.tabular_sections) + + sum(normalized_part_descendant_count(form, "ATTRIBUTE") for form in item.forms) + for item in objects + ), + tabular_section_count=sum(len(item.tabular_sections) for item in objects), + form_count=sum(len(item.forms) for item in objects), + command_count=sum(len(item.commands) for item in objects), + role_count=sum(1 for item in objects if item.object_kind == "ROLE"), + rights_count=sum(len(item.rights) for item in objects), + module_count=sum(len(item.modules) for item in objects), + layout_count=sum(len(item.layouts) for item in objects), + movement_count=sum(len(item.movements) for item in objects), + extension_count=len(normalized.configuration.extensions), + extensions=[item.name for item in normalized.configuration.extensions], + groups=[ + NormalizedGroupSummary( + name=group.name, + object_kind=", ".join(group.object_kinds), + object_count=len(group.objects), + ) + for group in all_groups + ], + ) + + +def normalized_part_descendant_count(part, kind: str | None = None) -> int: + children = getattr(part, "children", []) + return sum( + (1 if kind is None or child.kind == kind else 0) + normalized_part_descendant_count(child, kind) + for child in children + )