From f1c386714dbb7f1fc4b90b06c148c5278ca00a1c Mon Sep 17 00:00:00 2001 From: ibuler Date: Sun, 25 Feb 2018 22:36:42 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=E4=B8=80=E4=BA=9B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/assets/api/asset.py | 3 ++- apps/assets/forms/asset.py | 27 +++++++++++++------ apps/assets/models/node.py | 10 +++++-- apps/assets/serializers/node.py | 7 ++++- .../templates/assets/admin_user_list.html | 3 ++- apps/assets/templates/assets/asset_list.html | 2 +- .../templates/assets/system_user_list.html | 3 ++- apps/assets/views/asset.py | 1 + .../perms/asset_permission_list.html | 2 +- apps/templates/_message.html | 13 ++++++--- apps/terminal/api.py | 2 +- apps/terminal/urls/api_urls.py | 2 ++ 12 files changed, 55 insertions(+), 20 deletions(-) diff --git a/apps/assets/api/asset.py b/apps/assets/api/asset.py index 0a73a7fad..405beaf53 100644 --- a/apps/assets/api/asset.py +++ b/apps/assets/api/asset.py @@ -49,7 +49,8 @@ class AssetViewSet(IDInFilterMixin, LabelFilter, BulkModelViewSet): queryset = queryset.filter(admin_user=admin_user) if node_id: node = get_object_or_404(Node, id=node_id) - queryset = queryset.filter(nodes__key__startswith=node.key).distinct() + if not node.is_root(): + queryset = queryset.filter(nodes__key__startswith=node.key).distinct() return queryset diff --git a/apps/assets/forms/asset.py b/apps/assets/forms/asset.py index f8cab4abb..18f74857a 100644 --- a/apps/assets/forms/asset.py +++ b/apps/assets/forms/asset.py @@ -3,7 +3,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from ..models import Asset +from ..models import Asset, AdminUser from common.utils import get_logger logger = get_logger(__file__) @@ -85,16 +85,23 @@ class AssetBulkUpdateForm(forms.ModelForm): port = forms.IntegerField( label=_('Port'), required=False, min_value=1, max_value=65535, ) + admin_user = forms.ModelChoiceField( + required=False, queryset=AdminUser.objects.all(), + label=_("Admin user"), + widget=forms.Select( + attrs={ + 'class': 'select2', + 'data-placeholder': _('Admin user') + } + ) + ) class Meta: model = Asset fields = [ - 'assets', 'port', 'admin_user', 'nodes', + 'assets', 'port', 'admin_user', 'labels', 'nodes', ] widgets = { - 'admin_user': forms.SelectMultiple( - attrs={'class': 'select2', 'data-placeholder': _('Admin user')} - ), 'labels': forms.SelectMultiple( attrs={'class': 'select2', 'data-placeholder': _('Labels')} ), @@ -106,17 +113,21 @@ class AssetBulkUpdateForm(forms.ModelForm): def save(self, commit=True): changed_fields = [] for field in self._meta.fields: - if self.data.get(field) is not None: + if self.data.get(field) not in [None, '']: changed_fields.append(field) cleaned_data = {k: v for k, v in self.cleaned_data.items() if k in changed_fields} assets = cleaned_data.pop('assets') labels = cleaned_data.pop('labels', []) + nodes = cleaned_data.pop('nodes') assets = Asset.objects.filter(id__in=[asset.id for asset in assets]) assets.update(**cleaned_data) if labels: - for asset in assets: - asset.labels.set(labels) + for label in labels: + label.assets.add(*tuple(assets)) + if nodes: + for node in nodes: + node.assets.add(*tuple(assets)) return assets diff --git a/apps/assets/models/node.py b/apps/assets/models/node.py index 9fb164250..a502694c9 100644 --- a/apps/assets/models/node.py +++ b/apps/assets/models/node.py @@ -63,10 +63,16 @@ class Node(models.Model): def get_all_assets(self): from .asset import Asset - nodes = self.get_family() - assets = Asset.objects.filter(nodes__in=nodes) + if self.is_root(): + assets = Asset.objects.all() + else: + nodes = self.get_family() + assets = Asset.objects.filter(nodes__in=nodes) return assets + def is_root(self): + return self.key == '0' + @property def parent(self): if self.key == "0": diff --git a/apps/assets/serializers/node.py b/apps/assets/serializers/node.py index 09bd17ff2..6e69008bb 100644 --- a/apps/assets/serializers/node.py +++ b/apps/assets/serializers/node.py @@ -38,16 +38,21 @@ class NodeGrantedSerializer(BulkSerializerMixin, serializers.ModelSerializer): class NodeSerializer(serializers.ModelSerializer): parent = serializers.SerializerMethodField() + assets_amount = serializers.SerializerMethodField() class Meta: model = Node - fields = ['id', 'key', 'value', 'parent'] + fields = ['id', 'key', 'value', 'parent', 'assets_amount'] list_serializer_class = BulkListSerializer @staticmethod def get_parent(obj): return obj.parent.id + @staticmethod + def get_assets_amount(obj): + return obj.get_all_assets().count() + def get_fields(self): fields = super().get_fields() field = fields["key"] diff --git a/apps/assets/templates/assets/admin_user_list.html b/apps/assets/templates/assets/admin_user_list.html index bb9286150..7cccc6d03 100644 --- a/apps/assets/templates/assets/admin_user_list.html +++ b/apps/assets/templates/assets/admin_user_list.html @@ -74,7 +74,8 @@ $(document).ready(function(){ if (val === 100) { innerHtml = "" + val + "% "; } else { - innerHtml = "" + val + "% "; + var num = new Number(val); + innerHtml = "" + num.toFixed(1) + "% "; } $(td).html('' + innerHtml + ''); diff --git a/apps/assets/templates/assets/asset_list.html b/apps/assets/templates/assets/asset_list.html index 7c4c9fd8e..493a7e64b 100644 --- a/apps/assets/templates/assets/asset_list.html +++ b/apps/assets/templates/assets/asset_list.html @@ -329,7 +329,7 @@ function initTree() { {#if (value["key"] === "0") {#} value["open"] = true; {# }#} - value["name"] = value["value"] + value["name"] = value["value"] + ' (' + value['assets_amount'] + ')' }); zNodes = data; $.fn.zTree.init($("#assetTree"), setting, zNodes); diff --git a/apps/assets/templates/assets/system_user_list.html b/apps/assets/templates/assets/system_user_list.html index ea4765132..b1dd401bc 100644 --- a/apps/assets/templates/assets/system_user_list.html +++ b/apps/assets/templates/assets/system_user_list.html @@ -75,7 +75,8 @@ function initTable() { if (val === 100) { innerHtml = "" + val + "% "; } else { - innerHtml = "" + val + "% "; + var num = new Number(val); + innerHtml = "" + num.toFixed(1) + "% "; } $(td).html('' + innerHtml + ''); diff --git a/apps/assets/views/asset.py b/apps/assets/views/asset.py index 12e6f56ce..900adefc3 100644 --- a/apps/assets/views/asset.py +++ b/apps/assets/views/asset.py @@ -43,6 +43,7 @@ class AssetListView(AdminUserRequiredMixin, TemplateView): template_name = 'assets/asset_list.html' def get_context_data(self, **kwargs): + Node.root() context = { 'app': _('Assets'), 'action': _('Asset list'), diff --git a/apps/perms/templates/perms/asset_permission_list.html b/apps/perms/templates/perms/asset_permission_list.html index 4d9cdb7c4..9226e8938 100644 --- a/apps/perms/templates/perms/asset_permission_list.html +++ b/apps/perms/templates/perms/asset_permission_list.html @@ -181,7 +181,7 @@ function initTree() { {#if (value["key"] === "0") {#} value["open"] = true; {# }#} - value["name"] = value["value"] + value["name"] = value["value"] + ' (' + value['assets_amount'] + ')' }); zNodes = data; $.fn.zTree.init($("#assetTree"), setting, zNodes); diff --git a/apps/templates/_message.html b/apps/templates/_message.html index 046f48ae6..54754536a 100644 --- a/apps/templates/_message.html +++ b/apps/templates/_message.html @@ -1,7 +1,7 @@ {% load i18n %} {% block first_login_message %} {% if request.user.is_authenticated and request.user.is_first_login %} -
+
{% url 'users:user-first-login' as first_login_url %} {% blocktrans %} Your information was incomplete. Please click this link to complete your information. @@ -10,8 +10,9 @@ {% endif %} {% endblock %} {% block update_public_key_message %} - {% if request.user.is_authenticated and not request.user.is_public_key_valid %} -
+ {% if request.user.is_authenticated and not request.user.is_public_key_valid and not request.COOKIE.close_public_key_msg != '1' %} +
+ {% url 'users:user-pubkey-update' as user_pubkey_update %} {% blocktrans %} Your ssh public key not set or expired. Please click this link to update @@ -27,3 +28,9 @@
{% endfor %} {% endif %} + + \ No newline at end of file diff --git a/apps/terminal/api.py b/apps/terminal/api.py index cb45ef847..9ce188af1 100644 --- a/apps/terminal/api.py +++ b/apps/terminal/api.py @@ -174,7 +174,7 @@ class SessionViewSet(viewsets.ModelViewSet): terminal_id = self.kwargs.get("terminal", None) if terminal_id: terminal = get_object_or_404(Terminal, id=terminal_id) - self.queryset = terminal.status_set.all() + self.queryset = terminal.session_set.all() return self.queryset diff --git a/apps/terminal/urls/api_urls.py b/apps/terminal/urls/api_urls.py index a3ebc2129..9138012b4 100644 --- a/apps/terminal/urls/api_urls.py +++ b/apps/terminal/urls/api_urls.py @@ -15,6 +15,8 @@ router.register(r'v1/terminal/(?P[a-zA-Z0-9\-]{36})?/?sessions', api.S router.register(r'v1/tasks', api.TaskViewSet, 'tasks') router.register(r'v1/terminal', api.TerminalViewSet, 'terminal') router.register(r'v1/command', api.CommandViewSet, 'command') +router.register(r'v1/sessions', api.SessionViewSet, 'session') +router.register(r'v1/status', api.StatusViewSet, 'session') urlpatterns = [ url(r'^v1/sessions/(?P[0-9a-zA-Z\-]{36})/replay/$',