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
...
...
apps/common/utils.py
浏览文件 @
a4dc27f0
...
...
@@ -2,6 +2,7 @@
#
from
__future__
import
unicode_literals
from
six
import
string_types
from
itertools
import
chain
import
string
...
...
@@ -52,30 +53,43 @@ def combine_seq(s1, s2, callback=None):
seq
=
chain
(
s1
,
s2
)
if
callback
:
seq
=
map
(
callback
,
seq
)
return
seq
def
search_object_attr
(
obj
,
value
=
''
,
attr_list
=
None
,
ignore_case
=
False
):
try
:
object_attr
=
obj
.
__dict__
except
AttributeError
:
return
False
"""It's provide a method to search a object attribute equal some value
if
not
isinstance
(
value
,
str
):
return
False
If object some attribute equal :param: value, return True else 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
==
''
:
return
True
try
:
object_attr
=
obj
.
__dict__
except
AttributeError
:
return
False
if
attr_list
is
not
None
:
new_object_attr
=
{}
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
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
else
:
if
value
in
object_attr
.
values
():
...
...
apps/perms/models.py
浏览文件 @
a4dc27f0
...
...
@@ -55,7 +55,7 @@ class AssetPermission(models.Model):
return
[]
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
):
combine_assets
=
functools
.
partial
(
combine_seq
,
callback
=
AssetPermission
.
set_inherit
)
...
...
apps/perms/templates/perms/asset_permission_asset_list.html
浏览文件 @
a4dc27f0
...
...
@@ -28,6 +28,16 @@
<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>
</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>
</div>
<div
class=
"tab-content"
>
...
...
@@ -61,13 +71,13 @@
</tr>
</thead>
<tbody>
{% for
user
in page_obj %}
{% for
asset
in page_obj %}
<tr>
<td>
{{
user.
name }}
</td>
<td>
{{
user.username
}}
</td>
<td>
{{ user.
email
}}
</td>
<td>
{{
asset.host
name }}
</td>
<td>
{{
asset.ip
}}
</td>
<td>
{{ user.
port
}}
</td>
<td>
{% if
user.is_expired and user
.is_active %}
{% if
asset
.is_active %}
<i
class=
"fa fa-times text-danger"
></i>
{% else %}
<i
class=
"fa fa-check text-navy"
></i>
...
...
@@ -90,7 +100,7 @@
<div
class=
"col-sm-5"
style=
"padding-left: 0;padding-right: 0"
>
<div
class=
"panel panel-primary"
>
<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
class=
"panel-body"
>
<table
class=
"table"
>
...
...
@@ -98,9 +108,9 @@
<form>
<tr
class=
"no-borders-tr"
>
<td
colspan=
"2"
>
<select
data-placeholder=
"{% trans 'Select
user
' %}"
class=
"select2"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
{% for
user in users
_remain %}
<option
value=
"{{
user.id }}"
>
{{ user.name }}: {{ user.username
}}
</option>
<select
data-placeholder=
"{% trans 'Select
asset
' %}"
class=
"select2"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
{% for
asset in asset
_remain %}
<option
value=
"{{
asset.id }}"
>
{{ asset.hostname }}: {{ asset.ip
}}
</option>
{% endfor %}
</select>
</td>
...
...
@@ -118,7 +128,7 @@
<div
class=
"panel panel-info"
>
<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
class=
"panel-body"
>
<table
class=
"table group_edit"
>
...
...
@@ -126,9 +136,9 @@
<form>
<tr>
<td
colspan=
"2"
class=
"no-borders"
>
<select
data-placeholder=
"{% trans 'Select
user
groups' %}"
class=
"select2"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
{% for
user_group in user
_groups_remain %}
<option
value=
"{{
user_group.id }}"
id=
"opt_{{ user_group.id }}"
>
{{ user
_group.name }}
</option>
<select
data-placeholder=
"{% trans 'Select
asset
groups' %}"
class=
"select2"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
{% for
asset_group in asset
_groups_remain %}
<option
value=
"{{
asset_group.id }}"
>
{{ asset
_group.name }}
</option>
{% endfor %}
</select>
</td>
...
...
@@ -140,9 +150,9 @@
</tr>
</form>
{% for
user_group in user
_groups %}
{% for
asset_group in asset
_groups %}
<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>
<button
class=
"btn btn-danger btn-xs btn_delete_user_group"
type=
"button"
style=
"float: right;"
><i
class=
"fa fa-minus"
></i></button>
</td>
...
...
apps/perms/templates/perms/asset_permission_user_list.html
浏览文件 @
a4dc27f0
...
...
@@ -30,7 +30,7 @@
</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=
""
>
<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"
>
搜索
...
...
apps/perms/views.py
浏览文件 @
a4dc27f0
...
...
@@ -13,7 +13,7 @@ from django.contrib.messages.views import SuccessMessageMixin
from
django.views.generic.detail
import
DetailView
,
SingleObjectMixin
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
.forms
import
AssetPermissionForm
...
...
@@ -28,7 +28,7 @@ class AssetPermissionListView(AdminUserRequiredMixin, ListView):
context
=
{
'app'
:
_
(
'Perms'
),
'action'
:
_
(
'Asset permission list'
),
'keyword'
:
self
.
request
.
GET
.
get
(
'keyword'
,
''
)
'keyword'
:
self
.
keyword
,
}
kwargs
.
update
(
context
)
return
super
(
AssetPermissionListView
,
self
).
get_context_data
(
**
kwargs
)
...
...
@@ -40,16 +40,16 @@ class AssetPermissionListView(AdminUserRequiredMixin, ListView):
self
.
sort
=
sort
=
self
.
request
.
GET
.
get
(
'sort'
,
'-date_created'
)
if
keyword
:
self
.
queryset
=
self
.
queryset
.
filter
(
Q
(
users__name__
i
contains
=
keyword
)
|
Q
(
users__username__
i
contains
=
keyword
)
|
Q
(
user_groups__name__
i
contains
=
keyword
)
|
Q
(
assets__ip__
i
contains
=
keyword
)
|
Q
(
assets__hostname__
i
contains
=
keyword
)
|
Q
(
system_users__username_icontains
=
keyword
)
|
Q
(
system_users__name_icontains
=
keyword
)
|
self
.
queryset
=
self
.
queryset
.
filter
(
Q
(
users__name__contains
=
keyword
)
|
Q
(
users__username__contains
=
keyword
)
|
Q
(
user_groups__name__contains
=
keyword
)
|
Q
(
assets__ip__contains
=
keyword
)
|
Q
(
assets__hostname__contains
=
keyword
)
|
Q
(
system_users__username_
_
icontains
=
keyword
)
|
Q
(
system_users__name_
_
icontains
=
keyword
)
|
Q
(
asset_groups__name__icontains
=
keyword
)
|
Q
(
comment__icontains
=
keyword
)
)
Q
(
comment__icontains
=
keyword
)
|
Q
(
name__icontains
=
keyword
)).
distinct
()
if
sort
:
self
.
queryset
=
self
.
queryset
.
order_by
(
sort
)
return
self
.
queryset
...
...
@@ -126,32 +126,64 @@ class AssetPermissionUserListView(AdminUserRequiredMixin, SingleObjectMixin, Lis
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
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
)
def
get_queryset
(
self
):
print
(
self
.
keyword
)
queryset
=
self
.
object
.
get_granted_users
()
if
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
)
queryset
=
filter
(
search_func
,
queryset
[:]
)
queryset
=
filter
(
search_func
,
queryset
)
return
queryset
def
get_context_data
(
self
,
**
kwargs
):
users_granted
=
self
.
get_queryset
()
user_groups_granted
=
self
.
object
.
user_groups
.
all
()
context
=
{
'app'
:
_
(
'Perms'
),
'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_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
)
return
super
(
AssetPermissionUserListView
,
self
).
get_context_data
(
**
kwargs
)
class
AssetPermissionAssetListView
(
AdminUserRequiredMixin
,
ListView
):
pass
class
AssetPermissionAssetListView
(
AdminUserRequiredMixin
,
SingleObjectMixin
,
ListView
):
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录