mirror of https://github.com/jumpserver/jumpserver
				
				
				
			[Update] 修改授权规则详情列表页面
							parent
							
								
									7fc2ef00ee
								
							
						
					
					
						commit
						8b3b517bab
					
				| 
						 | 
				
			
			@ -2,4 +2,4 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
# 
 | 
			
		||||
 | 
			
		||||
__version__ = "1.0.0"
 | 
			
		||||
__version__ = "1.3.0"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -84,7 +84,7 @@ class Asset(models.Model):
 | 
			
		|||
    comment = models.TextField(max_length=128, default='', blank=True, verbose_name=_('Comment'))
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.hostname
 | 
			
		||||
        return '{0.hostname}({0.ip})'.format(self)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def is_valid(self):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,7 +109,7 @@ class SystemUser(AssetUser):
 | 
			
		|||
    shell = models.CharField(max_length=64,  default='/bin/bash', verbose_name=_('Shell'))
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.name
 | 
			
		||||
        return '{0.name}({0.username})'.format(self)
 | 
			
		||||
 | 
			
		||||
    def to_json(self):
 | 
			
		||||
        return {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -3,7 +3,7 @@
 | 
			
		|||
 | 
			
		||||
from django.shortcuts import get_object_or_404
 | 
			
		||||
from rest_framework.views import APIView, Response
 | 
			
		||||
from rest_framework.generics import ListAPIView, get_object_or_404
 | 
			
		||||
from rest_framework.generics import ListAPIView, get_object_or_404, RetrieveUpdateAPIView
 | 
			
		||||
from rest_framework import viewsets
 | 
			
		||||
 | 
			
		||||
from common.utils import set_or_append_attr_bulk
 | 
			
		||||
| 
						 | 
				
			
			@ -246,3 +246,77 @@ class ValidateUserAssetPermissionView(APIView):
 | 
			
		|||
            return Response({'msg': True}, status=200)
 | 
			
		||||
        else:
 | 
			
		||||
            return Response({'msg': False}, status=403)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AssetPermissionRemoveUserApi(RetrieveUpdateAPIView):
 | 
			
		||||
    """
 | 
			
		||||
    将用户从授权中移除,Detail页面会调用
 | 
			
		||||
    """
 | 
			
		||||
    permission_classes = (IsSuperUser,)
 | 
			
		||||
    serializer_class = serializers.AssetPermissionUpdateUserSerializer
 | 
			
		||||
    queryset = AssetPermission.objects.all()
 | 
			
		||||
 | 
			
		||||
    def update(self, request, *args, **kwargs):
 | 
			
		||||
        perm = self.get_object()
 | 
			
		||||
        serializer = self.serializer_class(data=request.data)
 | 
			
		||||
        if serializer.is_valid():
 | 
			
		||||
            users = serializer.validated_data.get('users')
 | 
			
		||||
            if users:
 | 
			
		||||
                perm.users.remove(*tuple(users))
 | 
			
		||||
            return Response({"msg": "ok"})
 | 
			
		||||
        else:
 | 
			
		||||
            return Response({"error": serializer.errors})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AssetPermissionAddUserApi(RetrieveUpdateAPIView):
 | 
			
		||||
    permission_classes = (IsSuperUser,)
 | 
			
		||||
    serializer_class = serializers.AssetPermissionUpdateUserSerializer
 | 
			
		||||
    queryset = AssetPermission.objects.all()
 | 
			
		||||
 | 
			
		||||
    def update(self, request, *args, **kwargs):
 | 
			
		||||
        perm = self.get_object()
 | 
			
		||||
        serializer = self.serializer_class(data=request.data)
 | 
			
		||||
        if serializer.is_valid():
 | 
			
		||||
            users = serializer.validated_data.get('users')
 | 
			
		||||
            if users:
 | 
			
		||||
                perm.users.add(*tuple(users))
 | 
			
		||||
            return Response({"msg": "ok"})
 | 
			
		||||
        else:
 | 
			
		||||
            return Response({"error": serializer.errors})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AssetPermissionRemoveAssetApi(RetrieveUpdateAPIView):
 | 
			
		||||
    """
 | 
			
		||||
    将用户从授权中移除,Detail页面会调用
 | 
			
		||||
    """
 | 
			
		||||
    permission_classes = (IsSuperUser,)
 | 
			
		||||
    serializer_class = serializers.AssetPermissionUpdateAssetSerializer
 | 
			
		||||
    queryset = AssetPermission.objects.all()
 | 
			
		||||
 | 
			
		||||
    def update(self, request, *args, **kwargs):
 | 
			
		||||
        perm = self.get_object()
 | 
			
		||||
        serializer = self.serializer_class(data=request.data)
 | 
			
		||||
        if serializer.is_valid():
 | 
			
		||||
            assets = serializer.validated_data.get('assets')
 | 
			
		||||
            if assets:
 | 
			
		||||
                perm.assets.remove(*tuple(assets))
 | 
			
		||||
            return Response({"msg": "ok"})
 | 
			
		||||
        else:
 | 
			
		||||
            return Response({"error": serializer.errors})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AssetPermissionAddAssetApi(RetrieveUpdateAPIView):
 | 
			
		||||
    permission_classes = (IsSuperUser,)
 | 
			
		||||
    serializer_class = serializers.AssetPermissionUpdateAssetSerializer
 | 
			
		||||
    queryset = AssetPermission.objects.all()
 | 
			
		||||
 | 
			
		||||
    def update(self, request, *args, **kwargs):
 | 
			
		||||
        perm = self.get_object()
 | 
			
		||||
        serializer = self.serializer_class(data=request.data)
 | 
			
		||||
        if serializer.is_valid():
 | 
			
		||||
            assets = serializer.validated_data.get('assets')
 | 
			
		||||
            if assets:
 | 
			
		||||
                perm.assets.add(*tuple(assets))
 | 
			
		||||
            return Response({"msg": "ok"})
 | 
			
		||||
        else:
 | 
			
		||||
            return Response({"error": serializer.errors})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,10 +4,23 @@ from __future__ import absolute_import, unicode_literals
 | 
			
		|||
from django import forms
 | 
			
		||||
from django.utils.translation import ugettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from .hands import User
 | 
			
		||||
from .models import AssetPermission
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AssetPermissionForm(forms.ModelForm):
 | 
			
		||||
    users = forms.ModelMultipleChoiceField(
 | 
			
		||||
        queryset=User.objects.exclude(role=User.ROLE_APP),
 | 
			
		||||
        label=_("User"),
 | 
			
		||||
        widget=forms.SelectMultiple(
 | 
			
		||||
            attrs={
 | 
			
		||||
                'class': 'select2',
 | 
			
		||||
                'data-placeholder': _('Select users')
 | 
			
		||||
            }
 | 
			
		||||
        ),
 | 
			
		||||
        required=False,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = AssetPermission
 | 
			
		||||
        exclude = (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,7 +4,7 @@ from django.db import models
 | 
			
		|||
from django.utils.translation import ugettext_lazy as _
 | 
			
		||||
from django.utils import timezone
 | 
			
		||||
 | 
			
		||||
from common.utils import date_expired_default
 | 
			
		||||
from common.utils import date_expired_default, set_or_append_attr_bulk
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ValidManager(models.Manager):
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +45,22 @@ class AssetPermission(models.Model):
 | 
			
		|||
            return True
 | 
			
		||||
        return False
 | 
			
		||||
 | 
			
		||||
    def get_all_users(self):
 | 
			
		||||
        users = set(self.users.all())
 | 
			
		||||
        for group in self.user_groups.all():
 | 
			
		||||
            _users = group.users.all()
 | 
			
		||||
            set_or_append_attr_bulk(_users, 'inherit', group.name)
 | 
			
		||||
            users.update(set(_users))
 | 
			
		||||
        return users
 | 
			
		||||
 | 
			
		||||
    def get_all_assets(self):
 | 
			
		||||
        assets = set(self.assets.all())
 | 
			
		||||
        for node in self.nodes.all():
 | 
			
		||||
            _assets = node.get_all_assets()
 | 
			
		||||
            set_or_append_attr_bulk(_assets, 'inherit', node.value)
 | 
			
		||||
            assets.update(set(_assets))
 | 
			
		||||
        return assets
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NodePermission(models.Model):
 | 
			
		||||
    id = models.UUIDField(default=uuid.uuid4, primary_key=True)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,12 +57,12 @@
 | 
			
		|||
                                            </tr>
 | 
			
		||||
                                        </thead>
 | 
			
		||||
                                        <tbody>
 | 
			
		||||
                                            {% for asset in page_obj %}
 | 
			
		||||
                                            {% for asset in object_list %}
 | 
			
		||||
                                            <tr>
 | 
			
		||||
                                                <td>{{ asset.hostname }}</td>
 | 
			
		||||
                                                <td>{{ asset.ip }}</td>
 | 
			
		||||
                                                <td>
 | 
			
		||||
                                                    <button title="{{ asset.inherit_from_asset_groups }}" data-gid="{{ asset.id }}" class="btn btn-danger btn-xs btn-remove-asset {% if asset.is_inherit_from_asset_groups %} disabled {% endif %}" type="button" style="float: right;"><i class="fa fa-minus"></i></button>
 | 
			
		||||
                                                    <button title="{{ asset.inherit }}" data-gid="{{ asset.id }}" class="btn btn-danger btn-xs btn-remove-asset {% if asset.inherit %} disabled {% endif %}" type="button" style="float: right;"><i class="fa fa-minus"></i></button>
 | 
			
		||||
                                                </td>
 | 
			
		||||
                                            </tr>
 | 
			
		||||
                                            {% endfor %}
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@
 | 
			
		|||
 | 
			
		||||
                            <div class="panel panel-info">
 | 
			
		||||
                                <div class="panel-heading">
 | 
			
		||||
                                    <i class="fa fa-info-circle"></i> {% trans 'Add asset group to this permission' %}
 | 
			
		||||
                                    <i class="fa fa-info-circle"></i> {% trans 'Add node to this permission' %}
 | 
			
		||||
                                </div>
 | 
			
		||||
                                <div class="panel-body">
 | 
			
		||||
                                    <table class="table group_edit">
 | 
			
		||||
| 
						 | 
				
			
			@ -113,25 +113,25 @@
 | 
			
		|||
                                        <form>
 | 
			
		||||
                                            <tr>
 | 
			
		||||
                                                <td colspan="2" class="no-borders">
 | 
			
		||||
                                                    <select data-placeholder="{% trans 'Select asset groups' %}" class="select2 group" style="width: 100%" multiple="" tabindex="4">
 | 
			
		||||
                                                        {% for asset_group in asset_groups_remain %}
 | 
			
		||||
                                                        <option value="{{ asset_group.id }}" id="opt_{{ asset_group.id }}">{{ asset_group.name }}</option>
 | 
			
		||||
                                                    <select data-placeholder="{% trans 'Select nodes' %}" class="select2 group" style="width: 100%" multiple="" tabindex="4">
 | 
			
		||||
                                                        {% for node in nodes_remain %}
 | 
			
		||||
                                                        <option value="{{ node.id }}" id="opt_{{ node.id }}">{{ node.value }}</option>
 | 
			
		||||
                                                        {% endfor %}
 | 
			
		||||
                                                    </select>
 | 
			
		||||
                                                </td>
 | 
			
		||||
                                            </tr>
 | 
			
		||||
                                            <tr>
 | 
			
		||||
                                                <td colspan="2" class="no-borders">
 | 
			
		||||
                                                    <button type="button" class="btn btn-info btn-sm" id="btn-add-group">{% trans 'Join' %}</button>
 | 
			
		||||
                                                    <button type="button" class="btn btn-info btn-sm" id="btn-add-node">{% trans 'Join' %}</button>
 | 
			
		||||
                                                </td>
 | 
			
		||||
                                            </tr>
 | 
			
		||||
                                        </form>
 | 
			
		||||
 | 
			
		||||
                                        {% for asset_group in asset_groups %}
 | 
			
		||||
                                        {% for node in asset_permission.nodes.all %}
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                          <td ><b class="bdg_user_group" data-gid={{ asset_group.id }}>{{ asset_group.name }}</b></td>
 | 
			
		||||
                                          <td ><b class="bdg_user_group" data-gid={{ node.id }}>{{ node.value }}</b></td>
 | 
			
		||||
                                          <td>
 | 
			
		||||
                                              <button class="btn btn-danger btn-xs btn-remove-group" type="button" style="float: right;"><i class="fa fa-minus"></i></button>
 | 
			
		||||
                                              <button class="btn btn-danger btn-xs btn-remove-node" type="button" style="float: right;"><i class="fa fa-minus"></i></button>
 | 
			
		||||
                                          </td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        {% endfor %}
 | 
			
		||||
| 
						 | 
				
			
			@ -179,10 +179,10 @@ function removeAssets(assets) {
 | 
			
		|||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function updateGroup(groups) {
 | 
			
		||||
function updateNodes(nodes) {
 | 
			
		||||
    var the_url = "{% url 'api-perms:asset-permission-detail' pk=asset_permission.id %}";
 | 
			
		||||
    var body = {
 | 
			
		||||
        asset_groups: groups
 | 
			
		||||
        nodes: nodes
 | 
			
		||||
    };
 | 
			
		||||
    APIUpdateAttr({
 | 
			
		||||
        url: the_url,
 | 
			
		||||
| 
						 | 
				
			
			@ -231,17 +231,17 @@ $(document).ready(function () {
 | 
			
		|||
    var assets = [asset_id];
 | 
			
		||||
    removeAssets(assets)
 | 
			
		||||
})
 | 
			
		||||
.on('click', '#btn-add-group', function () {
 | 
			
		||||
.on('click', '#btn-add-node', function () {
 | 
			
		||||
    if (Object.keys(jumpserver.nodes_selected).length === 0) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    var groups = $('.bdg_group').map(function() {
 | 
			
		||||
    var nodes = $('.bdg_group').map(function() {
 | 
			
		||||
        return $(this).data('gid');
 | 
			
		||||
    }).get();
 | 
			
		||||
 | 
			
		||||
    $.map(jumpserver.nodes_selected, function(group_name, index) {
 | 
			
		||||
        groups.push(index);
 | 
			
		||||
        nodes.push(index);
 | 
			
		||||
        $('#opt_' + index).remove();
 | 
			
		||||
        $('.group_edit tbody').append(
 | 
			
		||||
           '<tr>' +
 | 
			
		||||
| 
						 | 
				
			
			@ -251,17 +251,17 @@ $(document).ready(function () {
 | 
			
		|||
        )
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    updateGroup(groups);
 | 
			
		||||
    updateNodes(nodes);
 | 
			
		||||
})
 | 
			
		||||
.on('click', '.btn-remove-group', function () {
 | 
			
		||||
.on('click', '.btn-remove-node', function () {
 | 
			
		||||
    var $this = $(this);
 | 
			
		||||
    var $tr = $this.closest('tr');
 | 
			
		||||
    var groups = $('.bdg_group').map(function() {
 | 
			
		||||
    var nodes = $('.bdg_group').map(function() {
 | 
			
		||||
        if ($(this).data('gid') !== $this.data('gid')){
 | 
			
		||||
            return $(this).data('gid');
 | 
			
		||||
        }
 | 
			
		||||
    }).get();
 | 
			
		||||
    updateGroup(groups);
 | 
			
		||||
    updateNodes(nodes);
 | 
			
		||||
    $tr.remove()
 | 
			
		||||
})
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,19 +15,19 @@
 | 
			
		|||
                    <div class="panel-options">
 | 
			
		||||
                        <ul class="nav nav-tabs">
 | 
			
		||||
                            <li class="active">
 | 
			
		||||
                                <a href="{% url 'perms:asset-permission-detail' pk=asset_permission.id %}" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Detail' %} </a>
 | 
			
		||||
                                <a href="{% url 'perms:asset-permission-detail' pk=object.id %}" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Detail' %} </a>
 | 
			
		||||
                            </li>
 | 
			
		||||
                            <li>
 | 
			
		||||
                                <a href="{% url 'perms:asset-permission-user-list' pk=asset_permission.id %}" class="text-center">
 | 
			
		||||
                                <a href="{% url 'perms:asset-permission-user-list' pk=object.id %}" class="text-center">
 | 
			
		||||
                                <i class="fa fa-bar-chart-o"></i> {% trans 'Users and user groups' %}
 | 
			
		||||
                                </a>
 | 
			
		||||
                            </li>
 | 
			
		||||
                            <li>
 | 
			
		||||
                                <a href="{% url 'perms:asset-permission-asset-list' pk=asset_permission.id  %}" class="text-center">
 | 
			
		||||
                                <a href="{% url 'perms:asset-permission-asset-list' pk=object.id %}" class="text-center">
 | 
			
		||||
                                <i class="fa fa-bar-chart-o"></i> {% trans 'Assets and asset groups' %}</a>
 | 
			
		||||
                            </li>
 | 
			
		||||
                            <li class="pull-right">
 | 
			
		||||
                                <a class="btn btn-outline btn-default" href="{% url 'perms:asset-permission-update' pk=asset_permission.id %}"><i class="fa fa-edit"></i>{% trans 'Update' %}</a>
 | 
			
		||||
                                <a class="btn btn-outline btn-default" href="{% url 'perms:asset-permission-update' pk=object.id %}"><i class="fa fa-edit"></i>{% trans 'Update' %}</a>
 | 
			
		||||
                            </li>
 | 
			
		||||
                            <li class="pull-right">
 | 
			
		||||
                                <a class="btn btn-outline btn-danger btn-delete-perm">
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +40,7 @@
 | 
			
		|||
                        <div class="col-sm-7" style="padding-left: 0;">
 | 
			
		||||
                            <div class="ibox float-e-margins">
 | 
			
		||||
                                <div class="ibox-title">
 | 
			
		||||
                                    <span class="label"><b>{{ asset_permission.name }}</b></span>
 | 
			
		||||
                                    <span class="label"><b>{{ object.name }}</b></span>
 | 
			
		||||
                                    <div class="ibox-tools">
 | 
			
		||||
                                        <a class="collapse-link">
 | 
			
		||||
                                            <i class="fa fa-chevron-up"></i>
 | 
			
		||||
| 
						 | 
				
			
			@ -60,43 +60,47 @@
 | 
			
		|||
                                        <tbody>
 | 
			
		||||
                                        <tr class="no-borders-tr">
 | 
			
		||||
                                            <td>{% trans 'Name' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.name }}</b></td>
 | 
			
		||||
                                            <td><b>{{ object.name }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'User count' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.users.count }}</b></td>
 | 
			
		||||
                                            <td><b>{{ object.users.count }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'User group count' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.users.count }}</b></td>
 | 
			
		||||
                                            <td><b>{{ object.users.count }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'Asset count' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.assets.count }}</b></td>
 | 
			
		||||
                                            <td><b>{{ object.assets.count }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'Asset group count' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.asset_groups.count }}</b></td>
 | 
			
		||||
                                            <td>{% trans 'Node count' %}:</td>
 | 
			
		||||
                                            <td><b>{{ object.nodes.count }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'System user count' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.system_users.count }}</b></td>
 | 
			
		||||
                                            <td><b>{{ object.system_users.count }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'Date start' %}:</td>
 | 
			
		||||
                                            <td><b>{{ object.date_start }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'Date expired' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.date_expired }}</b></td>
 | 
			
		||||
                                            <td><b>{{ object.date_expired }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'Date created' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.date_created }}</b></td>
 | 
			
		||||
                                            <td><b>{{ object.date_created }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'Created by' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.created_by  }}</b></td>
 | 
			
		||||
                                            <td><b>{{ object.created_by  }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                            <td>{% trans 'Comment' %}:</td>
 | 
			
		||||
                                            <td><b>{{ asset_permission.comment }}</b></td>
 | 
			
		||||
                                            <td><b>{{ object.comment }}</b></td>
 | 
			
		||||
                                        </tr>
 | 
			
		||||
                                        </tbody>
 | 
			
		||||
                                    </table>
 | 
			
		||||
| 
						 | 
				
			
			@ -117,7 +121,7 @@
 | 
			
		|||
                                            <td><span style="float: right">
 | 
			
		||||
                                                <div class="switch">
 | 
			
		||||
                                                    <div class="onoffswitch">
 | 
			
		||||
                                                        <input type="checkbox" {% if asset_permission.is_active %} checked {% endif %} class="onoffswitch-checkbox" id="is_active">
 | 
			
		||||
                                                        <input type="checkbox" {% if object.is_active %} checked {% endif %} class="onoffswitch-checkbox" id="is_active">
 | 
			
		||||
                                                        <label class="onoffswitch-label" for="is_active">
 | 
			
		||||
                                                            <span class="onoffswitch-inner"></span>
 | 
			
		||||
                                                            <span class="onoffswitch-switch"></span>
 | 
			
		||||
| 
						 | 
				
			
			@ -155,7 +159,7 @@
 | 
			
		|||
                                            </tr>
 | 
			
		||||
                                        </form>
 | 
			
		||||
 | 
			
		||||
                                        {% for system_user in system_users %}
 | 
			
		||||
                                        {% for system_user in object.system_users.all %}
 | 
			
		||||
                                        <tr {% if forloop.counter == 1 %} class="no-borders-tr" {% endif %} >
 | 
			
		||||
                                          <td ><b class="bdg-system-user" data-uid={{ system_user.id }}>{{ system_user.name }}</b></td>
 | 
			
		||||
                                          <td>
 | 
			
		||||
| 
						 | 
				
			
			@ -179,7 +183,7 @@
 | 
			
		|||
jumpserver.system_users_selected = {};
 | 
			
		||||
 | 
			
		||||
function updateSystemUser(system_users) {
 | 
			
		||||
    var the_url = "{% url 'api-perms:asset-permission-detail' pk=asset_permission.id %}";
 | 
			
		||||
    var the_url = "{% url 'api-perms:asset-permission-detail' pk=object.id %}";
 | 
			
		||||
    var body = {
 | 
			
		||||
        system_users: Object.assign([], system_users)
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			@ -203,7 +207,7 @@ $(document).ready(function () {
 | 
			
		|||
.on('click', '.btn-delete-perm', function () {
 | 
			
		||||
    var $this = $(this);
 | 
			
		||||
    var name = "{{ asset_permission.name }}";
 | 
			
		||||
    var uid = "{{ asset_permission.id }}";
 | 
			
		||||
    var uid = "{{ object.id }}";
 | 
			
		||||
    var the_url = '{% url "api-perms:asset-permission-detail" pk=DEFAULT_PK %}'.replace('{{ DEFAULT_PK }}', uid);
 | 
			
		||||
    var redirect_url = "{% url 'perms:asset-permission-list' %}";
 | 
			
		||||
    objectDelete($this, name, the_url, redirect_url);
 | 
			
		||||
| 
						 | 
				
			
			@ -238,7 +242,7 @@ $(document).ready(function () {
 | 
			
		|||
    updateSystemUser(system_users);
 | 
			
		||||
    $tr.remove()
 | 
			
		||||
}).on('click', '#is_active', function () {
 | 
			
		||||
    var the_url = '{% url "api-perms:asset-permission-detail" pk=asset_permission.id %}';
 | 
			
		||||
    var the_url = '{% url "api-perms:asset-permission-detail" pk=object.id %}';
 | 
			
		||||
    var checked = $(this).prop('checked');
 | 
			
		||||
    var body = {
 | 
			
		||||
        'is_active': checked
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,12 +57,12 @@
 | 
			
		|||
                                            </tr>
 | 
			
		||||
                                        </thead>
 | 
			
		||||
                                        <tbody>
 | 
			
		||||
                                            {% for user in page_obj %}
 | 
			
		||||
                                            {% for user in object_list %}
 | 
			
		||||
                                            <tr>
 | 
			
		||||
                                                <td>{{ user.name }}</td>
 | 
			
		||||
                                                <td>{{ user.username }}</td>
 | 
			
		||||
                                                <td>
 | 
			
		||||
                                                    <button class="btn btn-danger btn-xs btn-remove-user {% if user.is_inherit_from_user_groups %} disabled {% endif %}" data-gid="{{ user.id }}" type="button" style="float: right;"><i class="fa fa-minus"></i></button>
 | 
			
		||||
                                                    <button class="btn btn-danger btn-xs btn-remove-user {% if user.inherit %} disabled {% endif %}" data-gid="{{ user.id }}" type="button" style="float: right;"><i class="fa fa-minus"></i></button>
 | 
			
		||||
                                                </td>
 | 
			
		||||
                                            </tr>
 | 
			
		||||
                                            {% endfor %}
 | 
			
		||||
| 
						 | 
				
			
			@ -127,7 +127,7 @@
 | 
			
		|||
                                            </tr>
 | 
			
		||||
                                        </form>
 | 
			
		||||
 | 
			
		||||
                                        {% for user_group in user_groups %}
 | 
			
		||||
                                        {% for user_group in asset_permission.user_groups.all %}
 | 
			
		||||
                                        <tr>
 | 
			
		||||
                                          <td ><b class="bdg_group" data-gid={{ user_group.id }}>{{ user_group.name }}</b></td>
 | 
			
		||||
                                          <td>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,20 +11,50 @@ router.register('v1/asset-permissions', api.AssetPermissionViewSet, 'asset-permi
 | 
			
		|||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
    # 查询某个用户授权的资产和资产组
 | 
			
		||||
    url(r'^v1/user/(?P<pk>[0-9a-zA-Z\-]{36})/assets/$', api.UserGrantedAssetsApi.as_view(), name='user-assets'),
 | 
			
		||||
    url(r'^v1/user/assets/$', api.UserGrantedAssetsApi.as_view(), name='my-assets'),
 | 
			
		||||
    url(r'^v1/user/(?P<pk>[0-9a-zA-Z\-]{36})/nodes/$', api.UserGrantedNodesApi.as_view(), name='user-nodes'),
 | 
			
		||||
    url(r'^v1/user/nodes/$', api.UserGrantedNodesApi.as_view(), name='my-nodes'),
 | 
			
		||||
    url(r'^v1/user/(?P<pk>[0-9a-zA-Z\-]{36})/nodes/(?P<node_id>[0-9a-zA-Z\-]{36})/assets/$', api.UserGrantedNodeAssetsApi.as_view(), name='user-node-assets'),
 | 
			
		||||
    url(r'^v1/user/nodes/(?P<node_id>[0-9a-zA-Z\-]{36})/assets/$', api.UserGrantedNodeAssetsApi.as_view(), name='my-node-assets'),
 | 
			
		||||
    url(r'^v1/user/(?P<pk>[0-9a-zA-Z\-]{36})/nodes-assets/$', api.UserGrantedNodesWithAssetsApi.as_view(), name='user-nodes-assets'),
 | 
			
		||||
    url(r'^v1/user/nodes-assets/$', api.UserGrantedNodesWithAssetsApi.as_view(), name='my-nodes-assets'),
 | 
			
		||||
    url(r'^v1/user/(?P<pk>[0-9a-zA-Z\-]{36})/assets/$',
 | 
			
		||||
        api.UserGrantedAssetsApi.as_view(), name='user-assets'),
 | 
			
		||||
    url(r'^v1/user/assets/$', api.UserGrantedAssetsApi.as_view(),
 | 
			
		||||
        name='my-assets'),
 | 
			
		||||
    url(r'^v1/user/(?P<pk>[0-9a-zA-Z\-]{36})/nodes/$',
 | 
			
		||||
        api.UserGrantedNodesApi.as_view(), name='user-nodes'),
 | 
			
		||||
    url(r'^v1/user/nodes/$', api.UserGrantedNodesApi.as_view(),
 | 
			
		||||
        name='my-nodes'),
 | 
			
		||||
    url(
 | 
			
		||||
        r'^v1/user/(?P<pk>[0-9a-zA-Z\-]{36})/nodes/(?P<node_id>[0-9a-zA-Z\-]{36})/assets/$',
 | 
			
		||||
        api.UserGrantedNodeAssetsApi.as_view(), name='user-node-assets'),
 | 
			
		||||
    url(r'^v1/user/nodes/(?P<node_id>[0-9a-zA-Z\-]{36})/assets/$',
 | 
			
		||||
        api.UserGrantedNodeAssetsApi.as_view(), name='my-node-assets'),
 | 
			
		||||
    url(r'^v1/user/(?P<pk>[0-9a-zA-Z\-]{36})/nodes-assets/$',
 | 
			
		||||
        api.UserGrantedNodesWithAssetsApi.as_view(), name='user-nodes-assets'),
 | 
			
		||||
    url(r'^v1/user/nodes-assets/$', api.UserGrantedNodesWithAssetsApi.as_view(),
 | 
			
		||||
        name='my-nodes-assets'),
 | 
			
		||||
 | 
			
		||||
    # 查询某个用户组授权的资产和资产组
 | 
			
		||||
    url(r'^v1/user-group/(?P<pk>[0-9a-zA-Z\-]{36})/assets/$', api.UserGroupGrantedAssetsApi.as_view(), name='user-group-assets'),
 | 
			
		||||
    url(r'^v1/user-group/(?P<pk>[0-9a-zA-Z\-]{36})/nodes/$', api.UserGroupGrantedNodesApi.as_view(), name='user-group-nodes'),
 | 
			
		||||
    url(r'^v1/user-group/(?P<pk>[0-9a-zA-Z\-]{36})/nodes-assets/$', api.UserGroupGrantedNodesWithAssetsApi.as_view(), name='user-group-nodes-assets'),
 | 
			
		||||
    url(r'^v1/user-group/(?P<pk>[0-9a-zA-Z\-]{36})/nodes/(?P<node_id>[0-9a-zA-Z\-]{36})/assets/$', api.UserGroupGrantedNodeAssetsApi.as_view(), name='user-group-node-assets'),
 | 
			
		||||
    url(r'^v1/user-group/(?P<pk>[0-9a-zA-Z\-]{36})/assets/$',
 | 
			
		||||
        api.UserGroupGrantedAssetsApi.as_view(), name='user-group-assets'),
 | 
			
		||||
    url(r'^v1/user-group/(?P<pk>[0-9a-zA-Z\-]{36})/nodes/$',
 | 
			
		||||
        api.UserGroupGrantedNodesApi.as_view(), name='user-group-nodes'),
 | 
			
		||||
    url(r'^v1/user-group/(?P<pk>[0-9a-zA-Z\-]{36})/nodes-assets/$',
 | 
			
		||||
        api.UserGroupGrantedNodesWithAssetsApi.as_view(),
 | 
			
		||||
        name='user-group-nodes-assets'),
 | 
			
		||||
    url(
 | 
			
		||||
        r'^v1/user-group/(?P<pk>[0-9a-zA-Z\-]{36})/nodes/(?P<node_id>[0-9a-zA-Z\-]{36})/assets/$',
 | 
			
		||||
        api.UserGroupGrantedNodeAssetsApi.as_view(),
 | 
			
		||||
        name='user-group-node-assets'),
 | 
			
		||||
 | 
			
		||||
    # 用户和资产授权变更
 | 
			
		||||
    url(r'^v1/asset-permissions/(?P<pk>[0-9a-zA-Z\-]{36})/user/remove/$',
 | 
			
		||||
        api.AssetPermissionRemoveUserApi.as_view(),
 | 
			
		||||
        name='asset-permission-remove-user'),
 | 
			
		||||
    url(r'^v1/asset-permissions/(?P<pk>[0-9a-zA-Z\-]{36})/user/add/$',
 | 
			
		||||
        api.AssetPermissionAddUserApi.as_view(),
 | 
			
		||||
        name='asset-permission-add-user'),
 | 
			
		||||
    url(r'^v1/asset-permissions/(?P<pk>[0-9a-zA-Z\-]{36})/asset/remove/$',
 | 
			
		||||
        api.AssetPermissionRemoveAssetApi.as_view(),
 | 
			
		||||
        name='asset-permission-remove-asset'),
 | 
			
		||||
    url(r'^v1/asset-permissions/(?P<pk>[0-9a-zA-Z\-]{36})/asset/add/$',
 | 
			
		||||
        api.AssetPermissionAddAssetApi.as_view(),
 | 
			
		||||
        name='asset-permission-add-asset'),
 | 
			
		||||
 | 
			
		||||
    # 验证用户是否有某个资产和系统用户的权限
 | 
			
		||||
    url(r'v1/asset-permission/user/validate/$', api.ValidateUserAssetPermissionView.as_view(), name='validate-user-asset-permission'),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,8 +11,8 @@ urlpatterns = [
 | 
			
		|||
    url(r'^asset-permission/(?P<pk>[0-9a-zA-Z\-]{36})/update$', views.AssetPermissionUpdateView.as_view(), name='asset-permission-update'),
 | 
			
		||||
    url(r'^asset-permission/(?P<pk>[0-9a-zA-Z\-]{36})$', views.AssetPermissionDetailView.as_view(),name='asset-permission-detail'),
 | 
			
		||||
    url(r'^asset-permission/(?P<pk>[0-9a-zA-Z\-]{36})/delete$', views.AssetPermissionDeleteView.as_view(), name='asset-permission-delete'),
 | 
			
		||||
    # url(r'^asset-permission/(?P<pk>[0-9a-zA-Z\-]{36})/user$', views.AssetPermissionUserView.as_view(), name='asset-permission-user-list'),
 | 
			
		||||
    # url(r'^asset-permission/(?P<pk>[0-9a-zA-Z\-]{36})/asset$', views.AssetPermissionAssetView.as_view(), name='asset-permission-asset-list'),
 | 
			
		||||
    url(r'^asset-permission/(?P<pk>[0-9a-zA-Z\-]{36})/user$', views.AssetPermissionUserView.as_view(), name='asset-permission-user-list'),
 | 
			
		||||
    url(r'^asset-permission/(?P<pk>[0-9a-zA-Z\-]{36})/asset$', views.AssetPermissionAssetView.as_view(), name='asset-permission-asset-list'),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,12 +4,12 @@ from __future__ import unicode_literals, absolute_import
 | 
			
		|||
 | 
			
		||||
from django.utils.translation import ugettext as _
 | 
			
		||||
from django.views.generic import ListView, CreateView, UpdateView, DetailView
 | 
			
		||||
from django.views.generic.edit import DeleteView
 | 
			
		||||
from django.views.generic.edit import DeleteView, SingleObjectMixin
 | 
			
		||||
from django.urls import reverse_lazy
 | 
			
		||||
from django.conf import settings
 | 
			
		||||
 | 
			
		||||
from common.utils import is_uuid
 | 
			
		||||
from .hands import AdminUserRequiredMixin, Node, Asset
 | 
			
		||||
from common.mixins import AdminUserRequiredMixin
 | 
			
		||||
from .hands import Node, Asset, SystemUser, User, UserGroup
 | 
			
		||||
from .models import AssetPermission
 | 
			
		||||
from .forms import AssetPermissionForm
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +83,11 @@ class AssetPermissionDetailView(AdminUserRequiredMixin, DetailView):
 | 
			
		|||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        context = {
 | 
			
		||||
            'app': _('Perms'),
 | 
			
		||||
            'action': _('Update asset permission')
 | 
			
		||||
            'action': _('Update asset permission'),
 | 
			
		||||
            'system_users_remain': SystemUser.objects.exclude(
 | 
			
		||||
                granted_by_permissions=self.object
 | 
			
		||||
            ),
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        kwargs.update(context)
 | 
			
		||||
        return super().get_context_data(**kwargs)
 | 
			
		||||
| 
						 | 
				
			
			@ -95,3 +99,59 @@ class AssetPermissionDeleteView(AdminUserRequiredMixin, DeleteView):
 | 
			
		|||
    success_url = reverse_lazy('perms:asset-permission-list')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AssetPermissionUserView(AdminUserRequiredMixin,
 | 
			
		||||
                              SingleObjectMixin,
 | 
			
		||||
                              ListView):
 | 
			
		||||
    template_name = 'perms/asset_permission_user.html'
 | 
			
		||||
    context_object_name = 'asset_permission'
 | 
			
		||||
    paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
 | 
			
		||||
    object = None
 | 
			
		||||
 | 
			
		||||
    def get(self, request, *args, **kwargs):
 | 
			
		||||
        self.object = self.get_object(queryset=AssetPermission.objects.all())
 | 
			
		||||
        return super().get(request, *args, **kwargs)
 | 
			
		||||
 | 
			
		||||
    def get_queryset(self):
 | 
			
		||||
        queryset = self.object.get_all_users()
 | 
			
		||||
        return queryset
 | 
			
		||||
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        context = {
 | 
			
		||||
            'app': _('Perms'),
 | 
			
		||||
            'action': _('Asset permission user list'),
 | 
			
		||||
            'users_remain': User.objects.exclude(asset_permissions=self.object)
 | 
			
		||||
                .exclude(role=User.ROLE_APP),
 | 
			
		||||
            'user_groups_remain': UserGroup.objects.exclude(
 | 
			
		||||
                asset_permissions=self.object
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
        kwargs.update(context)
 | 
			
		||||
        return super().get_context_data(**kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class AssetPermissionAssetView(AdminUserRequiredMixin,
 | 
			
		||||
                               SingleObjectMixin,
 | 
			
		||||
                               ListView):
 | 
			
		||||
    template_name = 'perms/asset_permission_asset.html'
 | 
			
		||||
    context_object_name = 'asset_permission'
 | 
			
		||||
    paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
 | 
			
		||||
    object = None
 | 
			
		||||
 | 
			
		||||
    def get(self, request, *args, **kwargs):
 | 
			
		||||
        self.object = self.get_object(queryset=AssetPermission.objects.all())
 | 
			
		||||
        return super().get(request, *args, **kwargs)
 | 
			
		||||
 | 
			
		||||
    def get_queryset(self):
 | 
			
		||||
        queryset = self.object.get_all_assets()
 | 
			
		||||
        return queryset
 | 
			
		||||
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        assets_granted = self.get_queryset()
 | 
			
		||||
        context = {
 | 
			
		||||
            'app': _('Perms'),
 | 
			
		||||
            'action': _('Asset permission asset list'),
 | 
			
		||||
            'assets_remain': Asset.objects.exclude(id__in=[a.id for a in assets_granted]),
 | 
			
		||||
            'nodes_remain': Node.objects.exclude(granted_by_permissions=self.object),
 | 
			
		||||
        }
 | 
			
		||||
        kwargs.update(context)
 | 
			
		||||
        return super().get_context_data(**kwargs)
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +55,7 @@ class User(AbstractUser):
 | 
			
		|||
    created_by = models.CharField(max_length=30, default='', verbose_name=_('Created by'))
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.username
 | 
			
		||||
        return '{0.name}({0.username})'.format(self)
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def password_raw(self):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue