Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
J
jumpserver
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ops
jumpserver
Commits
8b3b517b
Commit
8b3b517b
authored
Apr 11, 2018
by
ibuler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Update] 修改授权规则详情列表页面
parent
7fc2ef00
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
265 additions
and
67 deletions
+265
-67
__init__.py
apps/__init__.py
+1
-1
asset.py
apps/assets/models/asset.py
+1
-1
user.py
apps/assets/models/user.py
+1
-1
django.mo
apps/i18n/zh/LC_MESSAGES/django.mo
+0
-0
django.po
apps/i18n/zh/LC_MESSAGES/django.po
+0
-0
api.py
apps/perms/api.py
+75
-1
forms.py
apps/perms/forms.py
+13
-0
models.py
apps/perms/models.py
+17
-1
asset_permission_asset.html
apps/perms/templates/perms/asset_permission_asset.html
+19
-19
asset_permission_detail.html
apps/perms/templates/perms/asset_permission_detail.html
+25
-21
asset_permission_user.html
apps/perms/templates/perms/asset_permission_user.html
+3
-3
api_urls.py
apps/perms/urls/api_urls.py
+42
-12
views_urls.py
apps/perms/urls/views_urls.py
+2
-2
views.py
apps/perms/views.py
+65
-4
user.py
apps/users/models/user.py
+1
-1
No files found.
apps/__init__.py
View file @
8b3b517b
...
...
@@ -2,4 +2,4 @@
# -*- coding: utf-8 -*-
#
__version__
=
"1.
0
.0"
__version__
=
"1.
3
.0"
apps/assets/models/asset.py
View file @
8b3b517b
...
...
@@ -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
):
...
...
apps/assets/models/user.py
View file @
8b3b517b
...
...
@@ -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
{
...
...
apps/i18n/zh/LC_MESSAGES/django.mo
View file @
8b3b517b
No preview for this file type
apps/i18n/zh/LC_MESSAGES/django.po
View file @
8b3b517b
This diff is collapsed.
Click to expand it.
apps/perms/api.py
View file @
8b3b517b
...
...
@@ -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
})
apps/perms/forms.py
View file @
8b3b517b
...
...
@@ -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
=
(
...
...
apps/perms/models.py
View file @
8b3b517b
...
...
@@ -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
)
...
...
apps/perms/templates/perms/asset_permission_asset.html
View file @
8b3b517b
...
...
@@ -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 group
s' %}"
class=
"select2 group"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
{% for
asset_group in asset_group
s_remain %}
<option
value=
"{{
asset_group.id }}"
id=
"opt_{{ asset_group.id }}"
>
{{ asset_group.nam
e }}
</option>
<select
data-placeholder=
"{% trans 'Select
node
s' %}"
class=
"select2 group"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
{% for
node in node
s_remain %}
<option
value=
"{{
node.id }}"
id=
"opt_{{ node.id }}"
>
{{ node.valu
e }}
</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.nam
e }}
</b></td>
<td
><b
class=
"bdg_user_group"
data-gid=
{{
node
.
id
}}
>
{{ node.valu
e }}
</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
update
Group
(
group
s
)
{
function
update
Nodes
(
node
s
)
{
var
the_url
=
"{% url 'api-perms:asset-permission-detail' pk=asset_permission.id %}"
;
var
body
=
{
asset_groups
:
group
s
nodes
:
node
s
};
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
group
s
=
$
(
'.bdg_group'
).
map
(
function
()
{
var
node
s
=
$
(
'.bdg_group'
).
map
(
function
()
{
return
$
(
this
).
data
(
'gid'
);
}).
get
();
$
.
map
(
jumpserver
.
nodes_selected
,
function
(
group_name
,
index
)
{
group
s
.
push
(
index
);
node
s
.
push
(
index
);
$
(
'#opt_'
+
index
).
remove
();
$
(
'.group_edit tbody'
).
append
(
'<tr>'
+
...
...
@@ -251,17 +251,17 @@ $(document).ready(function () {
)
});
update
Group
(
group
s
);
update
Nodes
(
node
s
);
})
.
on
(
'click'
,
'.btn-remove-
group
'
,
function
()
{
.
on
(
'click'
,
'.btn-remove-
node
'
,
function
()
{
var
$this
=
$
(
this
);
var
$tr
=
$this
.
closest
(
'tr'
);
var
group
s
=
$
(
'.bdg_group'
).
map
(
function
()
{
var
node
s
=
$
(
'.bdg_group'
).
map
(
function
()
{
if
(
$
(
this
).
data
(
'gid'
)
!==
$this
.
data
(
'gid'
)){
return
$
(
this
).
data
(
'gid'
);
}
}).
get
();
update
Group
(
group
s
);
update
Nodes
(
node
s
);
$tr
.
remove
()
})
</script>
...
...
apps/perms/templates/perms/asset_permission_detail.html
View file @
8b3b517b
...
...
@@ -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_group
s.count }}
</b></td>
<td>
{% trans '
Node
count' %}:
</td>
<td><b>
{{
object.node
s.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
...
...
apps/perms/templates/perms/asset_permission_user.html
View file @
8b3b517b
...
...
@@ -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.i
s_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.i
nherit
%} 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>
...
...
apps/perms/urls/api_urls.py
View file @
8b3b517b
...
...
@@ -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'
),
...
...
apps/perms/urls/views_urls.py
View file @
8b3b517b
...
...
@@ -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'
),
]
apps/perms/views.py
View file @
8b3b517b
...
...
@@ -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
)
\ No newline at end of file
apps/users/models/user.py
View file @
8b3b517b
...
...
@@ -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
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment