Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gjl2004yn
jumpserver
提交
a4dc27f0
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,发现更多精彩内容 >>
提交
a4dc27f0
编写于
9月 14, 2016
作者:
baltery
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Finish permissin detail asset list and user list
上级
5bca783e
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
119 addition
and
48 deletion
+119
-48
apps/common/README.md
apps/common/README.md
+15
-0
apps/common/utils.py
apps/common/utils.py
+25
-11
apps/perms/models.py
apps/perms/models.py
+1
-1
apps/perms/templates/perms/asset_permission_asset_list.html
apps/perms/templates/perms/asset_permission_asset_list.html
+25
-15
apps/perms/templates/perms/asset_permission_user_list.html
apps/perms/templates/perms/asset_permission_user_list.html
+1
-1
apps/perms/views.py
apps/perms/views.py
+52
-20
未找到文件。
apps/common/README.md
浏览文件 @
a4dc27f0
# Common app
Common app provide common view, function or others.
Common app shouldn't rely on other apps, because It may lead to cycle
import.
If your want to implement some function or class, you should think
whether other app use or not. If yes, You should make in common.
If the ability more relate to your app tightness, It's mean your app
provide this ability, not common, You should write it on your app utils.
## Celery usage
## Celery usage
...
...
apps/common/utils.py
浏览文件 @
a4dc27f0
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
#
#
from
__future__
import
unicode_literals
from
__future__
import
unicode_literals
from
six
import
string_types
from
itertools
import
chain
from
itertools
import
chain
import
string
import
string
...
@@ -52,30 +53,43 @@ def combine_seq(s1, s2, callback=None):
...
@@ -52,30 +53,43 @@ def combine_seq(s1, s2, callback=None):
seq
=
chain
(
s1
,
s2
)
seq
=
chain
(
s1
,
s2
)
if
callback
:
if
callback
:
seq
=
map
(
callback
,
seq
)
seq
=
map
(
callback
,
seq
)
return
seq
return
seq
def
search_object_attr
(
obj
,
value
=
''
,
attr_list
=
None
,
ignore_case
=
False
):
def
search_object_attr
(
obj
,
value
=
''
,
attr_list
=
None
,
ignore_case
=
False
):
try
:
"""It's provide a method to search a object attribute equal some value
object_attr
=
obj
.
__dict__
except
AttributeError
:
return
False
if
not
isinstance
(
value
,
str
):
If object some attribute equal :param: value, return True else return False
return
False
class A():
name = 'admin'
age = 7
:param obj: A object
:param value: A string match object attribute
:param attr_list: Only match attribute in attr_list
:param ignore_case: Ignore case
:return: Boolean
"""
if
value
==
''
:
if
value
==
''
:
return
True
return
True
try
:
object_attr
=
obj
.
__dict__
except
AttributeError
:
return
False
if
attr_list
is
not
None
:
if
attr_list
is
not
None
:
new_object_attr
=
{}
for
attr
in
attr_list
:
for
attr
in
attr_list
:
object_attr
.
pop
(
attr
)
new_object_attr
[
attr
]
=
object_attr
.
pop
(
attr
)
object_attr
=
new_object_attr
print
(
value
)
print
(
object_attr
)
if
ignore_case
:
if
ignore_case
:
if
value
.
lower
()
in
map
(
string
.
lower
,
filter
(
lambda
x
:
isinstance
(
x
,
(
str
,
unicode
)),
object_attr
.
values
())):
if
not
isinstance
(
value
,
string_types
):
return
False
if
value
.
lower
()
in
map
(
string
.
lower
,
map
(
str
,
object_attr
.
values
())):
return
True
return
True
else
:
else
:
if
value
in
object_attr
.
values
():
if
value
in
object_attr
.
values
():
...
...
apps/perms/models.py
浏览文件 @
a4dc27f0
...
@@ -55,7 +55,7 @@ class AssetPermission(models.Model):
...
@@ -55,7 +55,7 @@ class AssetPermission(models.Model):
return
[]
return
[]
def
get_granted_assets
(
self
):
def
get_granted_assets
(
self
):
return
list
(
se
lf
.
assets
.
all
()
or
[])
|
set
(
self
.
get_granted_asset_groups_member
(
))
return
list
(
se
t
(
self
.
assets
.
all
()
or
[])
|
set
(
self
.
get_granted_asset_groups_member
()
))
def
get_granted_asset_groups_member
(
self
):
def
get_granted_asset_groups_member
(
self
):
combine_assets
=
functools
.
partial
(
combine_seq
,
callback
=
AssetPermission
.
set_inherit
)
combine_assets
=
functools
.
partial
(
combine_seq
,
callback
=
AssetPermission
.
set_inherit
)
...
...
apps/perms/templates/perms/asset_permission_asset_list.html
浏览文件 @
a4dc27f0
...
@@ -28,6 +28,16 @@
...
@@ -28,6 +28,16 @@
<a
href=
"{% url 'perms:asset-permission-asset-list' pk=asset_permission.id %}"
class=
"text-center"
>
<a
href=
"{% url 'perms:asset-permission-asset-list' pk=asset_permission.id %}"
class=
"text-center"
>
<i
class=
"fa fa-bar-chart-o"
></i>
{% trans 'Assets and asset gruops' %}
</a>
<i
class=
"fa fa-bar-chart-o"
></i>
{% trans 'Assets and asset gruops' %}
</a>
</li>
</li>
<form
id=
"search_form"
method=
"get"
action=
""
class=
"pull-right mail-search"
>
<div
class=
"input-group"
>
<input
type=
"text"
class=
"form-control input-sm"
name=
"keyword"
placeholder=
"Search"
value=
"{{ keyword }}"
>
<div
class=
"input-group-btn"
>
<button
id=
"search_btn"
type=
"submit"
class=
"btn btn-sm btn-primary"
>
搜索
</button>
</div>
</div>
</form>
</ul>
</ul>
</div>
</div>
<div
class=
"tab-content"
>
<div
class=
"tab-content"
>
...
@@ -61,13 +71,13 @@
...
@@ -61,13 +71,13 @@
</tr>
</tr>
</thead>
</thead>
<tbody>
<tbody>
{% for
user
in page_obj %}
{% for
asset
in page_obj %}
<tr>
<tr>
<td>
{{
user.
name }}
</td>
<td>
{{
asset.host
name }}
</td>
<td>
{{
user.username
}}
</td>
<td>
{{
asset.ip
}}
</td>
<td>
{{ user.
email
}}
</td>
<td>
{{ user.
port
}}
</td>
<td>
<td>
{% if
user.is_expired and user
.is_active %}
{% if
asset
.is_active %}
<i
class=
"fa fa-times text-danger"
></i>
<i
class=
"fa fa-times text-danger"
></i>
{% else %}
{% else %}
<i
class=
"fa fa-check text-navy"
></i>
<i
class=
"fa fa-check text-navy"
></i>
...
@@ -90,7 +100,7 @@
...
@@ -90,7 +100,7 @@
<div
class=
"col-sm-5"
style=
"padding-left: 0;padding-right: 0"
>
<div
class=
"col-sm-5"
style=
"padding-left: 0;padding-right: 0"
>
<div
class=
"panel panel-primary"
>
<div
class=
"panel panel-primary"
>
<div
class=
"panel-heading"
>
<div
class=
"panel-heading"
>
<i
class=
"fa fa-info-circle"
></i>
{% trans 'Add
user to asset
permission' %}
<i
class=
"fa fa-info-circle"
></i>
{% trans 'Add
asset to this
permission' %}
</div>
</div>
<div
class=
"panel-body"
>
<div
class=
"panel-body"
>
<table
class=
"table"
>
<table
class=
"table"
>
...
@@ -98,9 +108,9 @@
...
@@ -98,9 +108,9 @@
<form>
<form>
<tr
class=
"no-borders-tr"
>
<tr
class=
"no-borders-tr"
>
<td
colspan=
"2"
>
<td
colspan=
"2"
>
<select
data-placeholder=
"{% trans 'Select
user
' %}"
class=
"select2"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
<select
data-placeholder=
"{% trans 'Select
asset
' %}"
class=
"select2"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
{% for
user in users
_remain %}
{% for
asset in asset
_remain %}
<option
value=
"{{
user.id }}"
>
{{ user.name }}: {{ user.username
}}
</option>
<option
value=
"{{
asset.id }}"
>
{{ asset.hostname }}: {{ asset.ip
}}
</option>
{% endfor %}
{% endfor %}
</select>
</select>
</td>
</td>
...
@@ -118,7 +128,7 @@
...
@@ -118,7 +128,7 @@
<div
class=
"panel panel-info"
>
<div
class=
"panel panel-info"
>
<div
class=
"panel-heading"
>
<div
class=
"panel-heading"
>
<i
class=
"fa fa-info-circle"
></i>
{% trans 'Add
user group to asset
permission' %}
<i
class=
"fa fa-info-circle"
></i>
{% trans 'Add
asset group to this
permission' %}
</div>
</div>
<div
class=
"panel-body"
>
<div
class=
"panel-body"
>
<table
class=
"table group_edit"
>
<table
class=
"table group_edit"
>
...
@@ -126,9 +136,9 @@
...
@@ -126,9 +136,9 @@
<form>
<form>
<tr>
<tr>
<td
colspan=
"2"
class=
"no-borders"
>
<td
colspan=
"2"
class=
"no-borders"
>
<select
data-placeholder=
"{% trans 'Select
user
groups' %}"
class=
"select2"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
<select
data-placeholder=
"{% trans 'Select
asset
groups' %}"
class=
"select2"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
{% for
user_group in user
_groups_remain %}
{% for
asset_group in asset
_groups_remain %}
<option
value=
"{{
user_group.id }}"
id=
"opt_{{ user_group.id }}"
>
{{ user
_group.name }}
</option>
<option
value=
"{{
asset_group.id }}"
>
{{ asset
_group.name }}
</option>
{% endfor %}
{% endfor %}
</select>
</select>
</td>
</td>
...
@@ -140,9 +150,9 @@
...
@@ -140,9 +150,9 @@
</tr>
</tr>
</form>
</form>
{% for
user_group in user
_groups %}
{% for
asset_group in asset
_groups %}
<tr>
<tr>
<td
><b
class=
"bdg_user_group"
data-gid=
{{
user_group.id
}}
>
{{ user
_group.name }}
</b></td>
<td
><b
class=
"bdg_user_group"
data-gid=
{{
asset_group.id
}}
>
{{ asset
_group.name }}
</b></td>
<td>
<td>
<button
class=
"btn btn-danger btn-xs btn_delete_user_group"
type=
"button"
style=
"float: right;"
><i
class=
"fa fa-minus"
></i></button>
<button
class=
"btn btn-danger btn-xs btn_delete_user_group"
type=
"button"
style=
"float: right;"
><i
class=
"fa fa-minus"
></i></button>
</td>
</td>
...
...
apps/perms/templates/perms/asset_permission_user_list.html
浏览文件 @
a4dc27f0
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
</li>
</li>
<form
id=
"search_form"
method=
"get"
action=
""
class=
"pull-right mail-search"
>
<form
id=
"search_form"
method=
"get"
action=
""
class=
"pull-right mail-search"
>
<div
class=
"input-group"
>
<div
class=
"input-group"
>
<input
type=
"text"
class=
"form-control input-sm"
name=
"keyword"
placeholder=
"Search"
value=
""
>
<input
type=
"text"
class=
"form-control input-sm"
name=
"keyword"
placeholder=
"Search"
value=
"
{{ keyword }}
"
>
<div
class=
"input-group-btn"
>
<div
class=
"input-group-btn"
>
<button
id=
"search_btn"
type=
"submit"
class=
"btn btn-sm btn-primary"
>
<button
id=
"search_btn"
type=
"submit"
class=
"btn btn-sm btn-primary"
>
搜索
搜索
...
...
apps/perms/views.py
浏览文件 @
a4dc27f0
...
@@ -13,7 +13,7 @@ from django.contrib.messages.views import SuccessMessageMixin
...
@@ -13,7 +13,7 @@ from django.contrib.messages.views import SuccessMessageMixin
from
django.views.generic.detail
import
DetailView
,
SingleObjectMixin
from
django.views.generic.detail
import
DetailView
,
SingleObjectMixin
from
common.utils
import
search_object_attr
from
common.utils
import
search_object_attr
from
.hands
import
AdminUserRequiredMixin
,
User
,
UserGroup
,
SystemUser
from
.hands
import
AdminUserRequiredMixin
,
User
,
UserGroup
,
SystemUser
,
Asset
,
AssetGroup
from
.models
import
AssetPermission
from
.models
import
AssetPermission
from
.forms
import
AssetPermissionForm
from
.forms
import
AssetPermissionForm
...
@@ -28,7 +28,7 @@ class AssetPermissionListView(AdminUserRequiredMixin, ListView):
...
@@ -28,7 +28,7 @@ class AssetPermissionListView(AdminUserRequiredMixin, ListView):
context
=
{
context
=
{
'app'
:
_
(
'Perms'
),
'app'
:
_
(
'Perms'
),
'action'
:
_
(
'Asset permission list'
),
'action'
:
_
(
'Asset permission list'
),
'keyword'
:
self
.
request
.
GET
.
get
(
'keyword'
,
''
)
'keyword'
:
self
.
keyword
,
}
}
kwargs
.
update
(
context
)
kwargs
.
update
(
context
)
return
super
(
AssetPermissionListView
,
self
).
get_context_data
(
**
kwargs
)
return
super
(
AssetPermissionListView
,
self
).
get_context_data
(
**
kwargs
)
...
@@ -40,16 +40,16 @@ class AssetPermissionListView(AdminUserRequiredMixin, ListView):
...
@@ -40,16 +40,16 @@ class AssetPermissionListView(AdminUserRequiredMixin, ListView):
self
.
sort
=
sort
=
self
.
request
.
GET
.
get
(
'sort'
,
'-date_created'
)
self
.
sort
=
sort
=
self
.
request
.
GET
.
get
(
'sort'
,
'-date_created'
)
if
keyword
:
if
keyword
:
self
.
queryset
=
self
.
queryset
.
filter
(
Q
(
users__name__
i
contains
=
keyword
)
|
self
.
queryset
=
self
.
queryset
.
filter
(
Q
(
users__name__contains
=
keyword
)
|
Q
(
users__username__
i
contains
=
keyword
)
|
Q
(
users__username__contains
=
keyword
)
|
Q
(
user_groups__name__
i
contains
=
keyword
)
|
Q
(
user_groups__name__contains
=
keyword
)
|
Q
(
assets__ip__
i
contains
=
keyword
)
|
Q
(
assets__ip__contains
=
keyword
)
|
Q
(
assets__hostname__
i
contains
=
keyword
)
|
Q
(
assets__hostname__contains
=
keyword
)
|
Q
(
system_users__username_icontains
=
keyword
)
|
Q
(
system_users__username_
_
icontains
=
keyword
)
|
Q
(
system_users__name_icontains
=
keyword
)
|
Q
(
system_users__name_
_
icontains
=
keyword
)
|
Q
(
asset_groups__name__icontains
=
keyword
)
|
Q
(
asset_groups__name__icontains
=
keyword
)
|
Q
(
comment__icontains
=
keyword
)
)
Q
(
comment__icontains
=
keyword
)
|
Q
(
name__icontains
=
keyword
)).
distinct
()
if
sort
:
if
sort
:
self
.
queryset
=
self
.
queryset
.
order_by
(
sort
)
self
.
queryset
=
self
.
queryset
.
order_by
(
sort
)
return
self
.
queryset
return
self
.
queryset
...
@@ -126,32 +126,64 @@ class AssetPermissionUserListView(AdminUserRequiredMixin, SingleObjectMixin, Lis
...
@@ -126,32 +126,64 @@ class AssetPermissionUserListView(AdminUserRequiredMixin, SingleObjectMixin, Lis
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
object
=
self
.
get_object
(
queryset
=
AssetPermission
.
objects
.
all
())
self
.
object
=
self
.
get_object
(
queryset
=
AssetPermission
.
objects
.
all
())
self
.
keyword
=
keyword
=
self
.
request
.
GET
.
get
(
'keyword'
,
''
)
self
.
keyword
=
self
.
request
.
GET
.
get
(
'keyword'
,
''
)
return
super
(
AssetPermissionUserListView
,
self
).
get
(
request
,
*
args
,
**
kwargs
)
return
super
(
AssetPermissionUserListView
,
self
).
get
(
request
,
*
args
,
**
kwargs
)
def
get_queryset
(
self
):
def
get_queryset
(
self
):
print
(
self
.
keyword
)
queryset
=
self
.
object
.
get_granted_users
()
queryset
=
self
.
object
.
get_granted_users
()
if
self
.
keyword
:
if
self
.
keyword
:
search_func
=
functools
.
partial
(
search_object_attr
,
value
=
self
.
keyword
,
search_func
=
functools
.
partial
(
search_object_attr
,
value
=
self
.
keyword
,
attr_list
=
[
'
name'
,
'user
name'
,
'email'
],
attr_list
=
[
'
username'
,
'
name'
,
'email'
],
ignore_case
=
True
)
ignore_case
=
True
)
queryset
=
filter
(
search_func
,
queryset
[:]
)
queryset
=
filter
(
search_func
,
queryset
)
return
queryset
return
queryset
def
get_context_data
(
self
,
**
kwargs
):
def
get_context_data
(
self
,
**
kwargs
):
users_granted
=
self
.
get_queryset
()
user_groups_granted
=
self
.
object
.
user_groups
.
all
()
context
=
{
context
=
{
'app'
:
_
(
'Perms'
),
'app'
:
_
(
'Perms'
),
'action'
:
_
(
'Asset permission user list'
),
'action'
:
_
(
'Asset permission user list'
),
'users_remain'
:
[
user
for
user
in
User
.
objects
.
all
()
if
user
not
in
self
.
get_queryset
()
],
'users_remain'
:
[
user
for
user
in
User
.
objects
.
all
()
if
user
not
in
users_granted
],
'user_groups'
:
self
.
object
.
user_groups
.
all
(),
'user_groups'
:
self
.
object
.
user_groups
.
all
(),
'user_groups_remain'
:
[
user_group
for
user_group
in
UserGroup
.
objects
.
all
()
'user_groups_remain'
:
[
user_group
for
user_group
in
UserGroup
.
objects
.
all
()
if
user_group
not
in
self
.
object
.
user_groups
.
all
()]
if
user_group
not
in
user_groups_granted
],
'keyword'
:
self
.
keyword
,
}
}
kwargs
.
update
(
context
)
kwargs
.
update
(
context
)
return
super
(
AssetPermissionUserListView
,
self
).
get_context_data
(
**
kwargs
)
return
super
(
AssetPermissionUserListView
,
self
).
get_context_data
(
**
kwargs
)
class
AssetPermissionAssetListView
(
AdminUserRequiredMixin
,
ListView
):
class
AssetPermissionAssetListView
(
AdminUserRequiredMixin
,
SingleObjectMixin
,
ListView
):
pass
template_name
=
'perms/asset_permission_asset_list.html'
context_object_name
=
'asset_permission'
paginate_by
=
settings
.
CONFIG
.
DISPLAY_PER_PAGE
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
object
=
self
.
get_object
(
queryset
=
AssetPermission
.
objects
.
all
())
self
.
keyword
=
self
.
request
.
GET
.
get
(
'keyword'
,
''
)
return
super
(
AssetPermissionAssetListView
,
self
).
get
(
request
,
*
args
,
**
kwargs
)
def
get_queryset
(
self
):
queryset
=
self
.
object
.
get_granted_assets
()
if
self
.
keyword
:
search_func
=
functools
.
partial
(
search_object_attr
,
value
=
self
.
keyword
,
attr_list
=
[
'hostname'
,
'ip'
],
ignore_case
=
True
)
queryset
=
filter
(
search_func
,
queryset
)
return
queryset
def
get_context_data
(
self
,
**
kwargs
):
assets_granted
=
self
.
get_queryset
()
asset_groups_granted
=
self
.
object
.
user_groups
.
all
()
context
=
{
'app'
:
_
(
'Perms'
),
'action'
:
_
(
'Asset permission asset list'
),
'assets_remain'
:
(
asset
for
asset
in
Asset
.
objects
.
all
()
if
asset
not
in
assets_granted
),
'asset_groups'
:
self
.
object
.
asset_groups
.
all
(),
'asset_groups_remain'
:
[
asset_group
for
asset_group
in
AssetGroup
.
objects
.
all
()
if
asset_group
not
in
asset_groups_granted
],
'keyword'
:
self
.
keyword
,
}
kwargs
.
update
(
context
)
return
super
(
AssetPermissionAssetListView
,
self
).
get_context_data
(
**
kwargs
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录