Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gjl2004yn
jumpserver
提交
653c328e
J
jumpserver
项目概览
gjl2004yn
/
jumpserver
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jumpserver
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
653c328e
编写于
2月 01, 2018
作者:
baltery
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[Abandon] ...
上级
2bc5e882
变更
13
隐藏空白更改
内联
并排
Showing
13 changed file
with
119 addition
and
212 deletion
+119
-212
apps/assets/models/tree.py
apps/assets/models/tree.py
+14
-12
apps/assets/serializers.py
apps/assets/serializers.py
+5
-5
apps/assets/templates/assets/label_list.html
apps/assets/templates/assets/label_list.html
+2
-1
apps/assets/templates/assets/tree.html
apps/assets/templates/assets/tree.html
+5
-7
apps/assets/urls/api_urls.py
apps/assets/urls/api_urls.py
+1
-1
apps/common/fields.py
apps/common/fields.py
+7
-0
apps/perms/api.py
apps/perms/api.py
+25
-20
apps/perms/forms.py
apps/perms/forms.py
+15
-81
apps/perms/models.py
apps/perms/models.py
+1
-0
apps/perms/serializers.py
apps/perms/serializers.py
+16
-29
apps/perms/templates/perms/asset_permission_create_update.html
...perms/templates/perms/asset_permission_create_update.html
+5
-12
apps/perms/templates/perms/asset_permission_list.html
apps/perms/templates/perms/asset_permission_list.html
+16
-34
apps/perms/views.py
apps/perms/views.py
+7
-10
未找到文件。
apps/assets/models/tree.py
浏览文件 @
653c328e
# -*- coding: utf-8 -*-
#
import
uuid
from
django.db
import
models
from
django.utils.translation
import
ugettext_lazy
as
_
...
...
@@ -9,34 +10,35 @@ __all__ = ['Node']
class
Node
(
models
.
Model
):
id
=
models
.
CharField
(
primary_key
=
True
,
max_length
=
64
)
# '1:1:1:1'
name
=
models
.
CharField
(
max_length
=
128
,
unique
=
True
,
verbose_name
=
_
(
"Name"
))
id
=
models
.
UUIDField
(
default
=
uuid
.
uuid4
,
primary_key
=
True
)
key
=
models
.
CharField
(
unique
=
True
,
max_length
=
64
,
verbose_name
=
_
(
"Key"
))
# '1:1:1:1'
value
=
models
.
CharField
(
max_length
=
128
,
unique
=
True
,
verbose_name
=
_
(
"Value"
))
child_mark
=
models
.
IntegerField
(
default
=
0
)
date_create
=
models
.
DateTimeField
(
auto_now_add
=
True
)
def
__str__
(
self
):
return
self
.
nam
e
return
self
.
valu
e
@
property
def
level
(
self
):
return
len
(
self
.
id
.
split
(
':'
))
return
len
(
self
.
key
.
split
(
':'
))
def
get_next_child_
id
(
self
):
def
get_next_child_
key
(
self
):
mark
=
self
.
child_mark
self
.
child_mark
+=
1
self
.
save
()
return
"{}:{}"
.
format
(
self
.
id
,
mark
)
return
"{}:{}"
.
format
(
self
.
key
,
mark
)
def
create_child
(
self
,
nam
e
):
child_
id
=
self
.
get_next_child_id
()
child
=
self
.
__class__
.
objects
.
create
(
id
=
child_id
,
name
=
nam
e
)
def
create_child
(
self
,
valu
e
):
child_
key
=
self
.
get_next_child_key
()
child
=
self
.
__class__
.
objects
.
create
(
key
=
child_key
,
value
=
valu
e
)
return
child
def
get_children
(
self
):
return
self
.
__class__
.
objects
.
filter
(
id__regex
=
r
'{}:[0-9]+$'
.
format
(
self
.
id
))
return
self
.
__class__
.
objects
.
filter
(
key__regex
=
r
'{}:[0-9]+$'
.
format
(
self
.
key
))
def
get_all_children
(
self
):
return
self
.
__class__
.
objects
.
filter
(
id__startswith
=
'{}:'
.
format
(
self
.
id
))
return
self
.
__class__
.
objects
.
filter
(
key__startswith
=
'{}:'
.
format
(
self
.
key
))
def
get_assets
(
self
):
from
.asset
import
Asset
...
...
@@ -53,6 +55,6 @@ class Node(models.Model):
@
classmethod
def
root
(
cls
):
obj
,
created
=
cls
.
objects
.
get_or_create
(
id
=
'0'
,
defaults
=
{
"id"
:
'0'
,
'nam
e'
:
"ROOT"
}
key
=
'0'
,
defaults
=
{
"key"
:
'0'
,
'valu
e'
:
"ROOT"
}
)
return
obj
apps/assets/serializers.py
浏览文件 @
653c328e
...
...
@@ -323,19 +323,19 @@ class NodeSerializer(serializers.ModelSerializer):
class
Meta
:
model
=
Node
fields
=
[
'id'
,
'
nam
e'
,
'parent'
]
fields
=
[
'id'
,
'
key'
,
'valu
e'
,
'parent'
]
list_serializer_class
=
BulkListSerializer
@
staticmethod
def
get_parent
(
obj
):
if
obj
.
id
==
"0"
:
if
obj
.
key
==
"0"
:
return
"#"
if
not
obj
.
id
.
startswith
(
"0"
):
if
not
obj
.
key
.
startswith
(
"0"
):
return
"0"
return
":"
.
join
(
obj
.
id
.
split
(
":"
)[:
-
1
])
return
":"
.
join
(
obj
.
key
.
split
(
":"
)[:
-
1
])
def
get_fields
(
self
):
fields
=
super
().
get_fields
()
field
=
fields
[
"
id
"
]
field
=
fields
[
"
key
"
]
field
.
required
=
False
return
fields
apps/assets/templates/assets/label_list.html
浏览文件 @
653c328e
...
...
@@ -38,7 +38,8 @@ function initTable() {
var
update_btn
=
'
<a href="{% url "assets:label-update" pk=DEFAULT_PK %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>
'
.
replace
(
'
{{ DEFAULT_PK }}
'
,
cellData
);
var
del_btn
=
'
<a class="btn btn-xs btn-danger m-l-xs btn-delete" data-uid="{{ DEFAULT_PK }}">{% trans "Delete" %}</a>
'
.
replace
(
'
{{ DEFAULT_PK }}
'
,
cellData
);
$
(
td
).
html
(
update_btn
+
del_btn
)
}}],
}}
],
ajax_url
:
'
{% url "api-assets:label-list" %}?sort=name
'
,
columns
:
[
{
data
:
"
id
"
},
{
data
:
"
name
"
},
{
data
:
"
value
"
},
...
...
apps/assets/templates/assets/tree.html
浏览文件 @
653c328e
...
...
@@ -229,7 +229,7 @@
if
(
!
parentNode
){
return
}
var
url
=
"
{% url 'api-assets:node-children' pk=
'0:0' %}
"
.
replace
(
"
0:0
"
,
parentNode
.
id
);
var
url
=
"
{% url 'api-assets:node-children' pk=
DEFAULT_PK %}
"
.
replace
(
"
{{ DEFAULT_PK }}
"
,
parentNode
.
id
);
$
.
post
(
url
,
{},
function
(
data
,
status
){
if
(
status
===
"
success
"
)
{
var
newNode
=
{
name
:
data
[
"
name
"
],
id
:
data
[
"
id
"
],
pId
:
parentNode
.
id
};
...
...
@@ -263,9 +263,8 @@
}
function
onRenameNode
(
event
,
treeId
,
treeNode
,
isCancel
){
console
.
log
(
treeNode
);
var
url
=
"
{% url 'api-assets:node-detail' pk='0:0' %}
"
.
replace
(
"
0:0
"
,
treeNode
.
id
);
var
data
=
{
"
name
"
:
treeNode
.
name
};
var
url
=
"
{% url 'api-assets:node-detail' pk=DEFAULT_PK %}
"
.
replace
(
"
{{ DEFAULT_PK }}
"
,
treeNode
.
id
);
var
data
=
{
"
value
"
:
treeNode
.
name
};
if
(
isCancel
){
return
}
...
...
@@ -282,8 +281,6 @@
if
(
!
current_node
){
return
}
console
.
log
(
"
Edit tree
"
);
console
.
log
(
current_node
);
zTree
.
editName
(
current_node
);
}
...
...
@@ -310,9 +307,10 @@
$
.
get
(
"
{% url 'api-assets:node-list' %}
"
,
function
(
data
,
status
){
$
.
each
(
data
,
function
(
index
,
value
)
{
value
[
"
pId
"
]
=
value
[
"
parent
"
];
if
(
value
[
"
id
"
]
===
"
0
"
)
{
if
(
value
[
"
key
"
]
===
"
0
"
)
{
value
[
"
open
"
]
=
true
;
}
value
[
"
name
"
]
=
value
[
"
value
"
]
});
zNodes
=
data
;
$
.
fn
.
zTree
.
init
(
$
(
"
#assetTree
"
),
setting
,
zNodes
);
...
...
apps/assets/urls/api_urls.py
浏览文件 @
653c328e
...
...
@@ -43,7 +43,7 @@ urlpatterns = [
api
.
SystemUserPushApi
.
as_view
(),
name
=
'system-user-push'
),
url
(
r
'^v1/system-user/(?P<pk>[0-9a-zA-Z\-]{36})/connective/$'
,
api
.
SystemUserTestConnectiveApi
.
as_view
(),
name
=
'system-user-connective'
),
url
(
r
'^v1/nodes/(?P<pk>[0-9
:]+
)/children/$'
,
api
.
NodeChildrenApi
.
as_view
(),
name
=
'node-children'
),
url
(
r
'^v1/nodes/(?P<pk>[0-9
a-zA-Z\-]{36}
)/children/$'
,
api
.
NodeChildrenApi
.
as_view
(),
name
=
'node-children'
),
]
urlpatterns
+=
router
.
urls
...
...
apps/common/fields.py
浏览文件 @
653c328e
...
...
@@ -6,6 +6,7 @@ from django import forms
from
django.utils
import
six
from
django.core.exceptions
import
ValidationError
from
django.utils.translation
import
ugettext
as
_
from
rest_framework
import
serializers
class
DictField
(
forms
.
Field
):
...
...
@@ -36,3 +37,9 @@ class DictField(forms.Field):
# Sometimes data or initial may be a string equivalent of a boolean
# so we should run it through to_python first to get a boolean value
return
self
.
to_python
(
initial
)
!=
self
.
to_python
(
data
)
class
StringIDField
(
serializers
.
Field
):
def
to_representation
(
self
,
value
):
return
{
"pk"
:
value
.
pk
,
"name"
:
value
.
__str__
()}
apps/perms/api.py
浏览文件 @
653c328e
...
...
@@ -11,7 +11,7 @@ from users.permissions import IsValidUser, IsSuperUser, IsAppUser, IsSuperUserOr
from
.utils
import
get_user_granted_assets
,
get_user_granted_asset_groups
,
\
get_user_asset_permissions
,
get_user_group_asset_permissions
,
\
get_user_group_granted_assets
,
get_user_group_granted_asset_groups
from
.models
import
AssetPermission
from
.models
import
AssetPermission
,
NodePermission
from
.hands
import
AssetGrantedSerializer
,
User
,
UserGroup
,
AssetGroup
,
Asset
,
\
AssetGroup
,
AssetGroupGrantedSerializer
,
SystemUser
,
MyAssetGroupGrantedSerializer
from
.
import
serializers
...
...
@@ -21,28 +21,33 @@ class AssetPermissionViewSet(viewsets.ModelViewSet):
"""
资产授权列表的增删改查api
"""
queryset
=
Asset
Permission
.
objects
.
all
()
serializer_class
=
serializers
.
AssetPermissionSerializer
queryset
=
Node
Permission
.
objects
.
all
()
serializer_class
=
serializers
.
AssetPermission
CreateUpdate
Serializer
permission_classes
=
(
IsSuperUser
,)
def
get_queryset
(
self
):
queryset
=
super
(
AssetPermissionViewSet
,
self
).
get_queryset
()
user_id
=
self
.
request
.
query_params
.
get
(
'user'
,
''
)
user_group_id
=
self
.
request
.
query_params
.
get
(
'user_group'
,
''
)
if
user_id
and
user_id
.
isdigit
():
user
=
get_object_or_404
(
User
,
id
=
int
(
user_id
))
queryset
=
get_user_asset_permissions
(
user
)
if
user_group_id
:
user_group
=
get_object_or_404
(
UserGroup
,
id
=
user_group_id
)
queryset
=
get_user_group_asset_permissions
(
user_group
)
return
queryset
def
get_serializer_class
(
self
):
if
getattr
(
self
,
'user_id'
,
''
):
return
serializers
.
UserAssetPermissionSerializer
return
serializers
.
AssetPermissionSerializer
if
self
.
action
in
(
"list"
,
'retrieve'
):
return
serializers
.
AssetPermissionListSerializer
return
self
.
serializer_class
# def get_queryset(self):
# queryset = super(AssetPermissionViewSet, self).get_queryset()
# user_id = self.request.query_params.get('user', '')
# user_group_id = self.request.query_params.get('user_group', '')
#
# if user_id and user_id.isdigit():
# user = get_object_or_404(User, id=int(user_id))
# queryset = get_user_asset_permissions(user)
#
# if user_group_id:
# user_group = get_object_or_404(UserGroup, id=user_group_id)
# queryset = get_user_group_asset_permissions(user_group)
# return queryset
# def get_serializer_class(self):
# if getattr(self, 'user_id', ''):
# return serializers.UserAssetPermissionCreateUpdateSerializer
# return serializers.AssetPermissionCreateUpdateSerializer
class
AssetPermissionRemoveUserApi
(
RetrieveUpdateAPIView
):
...
...
apps/perms/forms.py
浏览文件 @
653c328e
...
...
@@ -4,94 +4,28 @@ from __future__ import absolute_import, unicode_literals
from
django
import
forms
from
django.utils.translation
import
ugettext_lazy
as
_
# from .hands import User, UserGroup, Asset, AssetGroup, SystemUser
from
.models
import
AssetPermission
from
users.models
import
User
from
.models
import
NodePermission
class
AssetPermissionForm
(
forms
.
ModelForm
):
users
=
forms
.
ModelMultipleChoiceField
(
queryset
=
User
.
objects
.
exclude
(
role
=
User
.
ROLE_APP
),
widget
=
forms
.
SelectMultiple
(
attrs
=
{
'class'
:
'select2'
,
'data-placeholder'
:
_
(
'Select users'
)},
),
label
=
_
(
"User"
),
required
=
False
,
)
class
Meta
:
model
=
Asset
Permission
model
=
Node
Permission
fields
=
[
'n
ame'
,
'users'
,
'user_groups'
,
'assets'
,
'asset_groups
'
,
'
system_users'
,
'is_active'
,
'date_expired'
,
'comment'
,
'n
ode'
,
'user_group'
,
'system_user'
,
'is_active
'
,
'
date_expired'
,
'comment'
]
widgets
=
{
'user_groups'
:
forms
.
SelectMultiple
(
attrs
=
{
'class'
:
'select2'
,
'data-placeholder'
:
_
(
'Select user groups'
)}),
'assets'
:
forms
.
SelectMultiple
(
attrs
=
{
'class'
:
'select2'
,
'data-placeholder'
:
_
(
'Select assets'
)}),
'asset_groups'
:
forms
.
SelectMultiple
(
attrs
=
{
'class'
:
'select2'
,
'data-placeholder'
:
_
(
'Select asset groups'
)}),
'system_users'
:
forms
.
SelectMultiple
(
attrs
=
{
'class'
:
'select2'
,
'data-placeholder'
:
_
(
'Select system users'
)}),
'node'
:
forms
.
Select
(
attrs
=
{
'class'
:
'select2'
,
'data-placeholder'
:
_
(
"Node"
)}
),
'user_group'
:
forms
.
Select
(
attrs
=
{
'class'
:
'select2'
,
'data-placeholder'
:
_
(
"User group"
)}
),
'system_user'
:
forms
.
Select
(
attrs
=
{
'class'
:
'select2'
,
'data-placeholder'
:
_
(
'System user'
)}
),
}
help_texts
=
{
'name'
:
'* required'
,
'system_users'
:
'* required'
,
}
def
clean_user_groups
(
self
):
users
=
self
.
cleaned_data
.
get
(
'users'
)
user_groups
=
self
.
cleaned_data
.
get
(
'user_groups'
)
if
not
users
and
not
user_groups
:
raise
forms
.
ValidationError
(
_
(
"User or group at least one required"
))
return
self
.
cleaned_data
[
"user_groups"
]
def
clean_asset_groups
(
self
):
assets
=
self
.
cleaned_data
.
get
(
'assets'
)
asset_groups
=
self
.
cleaned_data
.
get
(
'asset_groups'
)
if
not
assets
and
not
asset_groups
:
raise
forms
.
ValidationError
(
_
(
"Asset or group at least one required"
))
return
self
.
cleaned_data
[
"asset_groups"
]
def
clean_system_users
(
self
):
from
assets.utils
import
check_assets_have_system_user
errors
=
[]
assets
=
self
.
cleaned_data
[
'assets'
]
asset_groups
=
self
.
cleaned_data
.
get
(
'asset_groups'
)
system_users
=
self
.
cleaned_data
.
get
(
'system_users'
)
if
not
asset_groups
and
not
assets
:
return
self
.
cleaned_data
.
get
(
"system_users"
)
error_data
=
check_assets_have_system_user
(
assets
,
system_users
)
if
error_data
:
for
asset
,
system_users
in
error_data
.
items
():
msg
=
_
(
"Asset {} of cluster {} not have [{}] system users, please check
\n
"
)
error
=
forms
.
ValidationError
(
msg
.
format
(
asset
.
hostname
,
asset
.
cluster
.
name
,
", "
.
join
(
system_user
.
name
for
system_user
in
system_users
)
))
errors
.
append
(
error
)
for
group
in
asset_groups
:
msg
=
_
(
"Asset {}(group {}) of cluster {} not have [{}] system users, please check
\n
"
)
assets
=
group
.
assets
.
all
()
error_data
=
check_assets_have_system_user
(
assets
,
system_users
)
for
asset
,
system_users
in
error_data
.
items
():
errors
.
append
(
msg
.
format
(
asset
.
hostname
,
group
.
name
,
asset
.
cluster
.
name
,
", "
.
join
(
system_user
.
name
for
system_user
in
system_users
)
))
if
errors
:
raise
forms
.
ValidationError
(
errors
)
return
self
.
cleaned_data
[
'system_users'
]
def
clean_system_user
(
self
):
return
self
.
cleaned_data
[
'system_user'
]
apps/perms/models.py
浏览文件 @
653c328e
...
...
@@ -70,6 +70,7 @@ class AssetPermission(models.Model):
class
NodePermission
(
models
.
Model
):
id
=
models
.
UUIDField
(
default
=
uuid
.
uuid4
,
primary_key
=
True
)
node
=
models
.
ForeignKey
(
'assets.Node'
,
on_delete
=
models
.
CASCADE
,
verbose_name
=
_
(
"Node"
))
user_group
=
models
.
ForeignKey
(
'users.UserGroup'
,
on_delete
=
models
.
CASCADE
,
verbose_name
=
_
(
"User group"
))
system_user
=
models
.
ForeignKey
(
'assets.SystemUser'
,
on_delete
=
models
.
CASCADE
,
verbose_name
=
_
(
"System user"
))
...
...
apps/perms/serializers.py
浏览文件 @
653c328e
...
...
@@ -4,40 +4,27 @@
from
django.utils.translation
import
ugettext_lazy
as
_
from
rest_framework
import
serializers
from
common.utils
import
get_object_or_none
from
.models
import
AssetPermission
from
.
hands
import
User
from
common.fields
import
StringIDField
from
.
models
import
AssetPermission
,
NodePermission
class
AssetPermissionSerializer
(
serializers
.
ModelSerializer
):
assets_
=
serializers
.
SerializerMethodField
()
asset_groups_
=
serializers
.
SerializerMethodField
()
users_
=
serializers
.
SerializerMethodField
()
user_groups_
=
serializers
.
SerializerMethodField
()
system_users_
=
serializers
.
SerializerMethodField
()
class
AssetPermissionCreateUpdateSerializer
(
serializers
.
ModelSerializer
):
class
Meta
:
model
=
AssetPermission
fields
=
'__all__'
@
staticmethod
def
get_assets_
(
obj
):
return
[
asset
.
hostname
for
asset
in
obj
.
assets
.
all
()]
@
staticmethod
def
get_asset_groups_
(
obj
):
return
[
group
.
name
for
group
in
obj
.
asset_groups
.
all
()]
model
=
NodePermission
fields
=
[
'node'
,
'user_group'
,
'system_user'
,
'is_active'
,
'date_expired'
]
@
staticmethod
def
get_users_
(
obj
):
return
[
user
.
username
for
user
in
obj
.
users
.
all
()]
@
staticmethod
def
get_user_groups_
(
obj
):
return
[
group
.
name
for
group
in
obj
.
user_groups
.
all
()]
class
AssetPermissionListSerializer
(
serializers
.
ModelSerializer
):
node
=
StringIDField
(
read_only
=
True
)
user_group
=
StringIDField
(
read_only
=
True
)
system_user
=
StringIDField
(
read_only
=
True
)
@
staticmethod
def
get_system_users_
(
obj
):
return
[
user
.
username
for
user
in
obj
.
system_users
.
all
()]
class
Meta
:
model
=
NodePermission
fields
=
'__all__'
class
AssetPermissionUpdateUserSerializer
(
serializers
.
ModelSerializer
):
...
...
@@ -54,7 +41,7 @@ class AssetPermissionUpdateAssetSerializer(serializers.ModelSerializer):
fields
=
[
'id'
,
'assets'
]
class
UserAssetPermission
Serializer
(
AssetPermission
Serializer
):
class
UserAssetPermission
CreateUpdateSerializer
(
AssetPermissionCreateUpdate
Serializer
):
is_inherited
=
serializers
.
SerializerMethodField
()
@
staticmethod
...
...
apps/perms/templates/perms/asset_permission_create_update.html
浏览文件 @
653c328e
...
...
@@ -30,17 +30,10 @@
<div
class=
"ibox-content"
>
<form
method=
"post"
class=
"form-horizontal"
action=
""
>
{% csrf_token %}
<h3>
{% trans 'Name' %}
</h3>
{% bootstrap_field form.name layout="horizontal" %}
<div
class=
"hr-line-dashed"
></div>
<h3>
{% trans 'User' %}
</h3>
{% bootstrap_field form.users layout="horizontal" %}
{% bootstrap_field form.user_groups layout="horizontal" %}
<div
class=
"hr-line-dashed"
></div>
<h3>
{% trans 'Asset' %}
</h3>
{% bootstrap_field form.assets layout="horizontal" %}
{% bootstrap_field form.asset_groups layout="horizontal" %}
{% bootstrap_field form.system_users layout="horizontal" %}
<h3>
{% trans 'Basic' %}
</h3>
{% bootstrap_field form.node layout="horizontal" %}
{% bootstrap_field form.user_group layout="horizontal" %}
{% bootstrap_field form.system_user layout="horizontal" %}
<div
class=
"hr-line-dashed"
></div>
<h3>
{% trans 'Other' %}
</h3>
<div
class=
"form-group"
>
...
...
@@ -59,7 +52,7 @@
</div>
<span
class=
"help-block "
>
{{ form.date_expired.errors }}
</span>
</div>
</div>
</div>
{% bootstrap_field form.comment layout="horizontal" %}
<div
class=
"form-group"
>
...
...
apps/perms/templates/perms/asset_permission_list.html
浏览文件 @
653c328e
...
...
@@ -6,7 +6,6 @@
{% block help_message %}
<div
class=
"alert alert-info help-message"
>
提前规划好集群中的系统用户,授权时选择的资产(组内资产)必须存在该系统用户,否则可能无法成功登录
</div>
{% endblock %}
...
...
@@ -20,15 +19,13 @@
<thead>
<tr>
<th
class=
"text-center"
>
<input
type=
"checkbox"
id=
"check_all"
class=
"ipt_check_all"
>
<input
type=
"checkbox"
id=
"check_all"
class=
"ipt_check_all"
>
</th>
<th
class=
"text-center"
>
{% trans 'Name' %}
</th>
<th
class=
"text-center"
>
{% trans 'User' %}
</th>
<th
class=
"text-center"
>
{% trans 'Node' %}
</th>
<th
class=
"text-center"
>
{% trans 'User group' %}
</th>
<th
class=
"text-center"
>
{% trans 'Asset' %}
</th>
<th
class=
"text-center"
>
{% trans 'Asset group' %}
</th>
<th
class=
"text-center"
>
{% trans 'System user' %}
</th>
<th
class=
"text-center"
>
{% trans 'Is valid' %}
</th>
<th
class=
"text-center"
>
{% trans 'Is active' %}
</th>
<th
class=
"text-center"
>
{% trans 'Date expired' %}
</th>
<th
class=
"text-center"
>
{% trans 'Action' %}
</th>
</tr>
</thead>
...
...
@@ -43,38 +40,27 @@ function initTable() {
var
options
=
{
ele
:
$
(
'
#permission_list_table
'
),
columnDefs
:
[
{
targets
:
1
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
detail_btn
=
'
<a href="{% url "perms:asset-permission-detail" pk=DEFAULT_PK %}">
'
+
cellData
+
'
</a>
'
;
$
(
td
).
html
(
detail_btn
.
replace
(
'
{{ DEFAULT_PK }}
'
,
rowData
.
id
));
{
targets
:
1
,
createdCell
:
function
(
td
,
cellData
)
{
var
html
=
'
<a href="">
'
+
cellData
.
name
+
'
</a>
'
;
$
(
td
).
html
(
html
)
}},
{
targets
:
2
,
createdCell
:
function
(
td
,
cellData
)
{
var
html
=
createPopover
(
cellData
)
;
$
(
td
).
html
(
html
)
;
var
html
=
'
<a href="">
'
+
cellData
.
name
+
'
</a>
'
;
$
(
td
).
html
(
html
)
}},
{
targets
:
3
,
createdCell
:
function
(
td
,
cellData
)
{
var
html
=
createPopover
(
cellData
)
;
$
(
td
).
html
(
html
)
;
var
html
=
'
<a href="">
'
+
cellData
.
name
+
'
</a>
'
;
$
(
td
).
html
(
html
)
}},
{
targets
:
4
,
createdCell
:
function
(
td
,
cellData
)
{
var
html
=
createPopover
(
cellData
);
$
(
td
).
html
(
html
);
}},
{
targets
:
5
,
createdCell
:
function
(
td
,
cellData
)
{
var
html
=
createPopover
(
cellData
);
$
(
td
).
html
(
html
);
}},
{
targets
:
6
,
createdCell
:
function
(
td
,
cellData
)
{
var
html
=
createPopover
(
cellData
);
$
(
td
).
html
(
html
);
}},
{
targets
:
7
,
createdCell
:
function
(
td
,
cellData
)
{
if
(
!
cellData
)
{
$
(
td
).
html
(
'
<i class="fa fa-times text-danger"></i>
'
)
}
else
{
$
(
td
).
html
(
'
<i class="fa fa-check text-navy"></i>
'
)
}
}},
{
targets
:
8
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
{
targets
:
6
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
update_btn
=
'
<a href="{% url "perms:asset-permission-update" pk=DEFAULT_PK %}" class="btn btn-xs m-l-xs btn-info">{% trans "Update" %}</a>
'
.
replace
(
'
{{ DEFAULT_PK }}
'
,
cellData
);
var
del_btn
=
'
<a class="btn btn-xs btn-danger m-l-xs btn-del" data-uid="{{ DEFAULT_PK }}" data-name="99991938">{% trans "Delete" %}</a>
'
.
replace
(
'
{{ DEFAULT_PK }}
'
,
cellData
)
...
...
@@ -85,16 +71,12 @@ function initTable() {
],
ajax_url
:
'
{% url "api-perms:asset-permission-list" %}
'
,
columns
:
[
{
data
:
"
id
"
},
{
data
:
"
name
"
},
{
data
:
"
users_
"
},
{
data
:
"
user_groups_
"
},
{
data
:
"
assets_
"
},
{
data
:
"
asset_groups_
"
},
{
data
:
"
system_users_
"
},
{
data
:
"
is_active
"
},
{
data
:
"
id
"
}
{
data
:
"
id
"
},
{
data
:
"
node
"
},
{
data
:
"
user_group
"
},
{
data
:
"
system_user
"
},
{
data
:
"
is_active
"
},
{
data
:
"
date_expired
"
},
{
data
:
"
id
"
}
],
op_html
:
$
(
'
#actions
'
).
html
()
};
jumpserver
.
initDataTable
(
options
).
on
(
'
daw
'
,
function
()
{
$
(
'
[data-toggle="popover"]
'
).
popover
({
html
:
true
});
});
jumpserver
.
initDataTable
(
options
)
}
$
(
document
).
ready
(
function
(){
...
...
apps/perms/views.py
浏览文件 @
653c328e
...
...
@@ -5,21 +5,20 @@ from __future__ import unicode_literals, absolute_import
from
django.utils.translation
import
ugettext
as
_
from
django.conf
import
settings
from
django.views.generic
import
ListView
,
CreateView
,
UpdateView
from
django.views.generic.edit
import
DeleteView
,
FormView
from
django.views.generic.edit
import
DeleteView
from
django.urls
import
reverse_lazy
from
django.contrib.messages.views
import
SuccessMessageMixin
from
django.views.generic.detail
import
DetailView
,
SingleObjectMixin
from
django.contrib
import
messages
from
common.const
import
create_success_msg
,
update_success_msg
from
.hands
import
AdminUserRequiredMixin
,
User
,
UserGroup
,
SystemUser
,
\
Asset
,
AssetGroup
from
.models
import
AssetPermission
from
.models
import
AssetPermission
,
NodePermission
from
.forms
import
AssetPermissionForm
class
AssetPermissionListView
(
AdminUserRequiredMixin
,
ListView
):
model
=
Asset
Permission
model
=
Node
Permission
context_object_name
=
'asset_permission_list'
template_name
=
'perms/asset_permission_list.html'
...
...
@@ -32,12 +31,11 @@ class AssetPermissionListView(AdminUserRequiredMixin, ListView):
return
super
().
get_context_data
(
**
kwargs
)
class
AssetPermissionCreateView
(
AdminUserRequiredMixin
,
SuccessMessageMixin
,
CreateView
):
model
=
Asset
Permission
class
AssetPermissionCreateView
(
AdminUserRequiredMixin
,
CreateView
):
model
=
Node
Permission
form_class
=
AssetPermissionForm
template_name
=
'perms/asset_permission_create_update.html'
success_url
=
reverse_lazy
(
'perms:asset-permission-list'
)
success_message
=
create_success_msg
def
get_context_data
(
self
,
**
kwargs
):
context
=
{
...
...
@@ -48,12 +46,11 @@ class AssetPermissionCreateView(AdminUserRequiredMixin, SuccessMessageMixin, Cre
return
super
().
get_context_data
(
**
kwargs
)
class
AssetPermissionUpdateView
(
AdminUserRequiredMixin
,
SuccessMessageMixin
,
UpdateView
):
model
=
Asset
Permission
class
AssetPermissionUpdateView
(
AdminUserRequiredMixin
,
UpdateView
):
model
=
Node
Permission
form_class
=
AssetPermissionForm
template_name
=
'perms/asset_permission_create_update.html'
success_url
=
reverse_lazy
(
"perms:asset-permission-list"
)
success_message
=
update_success_msg
def
get_context_data
(
self
,
**
kwargs
):
context
=
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录