diff --git a/apps/assets/api/asset_user.py b/apps/assets/api/asset_user.py index 8e8a217ee46f7fd4536e75ee4820145c8c900fd3..38d8203492370d8285306b1c90c9a018d0791234 100644 --- a/apps/assets/api/asset_user.py +++ b/apps/assets/api/asset_user.py @@ -149,9 +149,10 @@ class AssetUserTestConnectiveApi(generics.RetrieveAPIView): def get_asset_users(self): username = self.request.GET.get('username') asset_id = self.request.GET.get('asset_id') + prefer = self.request.GET.get("prefer") asset = get_object_or_none(Asset, pk=asset_id) manager = AssetUserManager() - asset_users = manager.filter(username=username, assets=[asset]) + asset_users = manager.filter(username=username, assets=[asset], prefer=prefer) return asset_users def retrieve(self, request, *args, **kwargs): diff --git a/apps/assets/models/asset.py b/apps/assets/models/asset.py index 704abf4044a6e63889cad93b6446da2446bb0ccc..0e5fc209024603db9b0357999f926230c6451b73 100644 --- a/apps/assets/models/asset.py +++ b/apps/assets/models/asset.py @@ -126,6 +126,7 @@ class Asset(OrgModelMixin): comment = models.TextField(max_length=128, default='', blank=True, verbose_name=_('Comment')) objects = OrgManager.from_queryset(AssetQuerySet)() + _connectivity = None def __str__(self): return '{0.hostname}({0.ip})'.format(self) @@ -221,17 +222,18 @@ class Asset(OrgModelMixin): @property def connectivity(self): + if self._connectivity: + return self._connectivity if not self.admin_user: return Connectivity.unknown() - instance = self.admin_user.get_asset_user(self) - return instance.connectivity + connectivity = self.admin_user.get_asset_connectivity(self) + return connectivity @connectivity.setter def connectivity(self, value): if not self.admin_user: return - instance = self.admin_user.get_asset_user(self) - instance.set_asset_connectivity(self, value) + self.admin_user.set_asset_connectivity(self, value) def get_auth_info(self): if not self.admin_user: diff --git a/apps/assets/models/base.py b/apps/assets/models/base.py index 8c5c156a667d3b567c608648c35142a66bd2672d..bd85d144e2c48f9dd66c2f67fb75af4c61747aeb 100644 --- a/apps/assets/models/base.py +++ b/apps/assets/models/base.py @@ -35,8 +35,8 @@ class AssetUser(OrgModelMixin): date_updated = models.DateTimeField(auto_now=True, verbose_name=_("Date updated")) created_by = models.CharField(max_length=128, null=True, verbose_name=_('Created by')) - CONNECTIVITY_ASSET_CACHE_KEY = "ASSET_USER_{}_ASSET_CONNECTIVITY" - CONNECTIVITY_AMOUNT_CACHE_KEY = "ASSET_USER_{}_CONNECTIVITY_AMOUNT" + CONNECTIVITY_ASSET_CACHE_KEY = "ASSET_USER_{}_{}_ASSET_CONNECTIVITY" + CONNECTIVITY_AMOUNT_CACHE_KEY = "ASSET_USER_{}_{}_CONNECTIVITY_AMOUNT" ASSETS_AMOUNT_CACHE_KEY = "ASSET_USER_{}_ASSETS_AMOUNT" ASSET_USER_CACHE_TIME = 3600 * 24 @@ -99,21 +99,24 @@ class AssetUser(OrgModelMixin): unreachable = summary.get('dark', {}).keys() reachable = summary.get('contacted', {}).keys() - for asset in self.get_related_assets(): + assets = self.get_related_assets() + if not isinstance(assets, list): + assets = assets.only('id', 'hostname', 'admin_user__id') + for asset in assets: if asset.hostname in unreachable: self.set_asset_connectivity(asset, Connectivity.unreachable()) elif asset.hostname in reachable: self.set_asset_connectivity(asset, Connectivity.reachable()) else: self.set_asset_connectivity(asset, Connectivity.unknown()) - cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.part_id) + cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.username, self.part_id) cache.delete(cache_key) @property def connectivity(self): - assets = self.get_related_assets()\ - .select_related('admin_user')\ - .only('id', 'hostname', 'admin_user') + assets = self.get_related_assets() + if not isinstance(assets, list): + assets = assets.only('id', 'hostname', 'admin_user__id') data = { 'unreachable': [], 'reachable': [], @@ -131,11 +134,11 @@ class AssetUser(OrgModelMixin): @property def connectivity_amount(self): - cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.part_id) + cache_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.username, self.part_id) amount = cache.get(cache_key) if not amount: - connectivity = {k: len(v) for k, v in self.connectivity.items()} - cache.set(cache_key, connectivity, self.ASSET_USER_CACHE_TIME) + amount = {k: len(v) for k, v in self.connectivity.items()} + cache.set(cache_key, amount, self.ASSET_USER_CACHE_TIME) return amount @property @@ -152,17 +155,18 @@ class AssetUser(OrgModelMixin): cache.delete(cache_key) def get_asset_connectivity(self, asset): - i = self.generate_id_with_asset(asset) - key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i) + key = self.get_asset_connectivity_key(asset) return Connectivity.get(key) + def get_asset_connectivity_key(self, asset): + return self.CONNECTIVITY_ASSET_CACHE_KEY.format(self.username, asset.id) + def set_asset_connectivity(self, asset, c): - i = self.generate_id_with_asset(asset) - key = self.CONNECTIVITY_ASSET_CACHE_KEY.format(i) + key = self.get_asset_connectivity_key(asset) Connectivity.set(key, c) # 当为某个系统用户或管理用户设置的的时候,失效掉他们的连接数量 - amount_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.part_id) - cache.delete(amount_key) + amount_key = self.CONNECTIVITY_AMOUNT_CACHE_KEY.format(self.username, '*') + cache.delete_pattern(amount_key) def get_asset_user(self, asset): from ..backends import AssetUserManager diff --git a/apps/assets/models/utils.py b/apps/assets/models/utils.py index 0373267b8e84fcd57ff9d9df0b80571b044633a1..d010f95f2101a90d043ef82d8aecdebca69a4222 100644 --- a/apps/assets/models/utils.py +++ b/apps/assets/models/utils.py @@ -98,5 +98,11 @@ class Connectivity: def __eq__(self, other): return self.status == other.status + def __gt__(self, other): + return self.status > other.status + + def __lt__(self, other): + return not self.__gt__(other) + def __str__(self): return self.display() diff --git a/apps/assets/serializers/asset.py b/apps/assets/serializers/asset.py index 6cda758b81033a97d74960afa1ef9f5ef26b0555..24e19c82d1b014ee57896c8779b133d5f358b07c 100644 --- a/apps/assets/serializers/asset.py +++ b/apps/assets/serializers/asset.py @@ -2,12 +2,12 @@ # from rest_framework import serializers from rest_framework.validators import ValidationError - +from django.db.models import Prefetch from django.utils.translation import ugettext_lazy as _ from orgs.mixins import BulkOrgResourceModelSerializer from common.serializers import AdaptedBulkListSerializer -from ..models import Asset, Protocol +from ..models import Asset, Protocol, Node, Label from .base import ConnectivitySerializer __all__ = [ @@ -58,7 +58,7 @@ class AssetSerializer(BulkOrgResourceModelSerializer): 'cpu_model', 'cpu_count', 'cpu_cores', 'cpu_vcpus', 'memory', 'disk_total', 'disk_info', 'os', 'os_version', 'os_arch', 'hostname_raw', 'comment', 'created_by', 'date_created', - 'hardware_info', 'connectivity' + 'hardware_info', 'connectivity', ] read_only_fields = ( 'vendor', 'model', 'sn', 'cpu_model', 'cpu_count', @@ -76,8 +76,11 @@ class AssetSerializer(BulkOrgResourceModelSerializer): @classmethod def setup_eager_loading(cls, queryset): """ Perform necessary eager loading of data. """ - queryset = queryset.prefetch_related('labels', 'nodes', 'protocols')\ - .select_related('admin_user', 'domain') + queryset = queryset.prefetch_related( + Prefetch('nodes', queryset=Node.objects.all().only('id')), + Prefetch('labels', queryset=Label.objects.all().only('id')), + 'protocols' + ).select_related('admin_user', 'domain') return queryset @staticmethod diff --git a/apps/assets/tasks.py b/apps/assets/tasks.py index 54fb7068dde4ef771dc845c9a491daf76f8bb4cd..dbd6808f143ddb78ffa1a0e82b49d2c6bc7ad3a8 100644 --- a/apps/assets/tasks.py +++ b/apps/assets/tasks.py @@ -576,6 +576,7 @@ def test_asset_user_connectivity_util(asset_user, task_name, run_as_admin=False) tasks = get_test_asset_user_connectivity_tasks(asset_user.asset) if not tasks: + logger.debug("No tasks ") return args = (task_name,) diff --git a/apps/assets/templates/assets/_asset_user_list.html b/apps/assets/templates/assets/_asset_user_list.html index fda69e5d8f5601d69d88b2847fe8b0205a598dc4..381aec13d0e25338c4ff77e4813d0b91d6a3528f 100644 --- a/apps/assets/templates/assets/_asset_user_list.html +++ b/apps/assets/templates/assets/_asset_user_list.html @@ -92,8 +92,8 @@ function initAssetUserTable() { ajax_url: assetUserListUrl, columns: [ {data: "id"}, {data: "hostname"}, {data: "ip"}, - {data: "username", orderable: false}, {data: "version", orderable: false}, - {data: "connectivity", orderable: false}, + {data: "username"}, {data: "version", orderable: false}, + {data: "connectivity"}, {data: "date_created", orderable: false}, {data: "asset", orderable: false} ], diff --git a/apps/assets/templates/assets/admin_user_list.html b/apps/assets/templates/assets/admin_user_list.html index a930a6ce0eab93e2b6b4e21ed7956ba470c8af04..0a17eccaa248d0e4f35e4c0530362bb3abdaa4cb 100644 --- a/apps/assets/templates/assets/admin_user_list.html +++ b/apps/assets/templates/assets/admin_user_list.html @@ -75,7 +75,7 @@ function initTable() { }}, {targets: 4, createdCell: function (td, cellData) { var innerHtml = ""; - var data = cellData['reachable']; + var data = cellData.reachable; if (data !== 0) { innerHtml = "" + data + ""; } else { diff --git a/apps/common/mixins/api.py b/apps/common/mixins/api.py index 2bd1b5a16cda5eb162c22d55b365827448276685..ae92e3e972ce4bfcf115c0f8c3de7ec3349f9ea2 100644 --- a/apps/common/mixins/api.py +++ b/apps/common/mixins/api.py @@ -83,4 +83,4 @@ class ApiMessageMixin: message = self.get_success_message(resp.data) if message: messages.success(request, message) - return resp \ No newline at end of file + return resp diff --git a/apps/common/renders/csv.py b/apps/common/renders/csv.py index f917edd4c64b631831973f1ac84f5d67825372d5..9bd60cfbcaf27f08c236ea68fe1b428058ce8fe7 100644 --- a/apps/common/renders/csv.py +++ b/apps/common/renders/csv.py @@ -57,10 +57,15 @@ class JMSCSVRender(BaseRenderer): request = renderer_context['request'] template = request.query_params.get('template', 'export') view = renderer_context['view'] - data = json.loads(json.dumps(data, cls=encoders.JSONEncoder)) + + if isinstance(data, dict) and data.get("count"): + data = data["results"] + if template == 'import': data = [data[0]] if data else data + data = json.loads(json.dumps(data, cls=encoders.JSONEncoder)) + try: serializer = view.get_serializer() self.set_response_disposition(serializer, renderer_context) diff --git a/apps/ops/tasks.py b/apps/ops/tasks.py index a8afee59bf1e86e747883f63188e604eceb393b7..de7602f6b89312f0e84507edb49779e2a97ff232 100644 --- a/apps/ops/tasks.py +++ b/apps/ops/tasks.py @@ -47,7 +47,7 @@ def run_command_execution(cid, **kwargs): try: execution.run() except SoftTimeLimitExceeded: - print("HLLL") + logger.error("Run time out") else: logger.error("Not found the execution id: {}".format(cid)) diff --git a/apps/orgs/mixins/api.py b/apps/orgs/mixins/api.py index 180e9770bcfd6e4048f9e64d9ef8b80542a757f7..5bdaf234242d959e1217a2dd27b1130034bd75bf 100644 --- a/apps/orgs/mixins/api.py +++ b/apps/orgs/mixins/api.py @@ -28,7 +28,8 @@ class OrgModelViewSet(IDInCacheFilterMixin, ModelViewSet): class OrgBulkModelViewSet(IDInCacheFilterMixin, BulkModelViewSet): def get_queryset(self): queryset = super().get_queryset().all() - if hasattr(self, 'serializer_class') and \ + if hasattr(self, 'action') and self.action == 'list' and \ + hasattr(self, 'serializer_class') and \ hasattr(self.serializer_class, 'setup_eager_loading'): queryset = self.serializer_class.setup_eager_loading(queryset) return queryset diff --git a/apps/orgs/mixins/models.py b/apps/orgs/mixins/models.py index a928ea0f391e5eea761f0680912521560f62fc9f..3f54e14a770d72d32c359586884dbda5a6006817 100644 --- a/apps/orgs/mixins/models.py +++ b/apps/orgs/mixins/models.py @@ -32,10 +32,10 @@ class OrgManager(models.Manager): kwargs['org_id'] = _current_org.id elif _current_org.is_default(): queryset = queryset.filter(org_id="") - + # # lines = traceback.format_stack() # print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>") - # for line in lines[-10:-5]: + # for line in lines[-10:-1]: # print(line) # print("<<<<<<<<<<<<<<<<<<<<<<<<<<<<") diff --git a/apps/perms/api/user_permission.py b/apps/perms/api/user_permission.py index e072fed95844a11ece411bd2068df2bf8b39974b..14439703ef7eaf97ff0b140fda67ae202ed33e4b 100644 --- a/apps/perms/api/user_permission.py +++ b/apps/perms/api/user_permission.py @@ -262,7 +262,6 @@ class UserGrantedNodesWithAssetsAsTreeApi(UserPermissionCacheMixin, ListAPIView) system_users=self.system_user_id ) nodes = util.get_nodes_with_assets() - print(list(nodes.keys())) for node, assets in nodes.items(): data = parse_node_to_tree_node(node) queryset.append(data) diff --git a/apps/templates/_import_modal.html b/apps/templates/_import_modal.html index 01a1cdf7268d121454e7f6ea317cb49331662bb7..9211bdcb932ad93fc3f3e2d92e348ae962204352 100644 --- a/apps/templates/_import_modal.html +++ b/apps/templates/_import_modal.html @@ -10,7 +10,7 @@ {% csrf_token %}
- {% trans 'Download the import template' %} + {% trans 'Download the import template' %}