perf: change domain to zone (#15255)

* perf: change domain to zone

* perf: change domain to zone

* perf: change some word

* perf: update gateway enabled i18n

* perf: change migrations

---------

Co-authored-by: ibuler <ibuler@qq.com>
pull/15260/head
fit2bot 2025-04-21 10:30:18 +08:00 committed by GitHub
parent 57fcebfdd3
commit 3159a4e794
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
40 changed files with 178 additions and 143 deletions

View File

@ -1,10 +1,10 @@
from .asset import * from .asset import *
from .category import * from .category import *
from .domain import *
from .favorite_asset import * from .favorite_asset import *
from .mixin import * from .mixin import *
from .my_asset import *
from .node import * from .node import *
from .platform import * from .platform import *
from .protocol import * from .protocol import *
from .tree import * from .tree import *
from .my_asset import * from .zone import *

View File

@ -37,12 +37,12 @@ class AssetFilterSet(BaseFilterSet):
platform = drf_filters.CharFilter(method='filter_platform') platform = drf_filters.CharFilter(method='filter_platform')
is_gateway = drf_filters.BooleanFilter(method='filter_is_gateway') is_gateway = drf_filters.BooleanFilter(method='filter_is_gateway')
exclude_platform = drf_filters.CharFilter(field_name="platform__name", lookup_expr='exact', exclude=True) exclude_platform = drf_filters.CharFilter(field_name="platform__name", lookup_expr='exact', exclude=True)
domain = drf_filters.CharFilter(method='filter_domain') zone = drf_filters.CharFilter(method='filter_zone')
type = drf_filters.CharFilter(field_name="platform__type", lookup_expr="exact") type = drf_filters.CharFilter(field_name="platform__type", lookup_expr="exact")
category = drf_filters.CharFilter(field_name="platform__category", lookup_expr="exact") category = drf_filters.CharFilter(field_name="platform__category", lookup_expr="exact")
protocols = drf_filters.CharFilter(method='filter_protocols') protocols = drf_filters.CharFilter(method='filter_protocols')
domain_enabled = drf_filters.BooleanFilter( gateway_enabled = drf_filters.BooleanFilter(
field_name="platform__domain_enabled", lookup_expr="exact" field_name="platform__gateway_enabled", lookup_expr="exact"
) )
ping_enabled = drf_filters.BooleanFilter( ping_enabled = drf_filters.BooleanFilter(
field_name="platform__automation__ping_enabled", lookup_expr="exact" field_name="platform__automation__ping_enabled", lookup_expr="exact"
@ -85,11 +85,11 @@ class AssetFilterSet(BaseFilterSet):
return queryset return queryset
@staticmethod @staticmethod
def filter_domain(queryset, name, value): def filter_zone(queryset, name, value):
if is_uuid(value): if is_uuid(value):
return queryset.filter(domain_id=value) return queryset.filter(zone_id=value)
else: else:
return queryset.filter(domain__name__contains=value) return queryset.filter(zone__name__contains=value)
@staticmethod @staticmethod
def filter_protocols(queryset, name, value): def filter_protocols(queryset, name, value):
@ -171,10 +171,10 @@ class AssetViewSet(SuggestionMixin, BaseAssetViewSet):
@action(methods=["GET"], detail=True, url_path="gateways") @action(methods=["GET"], detail=True, url_path="gateways")
def gateways(self, *args, **kwargs): def gateways(self, *args, **kwargs):
asset = self.get_object() asset = self.get_object()
if not asset.domain: if not asset.zone:
gateways = Gateway.objects.none() gateways = Gateway.objects.none()
else: else:
gateways = asset.domain.gateways gateways = asset.zone.gateways
return self.get_paginated_response_from_queryset(gateways) return self.get_paginated_response_from_queryset(gateways)
@action(methods=['post'], detail=False, url_path='sync-platform-protocols') @action(methods=['post'], detail=False, url_path='sync-platform-protocols')

View File

@ -9,24 +9,24 @@ from common.utils import get_logger
from orgs.mixins.api import OrgBulkModelViewSet from orgs.mixins.api import OrgBulkModelViewSet
from .asset import HostViewSet from .asset import HostViewSet
from .. import serializers from .. import serializers
from ..models import Domain, Gateway from ..models import Zone, Gateway
logger = get_logger(__file__) logger = get_logger(__file__)
__all__ = ['DomainViewSet', 'GatewayViewSet', "GatewayTestConnectionApi"] __all__ = ['ZoneViewSet', 'GatewayViewSet', "GatewayTestConnectionApi"]
class DomainViewSet(OrgBulkModelViewSet): class ZoneViewSet(OrgBulkModelViewSet):
model = Domain model = Zone
filterset_fields = ("name",) filterset_fields = ("name",)
search_fields = filterset_fields search_fields = filterset_fields
serializer_classes = { serializer_classes = {
'default': serializers.DomainSerializer, 'default': serializers.ZoneSerializer,
'list': serializers.DomainListSerializer, 'list': serializers.ZoneListSerializer,
} }
def get_serializer_class(self): def get_serializer_class(self):
if self.request.query_params.get('gateway'): if self.request.query_params.get('gateway'):
return serializers.DomainWithGatewaySerializer return serializers.ZoneWithGatewaySerializer
return super().get_serializer_class() return super().get_serializer_class()
def partial_update(self, request, *args, **kwargs): def partial_update(self, request, *args, **kwargs):
@ -36,8 +36,8 @@ class DomainViewSet(OrgBulkModelViewSet):
class GatewayViewSet(HostViewSet): class GatewayViewSet(HostViewSet):
perm_model = Gateway perm_model = Gateway
filterset_fields = ("domain__name", "name", "domain") filterset_fields = ("zone__name", "name", "zone")
search_fields = ("domain__name",) search_fields = ("zone__name",)
def get_serializer_classes(self): def get_serializer_classes(self):
serializer_classes = super().get_serializer_classes() serializer_classes = super().get_serializer_classes()
@ -45,7 +45,7 @@ class GatewayViewSet(HostViewSet):
return serializer_classes return serializer_classes
def get_queryset(self): def get_queryset(self):
queryset = Domain.get_gateway_queryset() queryset = Zone.get_gateway_queryset()
return queryset return queryset
@ -55,7 +55,7 @@ class GatewayTestConnectionApi(SingleObjectMixin, APIView):
} }
def get_queryset(self): def get_queryset(self):
queryset = Domain.get_gateway_queryset() queryset = Zone.get_gateway_queryset()
return queryset return queryset
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):

View File

@ -37,7 +37,7 @@ class FillType(models.TextChoices):
class BaseType(TextChoices): class BaseType(TextChoices):
""" """
约束应该考虑代是对平台对限制避免多余对选项: mysql 开启 ssh, 约束应该考虑代是对平台对限制避免多余对选项: mysql 开启 ssh,
或者开启了也没有作用, 比如 k8s 开启了 domain目前还不支持 或者开启了也没有作用, 比如 k8s 开启了 gateway 目前还不支持
""" """
@classmethod @classmethod

View File

@ -13,11 +13,11 @@ class CloudTypes(BaseType):
return { return {
'*': { '*': {
'charset_enabled': False, 'charset_enabled': False,
'domain_enabled': False, 'gateway_enabled': False,
'su_enabled': False, 'su_enabled': False,
}, },
cls.K8S: { cls.K8S: {
'domain_enabled': True, 'gateway_enabled': True,
} }
} }

View File

@ -20,7 +20,7 @@ class CustomTypes(BaseType):
return { return {
'*': { '*': {
'charset_enabled': False, 'charset_enabled': False,
'domain_enabled': False, 'gateway_enabled': False,
'su_enabled': False, 'su_enabled': False,
}, },
} }

View File

@ -20,7 +20,7 @@ class DatabaseTypes(BaseType):
return { return {
'*': { '*': {
'charset_enabled': False, 'charset_enabled': False,
'domain_enabled': True, 'gateway_enabled': True,
'su_enabled': False, 'su_enabled': False,
} }
} }

View File

