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
2583c0b2
Commit
2583c0b2
authored
May 10, 2018
by
BaiJiangjie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[Bugfix] 资产树节点,取消model value unique,并添加唯一性校验,修改新增节点计数器规则
parent
3af01d6a
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
50 additions
and
20 deletions
+50
-20
node.py
apps/assets/api/node.py
+21
-8
node.py
apps/assets/models/node.py
+5
-2
node.py
apps/assets/serializers/node.py
+9
-0
_asset_list_modal.html
apps/assets/templates/assets/_asset_list_modal.html
+4
-1
asset_detail.html
apps/assets/templates/assets/asset_detail.html
+2
-2
asset_list.html
apps/assets/templates/assets/asset_list.html
+8
-6
user_granted_asset.html
apps/users/templates/users/user_granted_asset.html
+1
-1
No files found.
apps/assets/api/node.py
View file @
2583c0b2
...
...
@@ -45,16 +45,15 @@ class NodeViewSet(BulkModelViewSet):
def
get_serializer_class
(
self
):
show_current_asset
=
self
.
request
.
query_params
.
get
(
'show_current_asset'
)
print
(
show_current_asset
)
if
show_current_asset
:
return
serializers
.
NodeCurrentSerializer
else
:
return
serializers
.
NodeSerializer
def
perform_create
(
self
,
serializer
):
child_key
=
Node
.
root
()
.
get_next_child_key
()
serializer
.
validated_data
[
"key"
]
=
child_key
serializer
.
save
()
#
def perform_create(self, serializer):
#
child_key = Node.root().get_next_child_key()
#
serializer.validated_data["key"] = child_key
#
serializer.save()
class
NodeWithAssetsApi
(
generics
.
ListAPIView
):
...
...
@@ -91,16 +90,27 @@ class NodeChildrenApi(mixins.ListModelMixin, generics.CreateAPIView):
serializer_class
=
serializers
.
NodeSerializer
instance
=
None
def
counter
(
self
):
values
=
[
child
.
value
[
child
.
value
.
rfind
(
' '
):]
for
child
in
self
.
get_object
()
.
get_children
()
if
child
.
value
.
startswith
(
"新节点 "
)
]
values
=
[
int
(
value
)
for
value
in
values
if
value
.
strip
()
.
isdigit
()]
count
=
max
(
values
)
+
1
if
values
else
1
return
count
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
if
not
request
.
data
.
get
(
"value"
):
request
.
data
[
"value"
]
=
_
(
"New node {}"
)
.
format
(
Node
.
root
()
.
get_next_child_key
()
.
split
(
":"
)[
-
1
]
)
request
.
data
[
"value"
]
=
_
(
"New node {}"
)
.
format
(
self
.
counter
())
return
super
()
.
post
(
request
,
*
args
,
**
kwargs
)
def
create
(
self
,
request
,
*
args
,
**
kwargs
):
instance
=
self
.
get_object
()
value
=
request
.
data
.
get
(
"value"
)
values
=
[
child
.
value
for
child
in
instance
.
get_children
()]
if
value
in
values
:
raise
AssertionError
(
'The same level node name cannot be the same'
)
node
=
instance
.
create_child
(
value
=
value
)
return
Response
(
{
"id"
:
node
.
id
,
"key"
:
node
.
key
,
"value"
:
node
.
value
},
...
...
@@ -199,6 +209,9 @@ class NodeRemoveAssetsApi(generics.UpdateAPIView):
instance
=
self
.
get_object
()
if
instance
!=
Node
.
root
():
instance
.
assets
.
remove
(
*
tuple
(
assets
))
else
:
assets
=
[
asset
for
asset
in
assets
if
asset
.
nodes
.
count
()
>
1
]
instance
.
assets
.
remove
(
*
tuple
(
assets
))
class
NodeReplaceAssetsApi
(
generics
.
UpdateAPIView
):
...
...
apps/assets/models/node.py
View file @
2583c0b2
...
...
@@ -12,7 +12,10 @@ __all__ = ['Node']
class
Node
(
models
.
Model
):
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"
))
# value = models.CharField(
# max_length=128, unique=True, verbose_name=_("Value")
# )
value
=
models
.
CharField
(
max_length
=
128
,
verbose_name
=
_
(
"Value"
))
child_mark
=
models
.
IntegerField
(
default
=
0
)
date_create
=
models
.
DateTimeField
(
auto_now_add
=
True
)
...
...
@@ -48,7 +51,7 @@ class Node(models.Model):
return
child
def
get_children
(
self
):
return
self
.
__class__
.
objects
.
filter
(
key__regex
=
r'{}:[0-9]+$'
.
format
(
self
.
key
))
return
self
.
__class__
.
objects
.
filter
(
key__regex
=
r'
^
{}:[0-9]+$'
.
format
(
self
.
key
))
def
get_all_children
(
self
):
return
self
.
__class__
.
objects
.
filter
(
key__startswith
=
'{}:'
.
format
(
self
.
key
))
...
...
apps/assets/serializers/node.py
View file @
2583c0b2
...
...
@@ -51,6 +51,15 @@ class NodeSerializer(serializers.ModelSerializer):
fields
=
[
'id'
,
'key'
,
'value'
,
'parent'
,
'assets_amount'
,
'is_node'
]
list_serializer_class
=
BulkListSerializer
def
update
(
self
,
instance
,
validated_data
):
value
=
validated_data
.
get
(
'value'
)
if
not
instance
.
is_root
():
children
=
instance
.
parent
.
get_children
()
.
exclude
(
key
=
instance
.
key
)
values
=
[
child
.
value
for
child
in
children
]
if
value
in
values
:
raise
AssertionError
(
'The same level node name cannot be the same'
)
return
super
()
.
update
(
instance
,
validated_data
)
@staticmethod
def
get_parent
(
obj
):
return
obj
.
parent
.
id
...
...
apps/assets/templates/assets/_asset_list_modal.html
View file @
2583c0b2
...
...
@@ -98,7 +98,10 @@ function initTree2() {
$
.
get
(
"{% url 'api-assets:node-list' %}"
,
function
(
data
,
status
){
$
.
each
(
data
,
function
(
index
,
value
)
{
value
[
"pId"
]
=
value
[
"parent"
];
value
[
"open"
]
=
true
;
{
#
value
[
"open"
]
=
true
;
#
}
if
(
value
[
"key"
]
===
"0"
)
{
value
[
"open"
]
=
true
;
}
value
[
"name"
]
=
value
[
"value"
]
+
' ('
+
value
[
'assets_amount'
]
+
')'
;
value
[
'value'
]
=
value
[
'value'
];
});
...
...
apps/assets/templates/assets/asset_detail.html
View file @
2583c0b2
...
...
@@ -190,7 +190,7 @@
<td
colspan=
"2"
class=
"no-borders"
>
<select
data-placeholder=
"{% trans 'Nodes' %}"
id=
"groups_selected"
class=
"select2 groups"
style=
"width: 100%"
multiple=
""
tabindex=
"4"
>
{% for node in nodes_remain %}
<option
value=
"{{ node.id }}"
id=
"opt_{{ node.id }}"
>
{{ node
.name
}}
</option>
<option
value=
"{{ node.id }}"
id=
"opt_{{ node.id }}"
>
{{ node }}
</option>
{% endfor %}
</select>
</td>
...
...
@@ -204,7 +204,7 @@
{% for node in asset.nodes.all %}
<tr>
<td
><b
class=
"bdg_node"
data-gid=
{{
node
.
id
}}
>
{{ node
.name
}}
</b></td>
<td
><b
class=
"bdg_node"
data-gid=
{{
node
.
id
}}
>
{{ node }}
</b></td>
<td>
<button
class=
"btn btn-danger pull-right btn-xs btn-leave-node"
type=
"button"
><i
class=
"fa fa-minus"
></i></button>
</td>
...
...
apps/assets/templates/assets/asset_list.html
View file @
2583c0b2
...
...
@@ -211,6 +211,8 @@ function addTreeNode() {
};
newNode
.
checked
=
zTree
.
getSelectedNodes
()[
0
].
checked
;
zTree
.
addNodes
(
parentNode
,
0
,
newNode
);
var
node
=
zTree
.
getNodeByParam
(
'id'
,
newNode
.
id
,
parentNode
)
zTree
.
editName
(
node
);
}
else
{
alert
(
"{% trans 'Create node failed' %}"
)
}
...
...
@@ -241,9 +243,9 @@ function removeTreeNode() {
function
editTreeNode
()
{
hideRMenu
();
var
current_node
=
zTree
.
getSelectedNodes
()[
0
];
if
(
!
current_node
){
return
var
current_node
=
zTree
.
getSelectedNodes
()[
0
];
if
(
!
current_node
){
return
}
if
(
current_node
.
value
)
{
current_node
.
name
=
current_node
.
value
;
...
...
@@ -398,9 +400,9 @@ function initTree() {
$
.
get
(
"{% url 'api-assets:node-list' %}"
,
query_params
,
function
(
data
,
status
){
$
.
each
(
data
,
function
(
index
,
value
)
{
value
[
"pId"
]
=
value
[
"parent"
];
{
#
if
(
value
[
"key"
]
===
"0"
)
{
#
}
value
[
"open"
]
=
true
;
{
#
}
#
}
if
(
value
[
"key"
]
===
"0"
)
{
value
[
"open"
]
=
true
;
}
value
[
"name"
]
=
value
[
"value"
]
+
' ('
+
value
[
'assets_amount'
]
+
')'
;
value
[
'value'
]
=
value
[
'value'
];
});
...
...
apps/users/templates/users/user_granted_asset.html
View file @
2583c0b2
...
...
@@ -68,7 +68,7 @@ var asset_table;
function
initTable
()
{
if
(
inited
){
return
return
asset_table
}
else
{
inited
=
true
;
}
...
...
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