mirror of https://github.com/jumpserver/jumpserver
[Update]一些修改
parent
f0dd7d54c8
commit
f1c386714d
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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":
|
||||
|
|
|
@ -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"]
|
||||
|
|
|
@ -74,7 +74,8 @@ $(document).ready(function(){
|
|||
if (val === 100) {
|
||||
innerHtml = "<span class='text-navy'>" + val + "% </span>";
|
||||
} else {
|
||||
innerHtml = "<span class='text-danger'>" + val + "% </span>";
|
||||
var num = new Number(val);
|
||||
innerHtml = "<span class='text-danger'>" + num.toFixed(1) + "% </span>";
|
||||
}
|
||||
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -75,7 +75,8 @@ function initTable() {
|
|||
if (val === 100) {
|
||||
innerHtml = "<span class='text-navy'>" + val + "% </span>";
|
||||
} else {
|
||||
innerHtml = "<span class='text-danger'>" + val + "% </span>";
|
||||
var num = new Number(val);
|
||||
innerHtml = "<span class='text-danger'>" + num.toFixed(1) + "% </span>";
|
||||
}
|
||||
$(td).html('<span href="javascript:void(0);" data-toggle="tooltip" title="' + cellData + '">' + innerHtml + '</span>');
|
||||
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{% load i18n %}
|
||||
{% block first_login_message %}
|
||||
{% if request.user.is_authenticated and request.user.is_first_login %}
|
||||
<div class="alert alert-danger help-message">
|
||||
<div class="alert alert-danger help-message alert-dismissable">
|
||||
{% url 'users:user-first-login' as first_login_url %}
|
||||
{% blocktrans %}
|
||||
Your information was incomplete. Please click <a href="{{ first_login_url }}"> this link </a>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 %}
|
||||
<div class="alert alert-danger help-message">
|
||||
{% if request.user.is_authenticated and not request.user.is_public_key_valid and not request.COOKIE.close_public_key_msg != '1' %}
|
||||
<div class="alert alert-danger help-message alert-dismissable">
|
||||
<button aria-hidden="true" data-dismiss="alert" class="close" type="button" onclick="closePublicKeyMsg()">×</button>
|
||||
{% url 'users:user-pubkey-update' as user_pubkey_update %}
|
||||
{% blocktrans %}
|
||||
Your ssh public key not set or expired. Please click <a href="{{ user_pubkey_update }}"> this link </a>to update
|
||||
|
@ -27,3 +28,9 @@
|
|||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
<script>
|
||||
function closePublicKeyMsg() {
|
||||
setCookie('close_public_key_msg', 1)
|
||||
}
|
||||
</script>
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -15,6 +15,8 @@ router.register(r'v1/terminal/(?P<terminal>[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<pk>[0-9a-zA-Z\-]{36})/replay/$',
|
||||
|
|
Loading…
Reference in New Issue