perf: directory service db

pull/15214/head
ibuler 2025-04-15 20:20:47 +08:00 committed by 老广
parent e286997090
commit 1fdd1036d3
8 changed files with 61 additions and 16 deletions

View File

@ -141,16 +141,14 @@ class Account(AbsConnectivity, LabeledMixin, BaseAccount, JSONFilterMixin):
def is_ds_account(self):
if self.username.startswith('@'):
return False
if self.platform.category == 'ds':
return True
return False
if not self.asset.is_directory_service:
return False
return True
@lazyproperty
def ds(self):
if not self.is_ds_account():
return None
if not hasattr(self.asset, 'ds'):
return None
return self.asset.ds
@lazyproperty

View File

@ -0,0 +1,22 @@
# Generated by Django 4.1.13 on 2025-04-15 11:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("assets", "0017_auto_20250407_1124"),
]
operations = [
migrations.AddField(
model_name="asset",
name="directory_services",
field=models.ManyToManyField(
related_name="assets",
to="assets.directoryservice",
verbose_name="Directory services",
),
),
]

View File

@ -0,0 +1,17 @@
# Generated by Django 4.1.13 on 2025-04-15 11:33
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("assets", "0018_asset_directory_services"),
]
operations = [
migrations.RemoveField(
model_name="platform",
name="ds",
),
]

View File

@ -175,6 +175,10 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
nodes = models.ManyToManyField(
'assets.Node', default=default_node, related_name='assets', verbose_name=_("Nodes")
)
directory_services = models.ManyToManyField(
'assets.DirectoryService', related_name='assets',
verbose_name=_("Directory services")
)
is_active = models.BooleanField(default=True, verbose_name=_('Active'))
gathered_info = models.JSONField(verbose_name=_('Gathered info'), default=dict, blank=True) # 资产的一些信息,如 硬件信息
custom_info = models.JSONField(verbose_name=_('Custom info'), default=dict)
@ -201,6 +205,10 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
info[i.name] = v
return info
@lazyproperty
def is_directory_service(self):
return self.category == const.Category.DS and hasattr(self, 'ds')
@lazyproperty
def spec_info(self):
instance = getattr(self, self.category, None)
@ -247,16 +255,16 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
@property
def all_accounts(self):
if not self.joined_dir_svc_id:
if not self.joined_dir_svc_ids:
queryset = self.accounts.all()
else:
queryset = self.accounts.model.objects.filter(asset__in=[self.id, self.joined_dir_svc_id])
queryset = self.accounts.model.objects.filter(asset__in=[self.id, *self.joined_dir_svc_ids])
return queryset
@lazyproperty
def all_valid_accounts(self):
queryset = (self.all_accounts.filter(is_active=True)
.prefetch_related('asset', 'asset__platform', 'asset__platform__ds'))
.prefetch_related('asset', 'asset__platform'))
return queryset
@lazyproperty
@ -277,11 +285,11 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
return self.category == const.Category.DS
@property
def joined_dir_svc_id(self):
return self.platform.ds_id
def joined_dir_svc_ids(self):
return self.directory_services.values_list('id', flat=True)
def is_joined_ad(self):
if self.joined_dir_svc_id:
if self.joined_dir_svc_ids:
return True
else:
return False

View File

@ -103,10 +103,6 @@ class Platform(LabeledMixin, JMSBaseModel):
)
domain_enabled = models.BooleanField(default=True, verbose_name=_("Gateway enabled"))
ds_enabled = models.BooleanField(default=False, verbose_name=_("DS enabled"))
ds = models.ForeignKey(
'DirectoryService', on_delete=models.SET_NULL, null=True, blank=True,
verbose_name=_("Directory service"), related_name='ds_platforms'
)
# 账号有关的
su_enabled = models.BooleanField(default=False, verbose_name=_("Su enabled"))
su_method = models.CharField(max_length=32, blank=True, null=True, verbose_name=_("Su method"))

View File

@ -160,6 +160,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
fields_m2m = [
'nodes', 'labels', 'protocols',
'nodes_display', 'accounts',
'directory_services',
]
read_only_fields = [
'accounts_amount', 'category', 'type', 'connectivity', 'auto_config',

View File

@ -195,7 +195,7 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
fields_m2m = ['assets', 'assets_amount']
fields = fields_small + fields_m2m + [
"protocols", "domain_enabled", "su_enabled", "su_method",
"ds_enabled", "ds", "automation", "comment", "custom_fields", "labels"
"ds_enabled", "automation", "comment", "custom_fields", "labels"
] + read_only_fields
extra_kwargs = {
"su_enabled": {

View File

@ -274,6 +274,9 @@ class ConnectionToken(JMSOrgBaseModel):
def set_ad_domain_if_need(self, account):
if not self.protocol == 'rdp':
return
if account.ds_domain:
return
rdp = self.asset.platform.protocols.filter(name='rdp').first()
if not rdp or not rdp.setting:
return