diff --git a/apps/assets/models/__init__.py b/apps/assets/models/__init__.py index 6e0621ba8..b4b0b8707 100644 --- a/apps/assets/models/__init__.py +++ b/apps/assets/models/__init__.py @@ -5,5 +5,6 @@ from .user import AdminUser, SystemUser from .label import Label from .cluster import * from .group import * +from .tree import * from .asset import * from .utils import * diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index 3677b04b5..a9b371637 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -36,6 +36,7 @@ class Asset(models.Model): port = models.IntegerField(default=22, verbose_name=_('Port')) groups = models.ManyToManyField(AssetGroup, blank=True, related_name='assets', verbose_name=_('Asset groups')) cluster = models.ForeignKey(Cluster, related_name='assets', default=default_cluster, on_delete=models.SET_DEFAULT, verbose_name=_('Cluster')) + nodes = models.ManyToManyField('assets.Node', blank=True, related_name='assets', verbose_name=_("Nodes")) is_active = models.BooleanField(default=True, verbose_name=_('Is active')) # Auth diff --git a/apps/assets/models/tree.py b/apps/assets/models/tree.py new file mode 100644 index 000000000..74268524c --- /dev/null +++ b/apps/assets/models/tree.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# + +from django.db import models +from django.utils.translation import ugettext_lazy as _ + + +__all__ = ['Node'] + + +class Node(models.Model): + id = models.CharField(primary_key=True, max_length=64) # '1:1:1:1' + name = models.CharField(max_length=128, verbose_name=_("Name")) + child_mark = models.IntegerField(default=0) + date_create = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.name + + @property + def level(self): + return len(self.id.split(':')) + + def get_next_child_id(self): + mark = self.child_mark + self.child_mark += 1 + self.save() + return "{}:{}".format(self.id, mark) + + def create_child(self, name): + child_id = self.get_next_child_id() + child = self.__class__.objects.create(id=child_id, name=name) + return child + + def get_children(self): + return self.__class__.objects.filter(id__regex=r'{}:[0-9]+$'.format(self.id)) + + def get_all_children(self): + return self.__class__.objects.filter(id__startswith='{}:'.format(self.id)) + + def get_assets(self): + from .asset import Asset + children = self.get_children() + assets = Asset.objects.filter(nodes__in=children) + return assets + + def get_all_assets(self): + from .asset import Asset + children = self.get_all_children() + assets = Asset.objects.filter(nodes__in=children) + return assets + + @classmethod + def root(cls): + obj, created = cls.objects.get_or_create( + id='0', defaults={"id": '0', 'name': "ROOT"} + ) + return obj