From 3159a4e794858ad6b81ff64f7d522dd16b7c027f Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Mon, 21 Apr 2025 10:30:18 +0800 Subject: [PATCH] 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 --- apps/assets/api/__init__.py | 4 +- apps/assets/api/asset/asset.py | 16 ++--- apps/assets/api/{domain.py => zone.py} | 22 +++---- apps/assets/const/base.py | 2 +- apps/assets/const/cloud.py | 4 +- apps/assets/const/custom.py | 2 +- apps/assets/const/database.py | 2 +- apps/assets/const/device.py | 2 +- apps/assets/const/ds.py | 2 +- apps/assets/const/gpt.py | 2 +- apps/assets/const/host.py | 4 +- apps/assets/const/types.py | 2 +- apps/assets/const/web.py | 2 +- .../migrations/0002_auto_20180105_1807.py | 28 ++++++--- .../migrations/0003_auto_20180109_2331.py | 62 +++++++++---------- .../migrations/0016_directory_service.py | 2 +- .../migrations/0017_auto_20250407_1124.py | 4 +- .../migrations/0018_rename_domain_zone.py | 26 ++++++++ apps/assets/models/__init__.py | 3 +- apps/assets/models/asset/common.py | 14 ++--- apps/assets/models/platform.py | 2 +- apps/assets/models/{domain.py => zone.py} | 6 +- apps/assets/serializers/asset/common.py | 8 +-- apps/assets/serializers/domain.py | 18 +++--- apps/assets/serializers/platform.py | 10 +-- apps/assets/urls/api_urls.py | 2 +- .../authentication/models/connection_token.py | 12 ++-- .../serializers/connect_token_secret.py | 6 +- apps/i18n/core/es/LC_MESSAGES/django.po | 2 +- apps/i18n/core/ja/LC_MESSAGES/django.po | 2 +- apps/i18n/core/pt_BR/LC_MESSAGES/django.po | 2 +- apps/i18n/core/ru/LC_MESSAGES/django.po | 2 +- apps/i18n/core/zh/LC_MESSAGES/django.po | 4 +- apps/i18n/core/zh_Hant/LC_MESSAGES/django.po | 2 +- apps/ops/ansible/inventory.py | 6 +- apps/orgs/api.py | 4 +- apps/orgs/caches.py | 16 ++--- apps/orgs/serializers.py | 2 +- apps/orgs/signal_handlers/cache.py | 4 +- apps/perms/serializers/user_permission.py | 6 +- 40 files changed, 178 insertions(+), 143 deletions(-) rename apps/assets/api/{domain.py => zone.py} (77%) create mode 100644 apps/assets/migrations/0018_rename_domain_zone.py rename apps/assets/models/{domain.py => zone.py} (90%) diff --git a/apps/assets/api/__init__.py b/apps/assets/api/__init__.py index 3f49c2b62..947383513 100644 --- a/apps/assets/api/__init__.py +++ b/apps/assets/api/__init__.py @@ -1,10 +1,10 @@ from .asset import * from .category import * -from .domain import * from .favorite_asset import * from .mixin import * +from .my_asset import * from .node import * from .platform import * from .protocol import * from .tree import * -from .my_asset import * +from .zone import * diff --git a/apps/assets/api/asset/asset.py b/apps/assets/api/asset/asset.py index 0bc4df0f3..06818a0f3 100644 --- a/apps/assets/api/asset/asset.py +++ b/apps/assets/api/asset/asset.py @@ -37,12 +37,12 @@ class AssetFilterSet(BaseFilterSet): platform = drf_filters.CharFilter(method='filter_platform') is_gateway = drf_filters.BooleanFilter(method='filter_is_gateway') 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") category = drf_filters.CharFilter(field_name="platform__category", lookup_expr="exact") protocols = drf_filters.CharFilter(method='filter_protocols') - domain_enabled = drf_filters.BooleanFilter( - field_name="platform__domain_enabled", lookup_expr="exact" + gateway_enabled = drf_filters.BooleanFilter( + field_name="platform__gateway_enabled", lookup_expr="exact" ) ping_enabled = drf_filters.BooleanFilter( field_name="platform__automation__ping_enabled", lookup_expr="exact" @@ -85,11 +85,11 @@ class AssetFilterSet(BaseFilterSet): return queryset @staticmethod - def filter_domain(queryset, name, value): + def filter_zone(queryset, name, value): if is_uuid(value): - return queryset.filter(domain_id=value) + return queryset.filter(zone_id=value) else: - return queryset.filter(domain__name__contains=value) + return queryset.filter(zone__name__contains=value) @staticmethod def filter_protocols(queryset, name, value): @@ -171,10 +171,10 @@ class AssetViewSet(SuggestionMixin, BaseAssetViewSet): @action(methods=["GET"], detail=True, url_path="gateways") def gateways(self, *args, **kwargs): asset = self.get_object() - if not asset.domain: + if not asset.zone: gateways = Gateway.objects.none() else: - gateways = asset.domain.gateways + gateways = asset.zone.gateways return self.get_paginated_response_from_queryset(gateways) @action(methods=['post'], detail=False, url_path='sync-platform-protocols') diff --git a/apps/assets/api/domain.py b/apps/assets/api/zone.py similarity index 77% rename from apps/assets/api/domain.py rename to apps/assets/api/zone.py index 21cb3b2c7..6e0be3e7f 100644 --- a/apps/assets/api/domain.py +++ b/apps/assets/api/zone.py @@ -9,24 +9,24 @@ from common.utils import get_logger from orgs.mixins.api import OrgBulkModelViewSet from .asset import HostViewSet from .. import serializers -from ..models import Domain, Gateway +from ..models import Zone, Gateway logger = get_logger(__file__) -__all__ = ['DomainViewSet', 'GatewayViewSet', "GatewayTestConnectionApi"] +__all__ = ['ZoneViewSet', 'GatewayViewSet', "GatewayTestConnectionApi"] -class DomainViewSet(OrgBulkModelViewSet): - model = Domain +class ZoneViewSet(OrgBulkModelViewSet): + model = Zone filterset_fields = ("name",) search_fields = filterset_fields serializer_classes = { - 'default': serializers.DomainSerializer, - 'list': serializers.DomainListSerializer, + 'default': serializers.ZoneSerializer, + 'list': serializers.ZoneListSerializer, } def get_serializer_class(self): if self.request.query_params.get('gateway'): - return serializers.DomainWithGatewaySerializer + return serializers.ZoneWithGatewaySerializer return super().get_serializer_class() def partial_update(self, request, *args, **kwargs): @@ -36,8 +36,8 @@ class DomainViewSet(OrgBulkModelViewSet): class GatewayViewSet(HostViewSet): perm_model = Gateway - filterset_fields = ("domain__name", "name", "domain") - search_fields = ("domain__name",) + filterset_fields = ("zone__name", "name", "zone") + search_fields = ("zone__name",) def get_serializer_classes(self): serializer_classes = super().get_serializer_classes() @@ -45,7 +45,7 @@ class GatewayViewSet(HostViewSet): return serializer_classes def get_queryset(self): - queryset = Domain.get_gateway_queryset() + queryset = Zone.get_gateway_queryset() return queryset @@ -55,7 +55,7 @@ class GatewayTestConnectionApi(SingleObjectMixin, APIView): } def get_queryset(self): - queryset = Domain.get_gateway_queryset() + queryset = Zone.get_gateway_queryset() return queryset def post(self, request, *args, **kwargs): diff --git a/apps/assets/const/base.py b/apps/assets/const/base.py index 7df231eb5..a98d661c9 100644 --- a/apps/assets/const/base.py +++ b/apps/assets/const/base.py @@ -37,7 +37,7 @@ class FillType(models.TextChoices): class BaseType(TextChoices): """ 约束应该考虑代是对平台对限制,避免多余对选项,如: mysql 开启 ssh, - 或者开启了也没有作用, 比如 k8s 开启了 domain,目前还不支持 + 或者开启了也没有作用, 比如 k8s 开启了 gateway 目前还不支持 """ @classmethod diff --git a/apps/assets/const/cloud.py b/apps/assets/const/cloud.py index 02410a6a9..51d615ef1 100644 --- a/apps/assets/const/cloud.py +++ b/apps/assets/const/cloud.py @@ -13,11 +13,11 @@ class CloudTypes(BaseType): return { '*': { 'charset_enabled': False, - 'domain_enabled': False, + 'gateway_enabled': False, 'su_enabled': False, }, cls.K8S: { - 'domain_enabled': True, + 'gateway_enabled': True, } } diff --git a/apps/assets/const/custom.py b/apps/assets/const/custom.py index 878207f26..f6f54c9ec 100644 --- a/apps/assets/const/custom.py +++ b/apps/assets/const/custom.py @@ -20,7 +20,7 @@ class CustomTypes(BaseType): return { '*': { 'charset_enabled': False, - 'domain_enabled': False, + 'gateway_enabled': False, 'su_enabled': False, }, } diff --git a/apps/assets/const/database.py b/apps/assets/const/database.py index 8acbdbb43..5123c5291 100644 --- a/apps/assets/const/database.py +++ b/apps/assets/const/database.py @@ -20,7 +20,7 @@ class DatabaseTypes(BaseType): return { '*': { 'charset_enabled': False, - 'domain_enabled': True, + 'gateway_enabled': True, 'su_enabled': False, } } diff --git a/apps/assets/const/device.py b/apps/assets/const/device.py index 9336d129d..05a0b56a1 100644 --- a/apps/assets/const/device.py +++ b/apps/assets/const/device.py @@ -19,7 +19,7 @@ class DeviceTypes(BaseType): return { '*': { 'charset_enabled': False, - 'domain_enabled': True, + 'gateway_enabled': True, 'ds_enabled': False, 'su_enabled': True, 'su_methods': ['enable', 'super', 'super_level'] diff --git a/apps/assets/const/ds.py b/apps/assets/const/ds.py index c99809646..5883a83d2 100644 --- a/apps/assets/const/ds.py +++ b/apps/assets/const/ds.py @@ -16,7 +16,7 @@ class DirectoryTypes(BaseType): return { '*': { 'charset_enabled': True, - 'domain_enabled': True, + 'gateway_enabled': True, 'ds_enabled': False, 'su_enabled': True, }, diff --git a/apps/assets/const/gpt.py b/apps/assets/const/gpt.py index 65d01ee97..b3b078031 100644 --- a/apps/assets/const/gpt.py +++ b/apps/assets/const/gpt.py @@ -11,7 +11,7 @@ class GPTTypes(BaseType): return { '*': { 'charset_enabled': False, - 'domain_enabled': False, + 'gateway_enabled': False, 'su_enabled': False, } } diff --git a/apps/assets/const/host.py b/apps/assets/const/host.py index cd0103f8c..1a9f7e485 100644 --- a/apps/assets/const/host.py +++ b/apps/assets/const/host.py @@ -18,7 +18,7 @@ class HostTypes(BaseType): '*': { 'charset_enabled': True, 'charset': 'utf-8', # default - 'domain_enabled': True, + 'gateway_enabled': True, 'su_enabled': True, 'ds_enabled': True, 'su_methods': ['sudo', 'su', 'only_sudo', 'only_su'], @@ -81,7 +81,7 @@ class HostTypes(BaseType): {'name': 'Linux'}, { 'name': GATEWAY_NAME, - 'domain_enabled': True, + 'gateway_enabled': True, } ], cls.UNIX: [ diff --git a/apps/assets/const/types.py b/apps/assets/const/types.py index dfa8ba399..0600daab8 100644 --- a/apps/assets/const/types.py +++ b/apps/assets/const/types.py @@ -312,7 +312,7 @@ class AllTypes(ChoicesMixin): 'category': category, 'type': tp, 'internal': True, '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), } if data['su_enabled'] and data.get('su_methods'): diff --git a/apps/assets/const/web.py b/apps/assets/const/web.py index 42ea995ac..ab481e609 100644 --- a/apps/assets/const/web.py +++ b/apps/assets/const/web.py @@ -11,7 +11,7 @@ class WebTypes(BaseType): return { '*': { 'charset_enabled': False, - 'domain_enabled': False, + 'gateway_enabled': False, 'su_enabled': False, } } diff --git a/apps/assets/migrations/0002_auto_20180105_1807.py b/apps/assets/migrations/0002_auto_20180105_1807.py index 22c114cf8..b1daeaac9 100644 --- a/apps/assets/migrations/0002_auto_20180105_1807.py +++ b/apps/assets/migrations/0002_auto_20180105_1807.py @@ -1,11 +1,11 @@ # Generated by Django 4.1.13 on 2024-05-09 03:16 -import json -import assets.models.asset.common -from django.db.models import F, Q +import django.db.models.deletion from django.conf import settings 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): @@ -39,22 +39,26 @@ class Migration(migrations.Migration): migrations.AddField( model_name='automationexecution', 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( model_name='asset', 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( model_name='asset', 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( model_name='asset', 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( name='AssetBaseAutomation', @@ -71,7 +75,9 @@ class Migration(migrations.Migration): migrations.CreateModel( name='GatherFactsAutomation', 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={ 'verbose_name': 'Gather asset facts', @@ -81,7 +87,9 @@ class Migration(migrations.Migration): migrations.CreateModel( name='PingAutomation', 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={ 'verbose_name': 'Ping asset', diff --git a/apps/assets/migrations/0003_auto_20180109_2331.py b/apps/assets/migrations/0003_auto_20180109_2331.py index ccec49608..5d8d54475 100644 --- a/apps/assets/migrations/0003_auto_20180109_2331.py +++ b/apps/assets/migrations/0003_auto_20180109_2331.py @@ -18,7 +18,7 @@ platforms_data_json = '''[ "type": "linux", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": true, "su_method": null, "custom_fields": [], @@ -119,7 +119,7 @@ platforms_data_json = '''[ "type": "unix", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": true, "su_method": null, "custom_fields": [], @@ -209,7 +209,7 @@ platforms_data_json = '''[ "type": "unix", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": true, "su_method": null, "custom_fields": [], @@ -299,7 +299,7 @@ platforms_data_json = '''[ "type": "unix", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": true, "su_method": null, "custom_fields": [], @@ -389,7 +389,7 @@ platforms_data_json = '''[ "type": "windows", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -481,7 +481,7 @@ platforms_data_json = '''[ "security": "any" }, "internal": false, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -582,7 +582,7 @@ platforms_data_json = '''[ "type": "other", "meta": {}, "internal": false, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -684,7 +684,7 @@ platforms_data_json = '''[ "security": "rdp" }, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -776,7 +776,7 @@ platforms_data_json = '''[ "security": "tls" }, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -866,7 +866,7 @@ platforms_data_json = '''[ "type": "unix", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": true, "su_method": null, "custom_fields": [], @@ -956,7 +956,7 @@ platforms_data_json = '''[ "type": "linux", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": true, "su_method": null, "custom_fields": [], @@ -1057,7 +1057,7 @@ platforms_data_json = '''[ "type": "windows", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1136,7 +1136,7 @@ platforms_data_json = '''[ "type": "general", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1201,7 +1201,7 @@ platforms_data_json = '''[ "type": "general", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": true, "su_method": "enable", "custom_fields": [], @@ -1266,7 +1266,7 @@ platforms_data_json = '''[ "type": "general", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": true, "su_method": "super", "custom_fields": [], @@ -1332,7 +1332,7 @@ platforms_data_json = '''[ "type": "general", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": true, "su_method": "super_level", "custom_fields": [], @@ -1397,7 +1397,7 @@ platforms_data_json = '''[ "type": "mysql", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1449,7 +1449,7 @@ platforms_data_json = '''[ "type": "mariadb", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1501,7 +1501,7 @@ platforms_data_json = '''[ "type": "postgresql", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1553,7 +1553,7 @@ platforms_data_json = '''[ "type": "oracle", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1605,7 +1605,7 @@ platforms_data_json = '''[ "type": "sqlserver", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1657,7 +1657,7 @@ platforms_data_json = '''[ "type": "clickhouse", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1709,7 +1709,7 @@ platforms_data_json = '''[ "type": "mongodb", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1761,7 +1761,7 @@ platforms_data_json = '''[ "type": "redis", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1815,7 +1815,7 @@ platforms_data_json = '''[ "type": "redis", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1869,7 +1869,7 @@ platforms_data_json = '''[ "type": "website", "meta": {}, "internal": true, - "domain_enabled": false, + "gateway_enabled": false, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1924,7 +1924,7 @@ platforms_data_json = '''[ "type": "private", "meta": {}, "internal": true, - "domain_enabled": false, + "gateway_enabled": false, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -1979,7 +1979,7 @@ platforms_data_json = '''[ "type": "k8s", "meta": {}, "internal": true, - "domain_enabled": false, + "gateway_enabled": false, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -2029,7 +2029,7 @@ platforms_data_json = '''[ "type": "chatgpt", "meta": {}, "internal": true, - "domain_enabled": false, + "gateway_enabled": false, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -2081,7 +2081,7 @@ platforms_data_json = '''[ "type": "db2", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -2131,7 +2131,7 @@ platforms_data_json = '''[ "type": "dameng", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], diff --git a/apps/assets/migrations/0016_directory_service.py b/apps/assets/migrations/0016_directory_service.py index 39de22fff..32de705c0 100644 --- a/apps/assets/migrations/0016_directory_service.py +++ b/apps/assets/migrations/0016_directory_service.py @@ -52,6 +52,6 @@ class Migration(migrations.Migration): related_name="assets", to="assets.directoryservice", verbose_name="Directory services", - ), + ) ), ] diff --git a/apps/assets/migrations/0017_auto_20250407_1124.py b/apps/assets/migrations/0017_auto_20250407_1124.py index 5da3c21d4..b5f6746e6 100644 --- a/apps/assets/migrations/0017_auto_20250407_1124.py +++ b/apps/assets/migrations/0017_auto_20250407_1124.py @@ -19,7 +19,7 @@ def add_ds_platforms(apps, schema_editor): "type": "windows_ad", "meta": {}, "internal": true, - "domain_enabled": true, + "gateway_enabled": true, "su_enabled": false, "su_method": null, "custom_fields": [], @@ -117,7 +117,7 @@ def add_ds_platforms(apps, schema_editor): "meta": { }, "internal": true, - "domain_enabled": false, + "gateway_enabled": false, "su_enabled": false, "su_method": null, "custom_fields": [ diff --git a/apps/assets/migrations/0018_rename_domain_zone.py b/apps/assets/migrations/0018_rename_domain_zone.py new file mode 100644 index 000000000..f63b3d266 --- /dev/null +++ b/apps/assets/migrations/0018_rename_domain_zone.py @@ -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", + ), + ] diff --git a/apps/assets/models/__init__.py b/apps/assets/models/__init__.py index dc6ca8e97..3b9c390b7 100644 --- a/apps/assets/models/__init__.py +++ b/apps/assets/models/__init__.py @@ -1,9 +1,10 @@ +# noqa from .base import * from .platform import * from .asset import * from .label import Label from .gateway import * -from .domain import * +from .zone import * # noqa from .node import * from .favorite_asset import * from .automations import * diff --git a/apps/assets/models/asset/common.py b/apps/assets/models/asset/common.py index 93e883045..0bbd945b6 100644 --- a/apps/assets/models/asset/common.py +++ b/apps/assets/models/asset/common.py @@ -168,8 +168,8 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin, platform = models.ForeignKey( Platform, on_delete=models.PROTECT, verbose_name=_("Platform"), related_name='assets' ) - domain = models.ForeignKey( - "assets.Domain", null=True, blank=True, related_name='assets', + zone = models.ForeignKey( + "assets.Zone", null=True, blank=True, related_name='assets', verbose_name=_("Zone"), on_delete=models.SET_NULL ) nodes = models.ManyToManyField( @@ -177,7 +177,7 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin, ) directory_services = models.ManyToManyField( 'assets.DirectoryService', related_name='assets', - verbose_name=_("Directory service") + 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) # 资产的一些信息,如 硬件信息 @@ -244,7 +244,7 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin, platform = self.platform auto_config = { 'su_enabled': platform.su_enabled, - 'domain_enabled': platform.domain_enabled, + 'gateway_enabled': platform.gateway_enabled, 'ansible_enabled': False } automation = getattr(self.platform, 'automation', None) @@ -362,11 +362,11 @@ class Asset(NodesRelationMixin, LabeledMixin, AbsConnectivity, JSONFilterMixin, @lazyproperty def gateway(self): - if not self.domain_id: + if not self.zone_id: return - if not self.platform.domain_enabled: + if not self.platform.gateway_enabled: return - return self.domain.select_gateway() + return self.zone.select_gateway() def as_node(self): from assets.models import Node diff --git a/apps/assets/models/platform.py b/apps/assets/models/platform.py index ed7816afa..b3a7e845f 100644 --- a/apps/assets/models/platform.py +++ b/apps/assets/models/platform.py @@ -101,7 +101,7 @@ class Platform(LabeledMixin, JMSBaseModel): default=CharsetChoices.utf8, choices=CharsetChoices.choices, 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")) # 账号有关的 su_enabled = models.BooleanField(default=False, verbose_name=_("Su enabled")) diff --git a/apps/assets/models/domain.py b/apps/assets/models/zone.py similarity index 90% rename from apps/assets/models/domain.py rename to apps/assets/models/zone.py index 4a9311aed..87cd87943 100644 --- a/apps/assets/models/domain.py +++ b/apps/assets/models/zone.py @@ -12,10 +12,10 @@ from .gateway import Gateway 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')) class Meta: @@ -49,7 +49,7 @@ class Domain(LabeledMixin, JMSOrgBaseModel): @property def gateways(self): - queryset = self.get_gateway_queryset().filter(domain=self) + queryset = self.get_gateway_queryset().filter(zone=self) return queryset @classmethod diff --git a/apps/assets/serializers/asset/common.py b/apps/assets/serializers/asset/common.py index b61e2e286..fa639eb48 100644 --- a/apps/assets/serializers/asset/common.py +++ b/apps/assets/serializers/asset/common.py @@ -154,7 +154,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa class Meta: model = Asset - fields_fk = ['domain', 'platform'] + fields_fk = ['zone', 'platform'] fields_mini = ['id', 'name', 'address'] + fields_fk fields_small = fields_mini + ['is_active', 'comment'] fields_m2m = [ @@ -233,7 +233,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa @classmethod def setup_eager_loading(cls, queryset): """ 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') \ .annotate(category=F("platform__category")) \ .annotate(type=F("platform__type")) \ @@ -271,9 +271,9 @@ class AssetSerializer(BulkOrgResourceModelSerializer, ResourceLabelsMixin, Writa raise serializers.ValidationError({'platform': _("Platform not exist")}) return platform - def validate_domain(self, value): + def validate_zone(self, value): platform = self._asset_platform - if platform.domain_enabled: + if platform.gateway_enabled: return value else: return None diff --git a/apps/assets/serializers/domain.py b/apps/assets/serializers/domain.py index 9181db18c..4dee96a68 100644 --- a/apps/assets/serializers/domain.py +++ b/apps/assets/serializers/domain.py @@ -8,12 +8,12 @@ from common.serializers import ResourceLabelsMixin from common.serializers.fields import ObjectRelatedField from orgs.mixins.serializers import BulkOrgResourceModelSerializer 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( many=True, required=False, label=_('Gateway'), queryset=Gateway.objects, help_text=_( @@ -23,7 +23,7 @@ class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer): assets_amount = serializers.IntegerField(label=_('Assets amount'), read_only=True) class Meta: - model = Domain + model = Zone fields_mini = ['id', 'name'] fields_small = fields_mini + ['comment'] fields_m2m = ['assets', 'gateways', 'labels', 'assets_amount'] @@ -55,9 +55,9 @@ class DomainSerializer(ResourceLabelsMixin, BulkOrgResourceModelSerializer): return super().update(instance, validated_data) -class DomainListSerializer(DomainSerializer): - class Meta(DomainSerializer.Meta): - fields = list(set(DomainSerializer.Meta.fields + ['assets_amount']) - {'assets'}) +class ZoneListSerializer(ZoneSerializer): + class Meta(ZoneSerializer.Meta): + fields = list(set(ZoneSerializer.Meta.fields + ['assets_amount']) - {'assets'}) @classmethod def setup_eager_loading(cls, queryset): @@ -67,9 +67,9 @@ class DomainListSerializer(DomainSerializer): return queryset -class DomainWithGatewaySerializer(serializers.ModelSerializer): +class ZoneWithGatewaySerializer(serializers.ModelSerializer): gateways = GatewayWithAccountSecretSerializer(many=True, read_only=True) class Meta: - model = Domain + model = Zone fields = '__all__' diff --git a/apps/assets/serializers/platform.py b/apps/assets/serializers/platform.py index ebe28ca2a..42ca5a5c5 100644 --- a/apps/assets/serializers/platform.py +++ b/apps/assets/serializers/platform.py @@ -194,7 +194,7 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes ] fields_m2m = ['assets', 'assets_amount'] 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" ] + read_only_fields extra_kwargs = { @@ -205,11 +205,11 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes "similar to logging in with a regular account and then switching to root" ) }, - "domain_enabled": { + "gateway_enabled": { "label": _('Gateway enabled'), "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')}, } @@ -262,8 +262,8 @@ class PlatformSerializer(ResourceLabelsMixin, CommonSerializerMixin, WritableNes def validate_su_enabled(self, su_enabled): return su_enabled and self.constraints.get('su_enabled', False) - def validate_domain_enabled(self, domain_enabled): - return domain_enabled and self.constraints.get('domain_enabled', False) + def validate_gateway_enabled(self, gateway_enabled): + return gateway_enabled and self.constraints.get('gateway_enabled', False) def validate_automation(self, automation): automation = automation or {} diff --git a/apps/assets/urls/api_urls.py b/apps/assets/urls/api_urls.py index 0ff108802..7527be88e 100644 --- a/apps/assets/urls/api_urls.py +++ b/apps/assets/urls/api_urls.py @@ -20,7 +20,7 @@ router.register(r'directories', api.DSViewSet, 'ds') router.register(r'customs', api.CustomViewSet, 'custom') router.register(r'platforms', api.AssetPlatformViewSet, 'platform') 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'favorite-assets', api.FavoriteAssetViewSet, 'favorite-asset') router.register(r'protocol-settings', api.PlatformProtocolViewSet, 'protocol-setting') diff --git a/apps/authentication/models/connection_token.py b/apps/authentication/models/connection_token.py index 9c8fe5f6a..95e0c3d7e 100644 --- a/apps/authentication/models/connection_token.py +++ b/apps/authentication/models/connection_token.py @@ -251,7 +251,7 @@ class ConnectionToken(JMSOrgBaseModel): 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')) - gateway = host.domain.select_gateway() if host.domain else None + gateway = host.zone.select_gateway() if host.zone else None platform = host.platform data = { @@ -305,17 +305,17 @@ class ConnectionToken(JMSOrgBaseModel): return account @lazyproperty - def domain(self): - if not self.asset.platform.domain_enabled: + def zone(self): + if not self.asset.platform.gateway_enabled: return if self.asset.platform.name == GATEWAY_NAME: return - domain = self.asset.domain if self.asset.domain else None - return domain + zone = self.asset.zone if self.asset.zone else None + return zone @lazyproperty def gateway(self): - if not self.asset or not self.domain: + if not self.asset or not self.zone: return return self.asset.gateway diff --git a/apps/authentication/serializers/connect_token_secret.py b/apps/authentication/serializers/connect_token_secret.py index e38cbea18..8f3c60936 100644 --- a/apps/authentication/serializers/connect_token_secret.py +++ b/apps/authentication/serializers/connect_token_secret.py @@ -4,7 +4,7 @@ from rest_framework import serializers from accounts.const import SecretType from accounts.models import Account 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.platform import PlatformSerializer from common.serializers.fields import LabeledChoiceField @@ -135,7 +135,7 @@ class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin): account = _ConnectionTokenAccountSerializer(read_only=True, source='account_object') gateway = _ConnectionTokenGatewaySerializer(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) expire_now = serializers.BooleanField(label=_('Expired now'), write_only=True, default=True) connect_method = _ConnectTokenConnectMethodSerializer(read_only=True, source='connect_method_object') @@ -148,7 +148,7 @@ class ConnectionTokenSecretSerializer(OrgResourceModelSerializerMixin): fields = [ 'id', 'value', 'user', 'asset', 'account', 'platform', 'command_filter_acls', 'protocol', - 'domain', 'gateway', 'actions', 'expire_at', + 'zone', 'gateway', 'actions', 'expire_at', 'from_ticket', 'expire_now', 'connect_method', 'connect_options', 'face_monitor_token' ] diff --git a/apps/i18n/core/es/LC_MESSAGES/django.po b/apps/i18n/core/es/LC_MESSAGES/django.po index 4ce3e746f..ac39eb117 100644 --- a/apps/i18n/core/es/LC_MESSAGES/django.po +++ b/apps/i18n/core/es/LC_MESSAGES/django.po @@ -2882,7 +2882,7 @@ msgstr "Código" #: assets/models/platform.py:104 assets/serializers/platform.py:209 msgid "Gateway enabled" -msgstr "Activar dominio" +msgstr "Activar gateway de zona" #: assets/models/platform.py:105 msgid "DS enabled" diff --git a/apps/i18n/core/ja/LC_MESSAGES/django.po b/apps/i18n/core/ja/LC_MESSAGES/django.po index 04ea1f664..464548ac0 100644 --- a/apps/i18n/core/ja/LC_MESSAGES/django.po +++ b/apps/i18n/core/ja/LC_MESSAGES/django.po @@ -2769,7 +2769,7 @@ msgstr "シャーセット" #: assets/models/platform.py:104 assets/serializers/platform.py:209 msgid "Gateway enabled" -msgstr "ゲートウェイが有効になりました" +msgstr "ゾーンゲートウェイを有効化" #: assets/models/platform.py:105 msgid "DS enabled" diff --git a/apps/i18n/core/pt_BR/LC_MESSAGES/django.po b/apps/i18n/core/pt_BR/LC_MESSAGES/django.po index 3026fff36..39126f8a6 100644 --- a/apps/i18n/core/pt_BR/LC_MESSAGES/django.po +++ b/apps/i18n/core/pt_BR/LC_MESSAGES/django.po @@ -2862,7 +2862,7 @@ msgstr "Codificação" #: assets/models/platform.py:104 assets/serializers/platform.py:209 msgid "Gateway enabled" -msgstr "Habilitar domínio" +msgstr "Ativar zone gateway" #: assets/models/platform.py:105 msgid "DS enabled" diff --git a/apps/i18n/core/ru/LC_MESSAGES/django.po b/apps/i18n/core/ru/LC_MESSAGES/django.po index 17889efdb..7334e7690 100644 --- a/apps/i18n/core/ru/LC_MESSAGES/django.po +++ b/apps/i18n/core/ru/LC_MESSAGES/django.po @@ -2827,7 +2827,7 @@ msgstr "Кодировка" #: assets/models/platform.py:104 assets/serializers/platform.py:209 msgid "Gateway enabled" -msgstr "Шлюз включен" +msgstr "Включить шлюз зоны" #: assets/models/platform.py:105 msgid "DS enabled" diff --git a/apps/i18n/core/zh/LC_MESSAGES/django.po b/apps/i18n/core/zh/LC_MESSAGES/django.po index f8d709c6b..f74984aa6 100644 --- a/apps/i18n/core/zh/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh/LC_MESSAGES/django.po @@ -2780,11 +2780,11 @@ msgstr "编码" #: assets/models/platform.py:104 assets/serializers/platform.py:209 msgid "Gateway enabled" -msgstr "启用网域" +msgstr "启用网域网关" #: assets/models/platform.py:105 msgid "DS enabled" -msgstr "目录服务已启用" +msgstr "启用目录服务" #: assets/models/platform.py:107 assets/serializers/platform.py:202 msgid "Su enabled" diff --git a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po index 541ac38ce..17a5b5b31 100644 --- a/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po +++ b/apps/i18n/core/zh_Hant/LC_MESSAGES/django.po @@ -2751,7 +2751,7 @@ msgstr "編碼" #: assets/models/platform.py:104 assets/serializers/platform.py:209 msgid "Gateway enabled" -msgstr "啟用網域" +msgstr "啟用網域網関" #: assets/models/platform.py:105 msgid "DS enabled" diff --git a/apps/ops/ansible/inventory.py b/apps/ops/ansible/inventory.py index 164b44298..35085aa1f 100644 --- a/apps/ops/ansible/inventory.py +++ b/apps/ops/ansible/inventory.py @@ -37,7 +37,7 @@ class JMSInventory: from assets.models import Asset asset_ids = [asset.id for asset in assets] assets = Asset.objects.filter(id__in=asset_ids, is_active=True) \ - .prefetch_related('platform', 'domain', 'accounts') + .prefetch_related('platform', 'zone', 'accounts') return assets @staticmethod @@ -236,8 +236,8 @@ class JMSInventory: host.update(ansible_config) gateway = None - if not asset.is_gateway and asset.domain: - gateway = asset.domain.select_gateway() + if not asset.is_gateway and asset.zone: + gateway = asset.zone.select_gateway() self.make_account_vars( host, asset, account, automation, protocol, platform, gateway, path_dir, ansible_config diff --git a/apps/orgs/api.py b/apps/orgs/api.py index b93479c7e..1bcb4a6ac 100644 --- a/apps/orgs/api.py +++ b/apps/orgs/api.py @@ -7,7 +7,7 @@ from rest_framework.exceptions import PermissionDenied from rest_framework.generics import RetrieveAPIView from assets.models import ( - Asset, Domain, Label, Node, + Asset, Zone, Label, Node, ) from common.api import JMSBulkModelViewSet from common.permissions import IsValidUser @@ -24,7 +24,7 @@ logger = get_logger(__file__) # 部分 org 相关的 model,需要清空这些数据之后才能删除该组织 org_related_models = [ - User, UserGroup, Asset, Node, Label, Domain, AssetPermission + User, UserGroup, Asset, Node, Label, Zone, AssetPermission ] diff --git a/apps/orgs/caches.py b/apps/orgs/caches.py index b1f8fbdea..4f0e7f909 100644 --- a/apps/orgs/caches.py +++ b/apps/orgs/caches.py @@ -1,16 +1,16 @@ from django.db.transaction import on_commit -from orgs.models import Organization -from orgs.tasks import refresh_org_cache_task -from orgs.utils import current_org, tmp_to_org +from accounts.models import Account +from assets.models import Node, Zone, Asset from common.cache import Cache, IntegerField from common.utils import get_logger from common.utils.timezone import local_zero_hour, local_monday -from users.models import UserGroup, User -from assets.models import Node, Domain, Asset -from accounts.models import Account -from terminal.models import Session +from orgs.models import Organization +from orgs.tasks import refresh_org_cache_task +from orgs.utils import current_org, tmp_to_org from perms.models import AssetPermission +from terminal.models import Session +from users.models import UserGroup, User logger = get_logger(__file__) @@ -57,7 +57,7 @@ class OrgResourceStatisticsCache(OrgRelatedCache): new_users_amount_this_week = IntegerField() new_assets_amount_this_week = IntegerField() nodes_amount = IntegerField(queryset=Node.objects) - domains_amount = IntegerField(queryset=Domain.objects) + zones_amount = IntegerField(queryset=Zone.objects) groups_amount = IntegerField(queryset=UserGroup.objects) accounts_amount = IntegerField(queryset=Account.objects) asset_perms_amount = IntegerField(queryset=AssetPermission.objects) diff --git a/apps/orgs/serializers.py b/apps/orgs/serializers.py index 7c7cc02fb..bf37b9aaf 100644 --- a/apps/orgs/serializers.py +++ b/apps/orgs/serializers.py @@ -12,7 +12,7 @@ class ResourceStatisticsSerializer(serializers.Serializer): assets_amount = serializers.IntegerField(required=False, label=_('Assets 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')) asset_perms_amount = serializers.IntegerField(required=False, label=_('Asset permissions amount')) diff --git a/apps/orgs/signal_handlers/cache.py b/apps/orgs/signal_handlers/cache.py index 73faf1fd3..5c637ba9c 100644 --- a/apps/orgs/signal_handlers/cache.py +++ b/apps/orgs/signal_handlers/cache.py @@ -2,7 +2,7 @@ from django.db.models.signals import post_save, pre_delete, pre_save, post_delet from django.dispatch import receiver from accounts.models import Account -from assets.models import Asset, Domain +from assets.models import Asset, Zone from assets.models import Node from common.decorators import merge_delay_run from common.utils import get_logger @@ -64,7 +64,7 @@ def on_user_delete_refresh_cache(sender, instance, **kwargs): model_cache_field_mapper = { Node: ['nodes_amount'], - Domain: ['domains_amount'], + Zone: ['zones_amount'], UserGroup: ['groups_amount'], Account: ['accounts_amount'], RoleBinding: ['users_amount', 'new_users_amount_this_week'], diff --git a/apps/perms/serializers/user_permission.py b/apps/perms/serializers/user_permission.py index c1a2ecaa4..43c022e21 100644 --- a/apps/perms/serializers/user_permission.py +++ b/apps/perms/serializers/user_permission.py @@ -25,12 +25,12 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin platform = ObjectRelatedField(required=False, queryset=Platform.objects, label=_('Platform')) category = LabeledChoiceField(choices=Category.choices, read_only=True, label=_('Category')) 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: model = Asset only_fields = [ - 'id', 'name', 'address', 'domain', 'platform', + 'id', 'name', 'address', 'zone', 'platform', 'comment', 'org_id', 'is_active', 'date_verified', 'created_by', 'date_created', 'connectivity', 'nodes', 'labels' ] @@ -40,7 +40,7 @@ class AssetPermedSerializer(OrgResourceModelSerializerMixin, ResourceLabelsMixin @classmethod def setup_eager_loading(cls, queryset): """ Perform necessary eager loading of data. """ - queryset = queryset.prefetch_related('domain', 'nodes') \ + queryset = queryset.prefetch_related('zone', 'nodes') \ .prefetch_related('platform') \ .annotate(category=F("platform__category")) \ .annotate(type=F("platform__type"))