mirror of https://github.com/jumpserver/jumpserver
perf: directory service db
parent
e286997090
commit
1fdd1036d3
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
),
|
||||
),
|
||||
]
|
|
@ -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",
|
||||
),
|
||||
]
|
|
@ -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
|
||||
|
|
|
@ -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"))
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue