diff --git a/inv/models/object.py b/inv/models/object.py index 9a6d52d823aced14d6eddb389c83af875d33f357..042c35f12212dfcee1d8c7f149b6ac8c83518079 100644 --- a/inv/models/object.py +++ b/inv/models/object.py @@ -236,6 +236,20 @@ class Object(Document): return self.container.get_path() + [self.id] return [self.id] + @property + def level(self) -> int: + """ + Return level + :return: + """ + if not self.container: + return 0 + return len(self.get_path()) - 1 # self + + @property + def has_children(self) -> bool: + return bool(Object.objects.filter(container=self.id)) + def get_nested_ids(self): """ Return id of this and all nested object diff --git a/sa/models/administrativedomain.py b/sa/models/administrativedomain.py index 53cd0d9429a938d200d2066401d7c68343c3b26b..66dab6b3bc3562ee35104c7f11095b1f511337ee 100644 --- a/sa/models/administrativedomain.py +++ b/sa/models/administrativedomain.py @@ -186,6 +186,16 @@ class AdministrativeDomain(NOCModel): return self.parent.get_bioseg_floating_parent_segment() return None + @property + def level(self) -> int: + """ + Return level + :return: + """ + if not self.parent: + return 0 + return len(self.get_path()) - 1 # self + @classmethod def can_set_label(cls, label): return Label.get_effective_setting(label, setting="enable_administrativedomain") diff --git a/services/ui/models/utils.py b/services/ui/models/utils.py index d87edc5642ab64d2e591719d2596b1d38a448af9..6153fc9f80d387a12f6cc80716f212f8a407789e 100644 --- a/services/ui/models/utils.py +++ b/services/ui/models/utils.py @@ -20,6 +20,10 @@ class Reference(BaseModel): class LabelItem(BaseModel): id: str label: str + # For tree structure fields + parent: Optional[Reference] + level: Optional[int] + has_children: Optional[bool] class SummaryItem(BaseModel): diff --git a/services/ui/paths/administrativedomain.py b/services/ui/paths/administrativedomain.py index 99eb6541180e8b1fdac8d7fe24b792199d912337..7ddd9144e96c8720fd4a3f12da371b65e5c188bd 100644 --- a/services/ui/paths/administrativedomain.py +++ b/services/ui/paths/administrativedomain.py @@ -11,6 +11,7 @@ from fastapi import APIRouter # NOC modules from noc.sa.models.administrativedomain import AdministrativeDomain from noc.main.models.label import Label +from ..models.utils import LabelItem from ..models.administrativedomain import ( DefaultAdministrativeDomainItem, FormAdministrativeDomainItem, @@ -33,6 +34,16 @@ class AdministrativeDomainAPI(ModelResourceAPI[AdministrativeDomain]): ] sort_fields = ["name", "id", ("parent", "parent__name")] + @classmethod + def item_to_label(cls, item: AdministrativeDomain) -> LabelItem: + return LabelItem( + id=str(item.id), + label=str(item.name), + parent=get_reference(item.parent), + level=item.level, + has_children=item.has_children, + ) + @classmethod def item_to_default(cls, item: AdministrativeDomain) -> DefaultAdministrativeDomainItem: return DefaultAdministrativeDomainItem(