Skip to content

Commit 5ea929d

Browse files
authored
Generate order_weight for generic templates (#7406)
* Generate order_weight for generic templates * set template, update test * exclude template from generated weights * update test * update test * update test case
1 parent c5ca844 commit 5ea929d

File tree

3 files changed

+129
-0
lines changed

3 files changed

+129
-0
lines changed

backend/infrahub/core/schema/schema_branch.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,6 +1826,8 @@ def _generate_weight_generics(self) -> None:
18261826
"""Generate order_weight for all generic schemas."""
18271827
for name in self.generic_names:
18281828
node = self.get(name=name, duplicate=False)
1829+
if node.namespace == "Template":
1830+
continue
18291831

18301832
items_to_update = [item for item in node.attributes + node.relationships if not item.order_weight]
18311833

@@ -1889,10 +1891,36 @@ def _generate_weight_templates(self) -> None:
18891891

18901892
self.set(name=name, schema=template)
18911893

1894+
def _generate_generics_templates_weight(self) -> None:
1895+
"""Generate order_weight for generic templates.
1896+
1897+
The order of the fields for the template must respect the order of the node.
1898+
"""
1899+
for name in self.generic_names:
1900+
generic_node = self.get(name=name, duplicate=False)
1901+
try:
1902+
template = self.get(name=self._get_object_template_kind(node_kind=generic_node.kind), duplicate=True)
1903+
except SchemaNotFoundError:
1904+
continue
1905+
1906+
generic_node_weights = {
1907+
item.name: item.order_weight
1908+
for item in generic_node.attributes + generic_node.relationships
1909+
if item.order_weight is not None
1910+
}
1911+
1912+
for item in template.attributes + template.relationships:
1913+
if item.order_weight:
1914+
continue
1915+
item.order_weight = generic_node_weights[item.name] if item.name in generic_node_weights else None
1916+
1917+
self.set(name=template.kind, schema=template)
1918+
18921919
def generate_weight(self) -> None:
18931920
self._generate_weight_generics()
18941921
self._generate_weight_nodes_profiles()
18951922
self._generate_weight_templates()
1923+
self._generate_generics_templates_weight()
18961924

18971925
def cleanup_inherited_elements(self) -> None:
18981926
for name in self.node_names:

backend/tests/unit/core/schema_manager/test_manager_schema.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,106 @@ def extract_weights(schema: SchemaBranch):
605605
assert len(in_second) == 1 and in_second[0].startswith(new_attr2_partial_id)
606606

607607

608+
def test_schema_branch_processes_generic_template_schema_weight(register_core_models_schema):
609+
schema = {
610+
"generics": [
611+
{
612+
"name": "GenericDevice",
613+
"namespace": "Dcim",
614+
"description": "Generic Device object.",
615+
"label": "Device",
616+
"icon": "mdi:server",
617+
"human_friendly_id": ["name__value"],
618+
"order_by": ["name__value"],
619+
"display_labels": ["name__value"],
620+
"generate_template": True,
621+
"attributes": [
622+
{"name": "name", "kind": "Text", "unique": True, "order_weight": 7000},
623+
{"name": "description", "kind": "Text", "optional": True, "order_weight": 8000},
624+
{"name": "os_version", "kind": "Text", "optional": True, "order_weight": 5200},
625+
],
626+
"relationships": [
627+
{
628+
"name": "tags",
629+
"peer": "BuiltinTag",
630+
"optional": True,
631+
"cardinality": "many",
632+
"kind": "Attribute",
633+
"order_weight": 3000,
634+
},
635+
],
636+
},
637+
core_object_template,
638+
core_object_component_template,
639+
],
640+
"nodes": [
641+
{
642+
"name": "Tag",
643+
"namespace": "Builtin",
644+
"label": "Tag",
645+
"default_filter": "name__value",
646+
"attributes": [
647+
{"name": "name", "kind": "Text", "label": "Name", "unique": True},
648+
{
649+
"name": "description",
650+
"kind": "Text",
651+
"label": "Description",
652+
"optional": True,
653+
"branch": BranchSupportType.AGNOSTIC.value,
654+
},
655+
],
656+
},
657+
],
658+
}
659+
schema_branch = SchemaBranch(cache={}, name="test")
660+
schema_branch.load_schema(schema=SchemaRoot(**schema))
661+
schema_branch.process()
662+
663+
template = schema_branch.get(name="TemplateDcimGenericDevice", duplicate=False)
664+
dcim_generic_device = schema_branch.get(name="DcimGenericDevice", duplicate=False)
665+
666+
assert template.get_attribute(name="template_name").order_weight == 1000
667+
assert (
668+
template.get_attribute(name="description").order_weight
669+
== dcim_generic_device.get_attribute(name="description").order_weight
670+
== 8000
671+
)
672+
assert (
673+
template.get_attribute(name="os_version").order_weight
674+
== dcim_generic_device.get_attribute(name="os_version").order_weight
675+
== 5200
676+
)
677+
assert (
678+
template.get_relationship(name="tags").order_weight
679+
== dcim_generic_device.get_relationship(name="tags").order_weight
680+
== 3000
681+
)
682+
683+
schema_2 = copy.deepcopy(schema)
684+
schema_2["generics"][0]["attributes"] = [
685+
{"name": "name", "kind": "Text", "unique": False},
686+
{"name": "description", "kind": "Text", "optional": True},
687+
{"name": "os_version", "kind": "Text", "optional": True},
688+
]
689+
schema_branch.load_schema(schema=SchemaRoot(**schema_2))
690+
schema_branch.process()
691+
692+
template = schema_branch.get(name="TemplateDcimGenericDevice", duplicate=False)
693+
dcim_generic_device = schema_branch.get(name="DcimGenericDevice", duplicate=False)
694+
695+
assert (
696+
template.get_attribute(name="name").order_weight == dcim_generic_device.get_attribute(name="name").order_weight
697+
)
698+
assert (
699+
template.get_attribute(name="description").order_weight
700+
== dcim_generic_device.get_attribute(name="description").order_weight
701+
)
702+
assert (
703+
template.get_attribute(name="os_version").order_weight
704+
== dcim_generic_device.get_attribute(name="os_version").order_weight
705+
)
706+
707+
608708
async def test_schema_branch_add_profile_schema(schema_all_in_one):
609709
core_profile_schema = _get_schema_by_kind(core_models, kind=InfrahubKind.PROFILE)
610710
schema_all_in_one["generics"].append(core_profile_schema)

changelog/7157.added.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Generate order_weight for generic templates

0 commit comments

Comments
 (0)