@ -19,7 +19,7 @@ class DeviceTypes(BaseType):
return { return {
'*': { '*': {
'charset_enabled': False, 'charset_enabled': False,
'domain_enabled': True, 'gateway_enabled': True,
'ds_enabled': False, 'ds_enabled': False,
'su_enabled': True, 'su_enabled': True,
'su_methods': ['enable', 'super', 'super_level'] 'su_methods': ['enable', 'super', 'super_level']

View File

@ -16,7 +16,7 @@ class DirectoryTypes(BaseType):
return { return {
'*': { '*': {
'charset_enabled': True, 'charset_enabled': True,
'domain_enabled': True, 'gateway_enabled': True,
'ds_enabled': False, 'ds_enabled': False,
'su_enabled': True, 'su_enabled': True,
}, },

View File

@ -11,7 +11,7 @@ class GPTTypes(BaseType):
return { return {
'*': { '*': {
'charset_enabled': False, 'charset_enabled': False,
'domain_enabled': False, 'gateway_enabled': False,
'su_enabled': False, 'su_enabled': False,
} }
} }

View File

@ -18,7 +18,7 @@ class HostTypes(BaseType):
'*': { '*': {
'charset_enabled': True, 'charset_enabled': True,
'charset': 'utf-8', # default 'charset': 'utf-8', # default
'domain_enabled': True, 'gateway_enabled': True,
'su_enabled': True, 'su_enabled': True,
'ds_enabled': True, 'ds_enabled': True,
'su_methods': ['sudo', 'su', 'only_sudo', 'only_su'], 'su_methods': ['sudo', 'su', 'only_sudo', 'only_su'],
@ -81,7 +81,7 @@ class HostTypes(BaseType):
{'name': 'Linux'}, {'name': 'Linux'},
{ {
'name': GATEWAY_NAME, 'name': GATEWAY_NAME,
'domain_enabled': True, 'gateway_enabled': True,
} }
], ],
cls.UNIX: [ cls.UNIX: [

View File

@ -312,7 +312,7 @@ class AllTypes(ChoicesMixin):
'category': category, 'category': category,
'type': tp, 'internal': True, 'type': tp, 'internal': True,
'charset': constraints.get('charset', 'utf-8'), 'charset': constraints.get('charset', 'utf-8'),
'domain_enabled': constraints.get('domain_enabled', False), 'gateway_enabled': constraints.get('gateway_enabled', False),
'su_enabled': constraints.get('su_enabled', False), 'su_enabled': constraints.get('su_enabled', False),
} }
if data['su_enabled'] and data.get('su_methods'): if data['su_enabled'] and data.get('su_methods'):

View File

@ -11,7 +11,7 @@ class WebTypes(BaseType):
return { return {
'*': { '*': {
'charset_enabled': False, 'charset_enabled': False,
'domain_enabled': False, 'gateway_enabled': False,
'su_enabled': False, 'su_enabled': False,
} }
} }

View File

@ -1,11 +1,11 @@
# Generated by Django 4.1.13 on 2024-05-09 03:16 # Generated by Django 4.1.13 on 2024-05-09 03:16
import json import django.db.models.deletion
import assets.models.asset.common
from django.db.models import F, Q
from django.conf import settings from django.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion from django.db.models import F
import assets.models.asset.common
class Migration(migrations.Migration): class Migration(migrations.Migration):
@ -39,22 +39,26 @@ class Migration(migrations.Migration):
migrations.AddField( migrations.AddField(
model_name='automationexecution', model_name='automationexecution',
name='automation', name='automation',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='executions', to='assets.baseautomation', verbose_name='Automation task'), field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='executions',
to='assets.baseautomation', verbose_name='Automation task'),
), ),
migrations.AddField( migrations.AddField(
model_name='asset', model_name='asset',
name='domain', name='domain',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assets', to='assets.domain', verbose_name='Zone'), field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
related_name='assets', to='assets.domain', verbose_name='Zone'),
), ),
migrations.AddField( migrations.AddField(
model_name='asset', model_name='asset',
name='nodes', name='nodes',
field=models.ManyToManyField(default=assets.models.asset.common.default_node, related_name='assets', to='assets.node', verbose_name='Nodes'), field=models.ManyToManyField(default=assets.models.asset.common.default_node, related_name='assets',
to='assets.node', verbose_name='Nodes'),
), ),
migrations.AddField( migrations.AddField(
model_name='asset', model_name='asset',
name='platform', name='platform',
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='assets', to='assets.platform', verbose_name='Platform'), field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='assets',
to='assets.platform', verbose_name='Platform'),
), ),
migrations.CreateModel( migrations.CreateModel(
name='AssetBaseAutomation', name='AssetBaseAutomation',
@ -71,7 +75,9 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='GatherFactsAutomation', name='GatherFactsAutomation',
fields=[ fields=[
('baseautomation_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.baseautomation')), ('baseautomation_ptr',
models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True,
primary_key=True, serialize=False, to='assets.baseautomation')),
], ],
options={ options={
'verbose_name': 'Gather asset facts', 'verbose_name': 'Gather asset facts',
@ -81,7 +87,9 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='PingAutomation', name='PingAutomation',
fields=[ fields=[
('baseautomation_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.baseautomation')), ('baseautomation_ptr',
models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True,
primary_key=True, serialize=False, to='assets.baseautomation')),
], ],
options={ options={
'verbose_name': 'Ping asset', 'verbose_name': 'Ping asset',

View File

@ -18,7 +18,7 @@ platforms_data_json = '''[
"type": "linux", "type": "linux",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": true, "su_enabled": true,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -119,7 +119,7 @@ platforms_data_json = '''[
"type": "unix", "type": "unix",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": true, "su_enabled": true,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -209,7 +209,7 @@ platforms_data_json = '''[
"type": "unix", "type": "unix",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": true, "su_enabled": true,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -299,7 +299,7 @@ platforms_data_json = '''[
"type": "unix", "type": "unix",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": true, "su_enabled": true,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -389,7 +389,7 @@ platforms_data_json = '''[
"type": "windows", "type": "windows",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -481,7 +481,7 @@ platforms_data_json = '''[
"security": "any" "security": "any"
}, },
"internal": false, "internal": false,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -582,7 +582,7 @@ platforms_data_json = '''[
"type": "other", "type": "other",
"meta": {}, "meta": {},
"internal": false, "internal": false,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -684,7 +684,7 @@ platforms_data_json = '''[
"security": "rdp" "security": "rdp"
}, },
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -776,7 +776,7 @@ platforms_data_json = '''[
"security": "tls" "security": "tls"
}, },
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -866,7 +866,7 @@ platforms_data_json = '''[
"type": "unix", "type": "unix",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": true, "su_enabled": true,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -956,7 +956,7 @@ platforms_data_json = '''[
"type": "linux", "type": "linux",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": true, "su_enabled": true,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1057,7 +1057,7 @@ platforms_data_json = '''[
"type": "windows", "type": "windows",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1136,7 +1136,7 @@ platforms_data_json = '''[
"type": "general", "type": "general",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1201,7 +1201,7 @@ platforms_data_json = '''[
"type": "general", "type": "general",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": true, "su_enabled": true,
"su_method": "enable", "su_method": "enable",
"custom_fields": [], "custom_fields": [],
@ -1266,7 +1266,7 @@ platforms_data_json = '''[
"type": "general", "type": "general",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": true, "su_enabled": true,
"su_method": "super", "su_method": "super",
"custom_fields": [], "custom_fields": [],
@ -1332,7 +1332,7 @@ platforms_data_json = '''[
"type": "general", "type": "general",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": true, "su_enabled": true,
"su_method": "super_level", "su_method": "super_level",
"custom_fields": [], "custom_fields": [],
@ -1397,7 +1397,7 @@ platforms_data_json = '''[
"type": "mysql", "type": "mysql",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1449,7 +1449,7 @@ platforms_data_json = '''[
"type": "mariadb", "type": "mariadb",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1501,7 +1501,7 @@ platforms_data_json = '''[
"type": "postgresql", "type": "postgresql",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1553,7 +1553,7 @@ platforms_data_json = '''[
"type": "oracle", "type": "oracle",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1605,7 +1605,7 @@ platforms_data_json = '''[
"type": "sqlserver", "type": "sqlserver",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1657,7 +1657,7 @@ platforms_data_json = '''[
"type": "clickhouse", "type": "clickhouse",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1709,7 +1709,7 @@ platforms_data_json = '''[
"type": "mongodb", "type": "mongodb",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1761,7 +1761,7 @@ platforms_data_json = '''[
"type": "redis", "type": "redis",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1815,7 +1815,7 @@ platforms_data_json = '''[
"type": "redis", "type": "redis",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1869,7 +1869,7 @@ platforms_data_json = '''[
"type": "website", "type": "website",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": false, "gateway_enabled": false,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1924,7 +1924,7 @@ platforms_data_json = '''[
"type": "private", "type": "private",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": false, "gateway_enabled": false,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -1979,7 +1979,7 @@ platforms_data_json = '''[
"type": "k8s", "type": "k8s",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": false, "gateway_enabled": false,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -2029,7 +2029,7 @@ platforms_data_json = '''[
"type": "chatgpt", "type": "chatgpt",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": false, "gateway_enabled": false,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -2081,7 +2081,7 @@ platforms_data_json = '''[
"type": "db2", "type": "db2",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -2131,7 +2131,7 @@ platforms_data_json = '''[
"type": "dameng", "type": "dameng",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],

View File

@ -52,6 +52,6 @@ class Migration(migrations.Migration):
related_name="assets", related_name="assets",
to="assets.directoryservice", to="assets.directoryservice",
verbose_name="Directory services", verbose_name="Directory services",
), )
), ),
] ]

View File

@ -19,7 +19,7 @@ def add_ds_platforms(apps, schema_editor):
"type": "windows_ad", "type": "windows_ad",
"meta": {}, "meta": {},
"internal": true, "internal": true,
"domain_enabled": true, "gateway_enabled": true,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [], "custom_fields": [],
@ -117,7 +117,7 @@ def add_ds_platforms(apps, schema_editor):
"meta": { "meta": {
}, },
"internal": true, "internal": true,
"domain_enabled": false, "gateway_enabled": false,
"su_enabled": false, "su_enabled": false,
"su_method": null, "su_method": null,
"custom_fields": [ "custom_fields": [

View File

@ -0,0 +1,26 @@
# Generated by Django 4.1.13 on 2025-04-18 08:05
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("assets", "0017_auto_20250407_1124"),
]
operations = [
migrations.RenameField(
model_name="platform",
old_name="domain_enabled",
new_name="gateway_enabled",
),
migrations.RenameModel(
old_name="Domain",
new_name="Zone",
),
migrations.RenameField(
model_name="asset",
old_name="domain",
new_name="zone",
),
]

View File

@ -1,9 +1,10 @@
# noqa
from .base import * from .base import *
from .platform import * from .platform import *
from .asset import * from .asset import *
from .label import Label from .label import Label
from .gateway import * from .gateway import *
from .domain import * from .zone import * # noqa
from .node import * from .node import *
from .favorite_asset import * from .favorite_asset import *
from .automations import * from .automations import *

View File

@ -168,8 +168,8 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
platform = models.ForeignKey( platform = models.ForeignKey(
Platform, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets' Platform, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets'
) )
domain = models.ForeignKey( zone = models.ForeignKey(
"assets.Domain", null=True, blank=True, related_name='assets', "assets.Zone", null=True, blank=True, related_name='assets',
verbose_name=_("Zone"), on_delete=models.SET_NULL verbose_name=_("Zone"), on_delete=models.SET_NULL
) )
nodes = models.ManyToManyField( nodes = models.ManyToManyField(
@ -177,7 +177,7 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
) )
directory_services = models.ManyToManyField( directory_services = models.ManyToManyField(
'assets.DirectoryService', related_name='assets', 'assets.DirectoryService', related_name='assets',
verbose_name=_("Directory service") verbose_name=_("Directory services")
) )
is_active = models.BooleanField(default=True, verbose_name=_('Active')) is_active = models.BooleanField(default=True, verbose_name=_('Active'))
gathered_info = models.JSONField(verbose_name=_('Gathered info'), default=dict, blank=True) # 资产的一些信息,如 硬件信息 gathered_info = models.JSONField(verbose_name=_('Gathered info'), default=dict, blank=True) # 资产的一些信息,如 硬件信息
@ -244,7 +244,7 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
platform = self.platform platform = self.platform
auto_config = { auto_config = {
'su_enabled': platform.su_enabled, 'su_enabled': platform.su_enabled,
'domain_enabled': platform.domain_enabled, 'gateway_enabled': platform.gateway_enabled,
'ansible_enabled': False 'ansible_enabled': False
} }
automation = getattr(self.platform, 'automation', None) automation = getattr(self.platform, 'automation', None)
@ -362,11 +362,11 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin,
@lazyproperty @lazyproperty
def gateway(self): def gateway(self):
if not self.domain_id: if not self.zone_id:
return return
if not self.platform.domain_enabled: if not self.platform.gateway_enabled:
return return
return self.domain.select_gateway() return self.zone.select_gateway()
def as_node(self): def as_node(self):
from assets.models import Node from assets.models import Node

View File

@ -101,7 +101,7 @@ class Platform(LabeledMixin, JMSBaseModel):
default=CharsetChoices.utf8, choices=CharsetChoices.choices, default=CharsetChoices.utf8, choices=CharsetChoices.choices,
max_length=8, verbose_name=_("Charset") max_length=8, verbose_name=_("Charset")
) )
domain_enabled = models.BooleanField(default=True, verbose_name=_("Gateway enabled")) gateway_enabled = models.BooleanField(default=True, verbose_name=_("Gateway enabled"))
ds_enabled = models.BooleanField(default=False, verbose_name=_("DS enabled")) ds_enabled = models.BooleanField(default=False, verbose_name=_("DS enabled"))
# 账号有关的 # 账号有关的
su_enabled = models.BooleanField(default=False, verbose_name=_("Su enabled")) su_enabled = models.BooleanField(default=False, verbose_name=_("Su enabled"))

View File

@ -12,10 +12,10 @@ from .gateway import Gateway
logger = get_logger(__file__) logger = get_logger(__file__)
__all__ = ['Domain'] __all__ = ['Zone']
class Domain(LabeledMixin, JMSOrgBaseModel): class Zone(LabeledMixin, JMSOrgBaseModel):
name = models.CharField(max_length=128, verbose_name=_('Name')) name = models.CharField(max_length=128, verbose_name=_('Name'))
class Meta: class Meta:
@ -49,7 +49,7 @@ class Domain(LabeledMixin, JMSOrgBaseModel):
@property @property
def gateways(self): def gateways(self):
queryset = self.get_gateway_queryset().filter(domain=self) queryset = self.get_gateway_queryset().filter(zone=self)
return queryset return queryset
@classmethod @classmethod

View File

@ -154,7 +154,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
class Meta: class Meta:
model = Asset model = Asset
fields_fk = ['domain', 'platform'] fields_fk = ['zone', 'platform']
fields_mini = ['id', 'name', 'address'] + fields_fk fields_mini = ['id', 'name', 'address'] + fields_fk
fields_small = fields_mini + ['is_active', 'comment'] fields_small = fields_mini + ['is_active', 'comment']
fields_m2m = [ fields_m2m = [
@ -233,7 +233,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
@classmethod @classmethod
def setup_eager_loading(cls, queryset): def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """ """ Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('domain', 'nodes', 'protocols', 'directory_services') \ queryset = queryset.prefetch_related('zone', 'nodes', 'protocols', 'directory_services') \
.prefetch_related('platform', 'platform__automation') \ .prefetch_related('platform', 'platform__automation') \
.annotate(category=F("platform__category")) \ .annotate(category=F("platform__category")) \
.annotate(type=F("platform__type")) \ .annotate(type=F("platform__type")) \
@ -271,9 +271,9 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa
raise serializers.ValidationError({'platform': _("Platform not exist")}) raise serializers.ValidationError({'platform': _("Platform not exist")})
return platform return platform
def validate_domain(self, value): def validate_zone(self, value):
platform = self._asset_platform platform = self._asset_platform
if platform.domain_enabled: if platform.gateway_enabled:
return value return value
else: else:
return None return None

View File

@ -8,12 +8,12 @@ from common.serializers import ResourceLabelsMixin
from common.serializers.fields import ObjectRelatedField from common.serializers.fields import ObjectRelatedField
from orgs.mixins.serializers import BulkOrgResourceModelSerializer from orgs.mixins.serializers import BulkOrgResourceModelSerializer
from .gateway import GatewayWithAccountSecretSerializer from .gateway import GatewayWithAccountSecretSerializer
from ..models import Domain, Gateway from ..models import Zone, Gateway
__all__ = ['DomainSerializer', 'DomainWithGatewaySerializer', 'DomainListSerializer'] __all__ = ['ZoneSerializer', 'ZoneWithGatewaySerializer', 'ZoneListSerializer']
class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer): class ZoneSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
gateways = ObjectRelatedField( gateways = ObjectRelatedField(
many=True, required=False, label=_('Gateway'), queryset=Gateway.objects, many=True, required=False, label=_('Gateway'), queryset=Gateway.objects,
help_text=_( help_text=_(
@ -23,7 +23,7 @@ class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
assets_amount = serializers.IntegerField(label=_('Assets amount'), read_only=True) assets_amount = serializers.IntegerField(label=_('Assets amount'), read_only=True)
class Meta: class Meta:
model = Domain model = Zone
fields_mini = ['id', 'name'] fields_mini = ['id', 'name']
fields_small = fields_mini + ['comment'] fields_small = fields_mini + ['comment']
fields_m2m = ['assets', 'gateways', 'labels', 'assets_amount'] fields_m2m = ['assets', 'gateways', 'labels', 'assets_amount']
@ -55,9 +55,9 @@ class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer):
return super().update(instance, validated_data) return super().update(instance, validated_data)
class DomainListSerializer(DomainSerializer): class ZoneListSerializer(ZoneSerializer):
class Meta(DomainSerializer.Meta): class Meta(ZoneSerializer.Meta):
fields = list(set(DomainSerializer.Meta.fields + ['assets_amount']) - {'assets'}) fields = list(set(ZoneSerializer.Meta.fields + ['assets_amount']) - {'assets'})
@classmethod @classmethod
def setup_eager_loading(cls, queryset): def setup_eager_loading(cls, queryset):
@ -67,9 +67,9 @@ class DomainListSerializer(DomainSerializer):
return queryset return queryset
class DomainWithGatewaySerializer(serializers.ModelSerializer): class ZoneWithGatewaySerializer(serializers.ModelSerializer):
gateways = GatewayWithAccountSecretSerializer(many=True, read_only=True) gateways = GatewayWithAccountSecretSerializer(many=True, read_only=True)
class Meta: class Meta:
model = Domain model = Zone
fields = '__all__' fields = '__all__'

View File

@ -194,7 +194,7 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
] ]
fields_m2m = ['assets', 'assets_amount'] fields_m2m = ['assets', 'assets_amount']
fields = fields_small + fields_m2m + [ fields = fields_small + fields_m2m + [
"protocols", "domain_enabled", "su_enabled", "su_method", "protocols", "gateway_enabled", "su_enabled", "su_method",
"ds_enabled", "automation", "comment", "custom_fields", "labels" "ds_enabled", "automation", "comment", "custom_fields", "labels"
] + read_only_fields ] + read_only_fields
extra_kwargs = { extra_kwargs = {
@ -205,11 +205,11 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
"similar to logging in with a regular account and then switching to root" "similar to logging in with a regular account and then switching to root"
) )
}, },
"domain_enabled": { "gateway_enabled": {
"label": _('Gateway enabled'), "label": _('Gateway enabled'),
"help_text": _("Assets can be connected using a zone gateway") "help_text": _("Assets can be connected using a zone gateway")
}, },
"domain_default": {"label": _('Default Domain')}, "zone_default": {"label": _('Default zone')},
'assets': {'required': False, 'label': _('Assets')}, 'assets': {'required': False, 'label': _('Assets')},
} }
@ -262,8 +262,8 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes
def validate_su_enabled(self, su_enabled): def validate_su_enabled(self, su_enabled):
return su_enabled and self.constraints.get('su_enabled', False) return su_enabled and self.constraints.get('su_enabled', False)
def validate_domain_enabled(self, domain_enabled): def validate_gateway_enabled(self, gateway_enabled):
return domain_enabled and self.constraints.get('domain_enabled', False) return gateway_enabled and self.constraints.get('gateway_enabled', False)
def validate_automation(self, automation): def validate_automation(self, automation):
automation = automation or {} automation = automation or {}

View File

@ -20,7 +20,7 @@ router.register(r'directories', api.DSViewSet, 'ds')
router.register(r'customs', api.CustomViewSet, 'custom') router.register(r'customs', api.CustomViewSet, 'custom')
router.register(r'platforms', api.AssetPlatformViewSet, 'platform') router.register(r'platforms', api.AssetPlatformViewSet, 'platform')
router.register(r'nodes', api.NodeViewSet, 'node') router.register(r'nodes', api.NodeViewSet, 'node')
router.register(r'domains', api.DomainViewSet, 'domain') router.register(r'zones', api.ZoneViewSet, 'zone')
router.register(r'gateways', api.GatewayViewSet, 'gateway') router.register(r'gateways', api.GatewayViewSet, 'gateway')
router.register(r'favorite-assets', api.FavoriteAssetViewSet, 'favorite-asset') router.register(r'favorite-assets', api.FavoriteAssetViewSet, 'favorite-asset')
router.register(r'protocol-settings', api.PlatformProtocolViewSet, 'protocol-setting') router.register(r'protocol-settings', api.PlatformProtocolViewSet, 'protocol-setting')

View File

@ -251,7 +251,7 @@ class ConnectionToken(JMSOrgBaseModel):
raise JMSException({'error': 'No host account available, please check the applet, host and account'}) raise JMSException({'error': 'No host account available, please check the applet, host and account'})
host, account, lock_key = bulk_get(host_account, ('host', 'account', 'lock_key')) host, account, lock_key = bulk_get(host_account, ('host', 'account', 'lock_key'))
gateway = host.domain.select_gateway() if host.domain else None gateway = host.zone.select_gateway() if host.zone else None
platform = host.platform platform = host.platform
data = { data = {
@ -305,17 +305,17 @@ class ConnectionToken(JMSOrgBaseModel):
return account return account
@lazyproperty @lazyproperty
def domain(self): def zone(self):
if not self.asset.platform.domain_enabled: if not self.asset.platform.gateway_enabled:
return return
if self.asset.platform.name == GATEWAY_NAME: if self.asset.platform.name == GATEWAY_NAME:
return return
domain = self.asset.domain if self.asset.domain else None zone = self.asset.zone if self.asset.zone else None
return domain return zone
@lazyproperty @lazyproperty
def gateway(self): def gateway(self):
if not self.asset or not self.domain: if not self.asset or not self.zone:
return return
return self.asset.gateway return self.asset.gateway

View File

@ -4,7 +4,7 @@ from rest_framework import serializers
from accounts.const import SecretType from accounts.const import SecretType
from accounts.models import Account from accounts.models import Account
from acls.models import CommandGroup, CommandFilterACL from acls.models import CommandGroup, CommandFilterACL
from assets.models import Asset, Platform, Gateway, Domain from assets.models import Asset, Platform, Gateway, Zone
from assets.serializers.asset import AssetProtocolsSerializer from assets.serializers.asset import AssetProtocolsSerializer
from assets.serializers.platform import PlatformSerializer from assets.serializers.platform import PlatformSerializer
from common.serializers.fields import LabeledChoiceField from common.serializers.fields import LabeledChoiceField
@ -135,7 +135,7 @@ class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin):
account = _ConnectionTokenAccountSerializer(read_only=True, source='account_object') account = _ConnectionTokenAccountSerializer(read_only=True, source='account_object')
gateway = _ConnectionTokenGatewaySerializer(read_only=True) gateway = _ConnectionTokenGatewaySerializer(read_only=True)
platform = _ConnectionTokenPlatformSerializer(read_only=True) platform = _ConnectionTokenPlatformSerializer(read_only=True)
domain = ObjectRelatedField(queryset=Domain.objects, required=False, label=_('Domain')) zone = ObjectRelatedField(queryset=Zone.objects, required=False, label=_('Domain'))
command_filter_acls = _ConnectionTokenCommandFilterACLSerializer(read_only=True, many=True) command_filter_acls = _ConnectionTokenCommandFilterACLSerializer(read_only=True, many=True)
expire_now = serializers.BooleanField(label=_('Expired now'), write_only=True, default=True) expire_now = serializers.BooleanField(label=_('Expired now'), write_only=True, default=True)
connect_method = _ConnectTokenConnectMethodSerializer(read_only=True, source='connect_method_object') connect_method = _ConnectTokenConnectMethodSerializer(read_only=True, source='connect_method_object')
@ -148,7 +148,7 @@ class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin):
fields = [ fields = [
'id', 'value', 'user', 'asset', 'account', 'id', 'value', 'user', 'asset', 'account',
'platform', 'command_filter_acls', 'protocol', 'platform', 'command_filter_acls', 'protocol',
'domain', 'gateway', 'actions', 'expire_at', 'zone', 'gateway', 'actions', 'expire_at',
'from_ticket', 'expire_now', 'connect_method', 'from_ticket', 'expire_now', 'connect_method',
'connect_options', 'face_monitor_token' 'connect_options', 'face_monitor_token'
] ]

View File

@ -2882,7 +2882,7 @@ msgstr "Código"
#: assets/models/platform.py:104 assets/serializers/platform.py:209 #: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled" msgid "Gateway enabled"
msgstr "Activar dominio" msgstr "Activar gateway de zona"
#: assets/models/platform.py:105 #: assets/models/platform.py:105
msgid "DS enabled" msgid "DS enabled"

View File

@ -2769,7 +2769,7 @@ msgstr "シャーセット"
#: assets/models/platform.py:104 assets/serializers/platform.py:209 #: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled" msgid "Gateway enabled"
msgstr "ゲートウェイが有効になりました" msgstr "ゾーンゲートウェイを有効化"
#: assets/models/platform.py:105 #: assets/models/platform.py:105
msgid "DS enabled" msgid "DS enabled"

View File

@ -2862,7 +2862,7 @@ msgstr "Codificação"
#: assets/models/platform.py:104 assets/serializers/platform.py:209 #: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled" msgid "Gateway enabled"
msgstr "Habilitar domínio" msgstr "Ativar zone gateway"
#: assets/models/platform.py:105 #: assets/models/platform.py:105
msgid "DS enabled" msgid "DS enabled"

View File

@ -2827,7 +2827,7 @@ msgstr "Кодировка"
#: assets/models/platform.py:104 assets/serializers/platform.py:209 #: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled" msgid "Gateway enabled"
msgstr "Шлюз включен" msgstr "Включить шлюз зоны"
#: assets/models/platform.py:105 #: assets/models/platform.py:105
msgid "DS enabled" msgid "DS enabled"

View File

@ -2780,11 +2780,11 @@ msgstr "编码"
#: assets/models/platform.py:104 assets/serializers/platform.py:209 #: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled" msgid "Gateway enabled"
msgstr "启用网域" msgstr "启用网域网关"
#: assets/models/platform.py:105 #: assets/models/platform.py:105
msgid "DS enabled" msgid "DS enabled"
msgstr "目录服务已启用" msgstr "启用目录服务"
#: assets/models/platform.py:107 assets/serializers/platform.py:202 #: assets/models/platform.py:107 assets/serializers/platform.py:202
msgid "Su enabled" msgid "Su enabled"

View File

@ -2751,7 +2751,7 @@ msgstr "編碼"
#: assets/models/platform.py:104 assets/serializers/platform.py:209 #: assets/models/platform.py:104 assets/serializers/platform.py:209
msgid "Gateway enabled" msgid "Gateway enabled"
msgstr "啟用網域" msgstr "啟用網域網関"
#: assets/models/platform.py:105 #: assets/models/platform.py:105
msgid "DS enabled" msgid "DS enabled"

View File

@ -37,7 +37,7 @@ class JMSInventory:
from assets.models import Asset from assets.models import Asset
asset_ids = [asset.id for asset in assets] asset_ids = [asset.id for asset in assets]
assets = Asset.objects.filter(id__in=asset_ids, is_active=True) \ assets = Asset.objects.filter(id__in=asset_ids, is_active=True) \
.prefetch_related('platform', 'domain', 'accounts') .prefetch_related('platform', 'zone', 'accounts')
return assets return assets
@staticmethod @staticmethod
@ -236,8 +236,8 @@ class JMSInventory:
host.update(ansible_config) host.update(ansible_config)
gateway = None gateway = None
if not asset.is_gateway and asset.domain: if not asset.is_gateway and asset.zone:
gateway = asset.domain.select_gateway() gateway = asset.zone.select_gateway()
self.make_account_vars( self.make_account_vars(
host, asset, account, automation, protocol, platform, gateway, path_dir, ansible_config host, asset, account, automation, protocol, platform, gateway, path_dir, ansible_config

View File

@ -7,7 +7,7 @@ from rest_framework.exceptions import PermissionDenied
from rest_framework.generics import RetrieveAPIView from rest_framework.generics import RetrieveAPIView
from assets.models import ( from assets.models import (
Asset, Domain, Label, Node, Asset, Zone, Label, Node,
) )
from common.api import JMSBulkModelViewSet from common.api import JMSBulkModelViewSet
from common.permissions import IsValidUser from common.permissions import IsValidUser
@ -24,7 +24,7 @@ logger = get_logger(__file__)
# 部分 org 相关的 model需要清空这些数据之后才能删除该组织 # 部分 org 相关的 model需要清空这些数据之后才能删除该组织
org_related_models = [ org_related_models = [
User, UserGroup, Asset, Node, Label, Domain, AssetPermission User, UserGroup, Asset, Node, Label, Zone, AssetPermission
] ]

View File

@ -1,16 +1,16 @@
from django.db.transaction import on_commit from django.db.transaction import on_commit
from orgs.models import Organization from accounts.models import Account
from orgs.tasks import refresh_org_cache_task from assets.models import Node, Zone, Asset
from orgs.utils import current_org, tmp_to_org
from common.cache import Cache, IntegerField from common.cache import Cache, IntegerField
from common.utils import get_logger from common.utils import get_logger
from common.utils.timezone import local_zero_hour, local_monday from common.utils.timezone import local_zero_hour, local_monday
from users.models import UserGroup, User from orgs.models import Organization
from assets.models import Node, Domain, Asset from orgs.tasks import refresh_org_cache_task
from accounts.models import Account from orgs.utils import current_org, tmp_to_org
from terminal.models import Session
from perms.models import AssetPermission from perms.models import AssetPermission
from terminal.models import Session
from users.models import UserGroup, User
logger = get_logger(__file__) logger = get_logger(__file__)
@ -57,7 +57,7 @@ class OrgResourceStatisticsCache(OrgRelatedCache):
new_users_amount_this_week = IntegerField() new_users_amount_this_week = IntegerField()
new_assets_amount_this_week = IntegerField() new_assets_amount_this_week = IntegerField()
nodes_amount = IntegerField(queryset=Node.objects) nodes_amount = IntegerField(queryset=Node.objects)
domains_amount = IntegerField(queryset=Domain.objects) zones_amount = IntegerField(queryset=Zone.objects)
groups_amount = IntegerField(queryset=UserGroup.objects) groups_amount = IntegerField(queryset=UserGroup.objects)
accounts_amount = IntegerField(queryset=Account.objects) accounts_amount = IntegerField(queryset=Account.objects)
asset_perms_amount = IntegerField(queryset=AssetPermission.objects) asset_perms_amount = IntegerField(queryset=AssetPermission.objects)

View File

@ -12,7 +12,7 @@ class ResourceStatisticsSerializer(serializers.Serializer):
assets_amount = serializers.IntegerField(required=False, label=_('Assets amount')) assets_amount = serializers.IntegerField(required=False, label=_('Assets amount'))
nodes_amount = serializers.IntegerField(required=False, label=_('Nodes amount')) nodes_amount = serializers.IntegerField(required=False, label=_('Nodes amount'))
domains_amount = serializers.IntegerField(required=False, label=_('Domains amount')) zones_amount = serializers.IntegerField(required=False, label=_('Domains amount'))
gateways_amount = serializers.IntegerField(required=False, label=_('Gateways amount')) gateways_amount = serializers.IntegerField(required=False, label=_('Gateways amount'))
asset_perms_amount = serializers.IntegerField(required=False, label=_('Asset permissions amount')) asset_perms_amount = serializers.IntegerField(required=False, label=_('Asset permissions amount'))

View File

@ -2,7 +2,7 @@ from django.db.models.signals import post_save, pre_delete, pre_save, post_delet
from django.dispatch import receiver from django.dispatch import receiver
from accounts.models import Account from accounts.models import Account
from assets.models import Asset, Domain from assets.models import Asset, Zone
from assets.models import Node from assets.models import Node
from common.decorators import merge_delay_run from common.decorators import merge_delay_run
from common.utils import get_logger from common.utils import get_logger
@ -64,7 +64,7 @@ def on_user_delete_refresh_cache(sender, instance, **kwargs):
model_cache_field_mapper = { model_cache_field_mapper = {
Node: ['nodes_amount'], Node: ['nodes_amount'],
Domain: ['domains_amount'], Zone: ['zones_amount'],
UserGroup: ['groups_amount'], UserGroup: ['groups_amount'],
Account: ['accounts_amount'], Account: ['accounts_amount'],
RoleBinding: ['users_amount', 'new_users_amount_this_week'], RoleBinding: ['users_amount', 'new_users_amount_this_week'],

View File

@ -25,12 +25,12 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin
platform = ObjectRelatedField(required=False, queryset=Platform.objects, label=_('Platform')) platform = ObjectRelatedField(required=False, queryset=Platform.objects, label=_('Platform'))
category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category')) category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category'))
type = LabeledChoiceField(choices=AllTypes.choices(), read_only=True, label=_('Type')) type = LabeledChoiceField(choices=AllTypes.choices(), read_only=True, label=_('Type'))
domain = ObjectRelatedField(required=False, queryset=Node.objects, label=_('Domain')) zone = ObjectRelatedField(required=False, read_only=True, label=_('Zone'))
class Meta: class Meta:
model = Asset model = Asset
only_fields = [ only_fields = [
'id', 'name', 'address', 'domain', 'platform', 'id', 'name', 'address', 'zone', 'platform',
'comment', 'org_id', 'is_active', 'date_verified', 'comment', 'org_id', 'is_active', 'date_verified',
'created_by', 'date_created', 'connectivity', 'nodes', 'labels' 'created_by', 'date_created', 'connectivity', 'nodes', 'labels'
] ]
@ -40,7 +40,7 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin
@classmethod @classmethod
def setup_eager_loading(cls, queryset): def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """ """ Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('domain', 'nodes') \ queryset = queryset.prefetch_related('zone', 'nodes') \
.prefetch_related('platform') \ .prefetch_related('platform') \
.annotate(category=F("platform__category")) \ .annotate(category=F("platform__category")) \
.annotate(type=F("platform__type")) .annotate(type=F("platform__type"))