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
dbdb8a58
Commit
dbdb8a58
authored
Jan 06, 2017
by
右书僮
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
资产相关API及Web
parent
4c062570
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
963 additions
and
166 deletions
+963
-166
api.py
apps/assets/api.py
+61
-10
forms.py
apps/assets/forms.py
+11
-3
models.py
apps/assets/models.py
+15
-13
serializers.py
apps/assets/serializers.py
+65
-4
_asset_bulk_update_modal.html
apps/assets/templates/assets/_asset_bulk_update_modal.html
+28
-24
_asset_group_bulk_update_modal.html
...sets/templates/assets/_asset_group_bulk_update_modal.html
+43
-0
admin_user_detail.html
apps/assets/templates/assets/admin_user_detail.html
+0
-0
admin_user_list.html
apps/assets/templates/assets/admin_user_list.html
+76
-0
asset_detail.html
apps/assets/templates/assets/asset_detail.html
+4
-5
asset_group_detail.html
apps/assets/templates/assets/asset_group_detail.html
+0
-0
asset_group_list.html
apps/assets/templates/assets/asset_group_list.html
+124
-2
asset_list.html
apps/assets/templates/assets/asset_list.html
+146
-10
asset_tag_detail.html
apps/assets/templates/assets/asset_tag_detail.html
+0
-0
asset_tags_list.html
apps/assets/templates/assets/asset_tags_list.html
+115
-44
idc_assets.html
apps/assets/templates/assets/idc_assets.html
+0
-0
idc_detail.html
apps/assets/templates/assets/idc_detail.html
+46
-24
idc_list.html
apps/assets/templates/assets/idc_list.html
+76
-12
system_user_asset.html
apps/assets/templates/assets/system_user_asset.html
+0
-0
system_user_list.html
apps/assets/templates/assets/system_user_list.html
+78
-1
api_urls.py
apps/assets/urls/api_urls.py
+26
-1
views.py
apps/assets/views.py
+49
-13
No files found.
apps/assets/api.py
View file @
dbdb8a58
...
...
@@ -3,67 +3,107 @@
from
rest_framework
import
viewsets
,
generics
,
mixins
from
rest_framework.response
import
Response
from
rest_framework.views
import
APIView
from
rest_framework_bulk
import
BulkModelViewSet
,
BulkDestroyAPIView
from
django_filters.rest_framework
import
DjangoFilterBackend
from
rest_framework_bulk
import
BulkListSerializer
,
BulkSerializerMixin
,
ListBulkCreateUpdateDestroyAPIView
from
django.shortcuts
import
get_object_or_404
from
common.mixins
import
IDInFilterMixin
from
common.utils
import
get_object_or_none
,
signer
from
.hands
import
IsSuperUserOrTerminalUser
,
IsSuperUser
from
.models
import
AssetGroup
,
Asset
,
IDC
,
SystemUser
,
AdminUser
from
.models
import
AssetGroup
,
Asset
,
IDC
,
SystemUser
,
AdminUser
,
Tag
from
.
import
serializers
class
AssetViewSet
(
IDInFilterMixin
,
viewsets
.
ModelViewSet
):
class
AssetViewSet
(
IDInFilterMixin
,
Bulk
ModelViewSet
):
"""API endpoint that allows Asset to be viewed or edited."""
queryset
=
Asset
.
objects
.
all
()
serializer_class
=
serializers
.
AssetSerializer
filter_backends
=
(
DjangoFilterBackend
,)
filter_fields
=
(
'id'
,
'ip'
,
'hostname'
)
permission_classes
=
(
IsSuperUser
,)
def
get_queryset
(
self
):
queryset
=
super
(
AssetViewSet
,
self
)
.
get_queryset
()
idc_id
=
self
.
request
.
query_params
.
get
(
'idc_id'
,
''
)
tags_id
=
self
.
request
.
query_params
.
get
(
'tag_id'
,
''
)
system_users_id
=
self
.
request
.
query_params
.
get
(
'system_user_id'
,
''
)
asset_group_id
=
self
.
request
.
query_params
.
get
(
'asset_group_id'
,
''
)
admin_user_id
=
self
.
request
.
query_params
.
get
(
'admin_user_id'
,
''
)
if
idc_id
:
queryset
=
queryset
.
filter
(
idc__id
=
idc_id
)
if
tags_id
:
queryset
=
queryset
.
filter
(
tags__id
=
tags_id
)
if
system_users_id
:
queryset
=
queryset
.
filter
(
system_users__id
=
system_users_id
)
if
admin_user_id
:
queryset
=
queryset
.
filter
(
admin_user__id
=
admin_user_id
)
if
asset_group_id
:
queryset
=
queryset
.
filter
(
groups__id
=
asset_group_id
)
return
queryset
class
AssetGroupViewSet
(
viewsets
.
ModelViewSet
):
""" API endpoint that allows AssetGroup to be viewed or edited.
some other comment
"""
class
AssetGroupViewSet
(
IDInFilterMixin
,
BulkModelViewSet
):
queryset
=
AssetGroup
.
objects
.
all
()
serializer_class
=
serializers
.
AssetGroupSerializer
permission_classes
=
(
IsSuperUser
,)
class
AssetUpdateGroupApi
(
generics
.
RetrieveUpdateAPIView
):
queryset
=
Asset
.
objects
.
all
()
serializer_class
=
serializers
.
AssetUpdateGroupSerializer
permission_classes
=
(
IsSuperUser
,)
class
IDCViewSet
(
viewsets
.
ModelViewSet
):
## update the asset group, and add or delete the asset to the group
class
AssetGroupUpdateApi
(
generics
.
RetrieveUpdateAPIView
):
queryset
=
AssetGroup
.
objects
.
all
()
serializer_class
=
serializers
.
AssetGroupUpdateSerializer
permission_classes
=
(
IsSuperUser
,)
## update the asset group, and add or delete the system_user to the group
class
AssetGroupUpdateSystemUserApi
(
generics
.
RetrieveUpdateAPIView
):
queryset
=
AssetGroup
.
objects
.
all
()
serializer_class
=
serializers
.
AssetGroupUpdateSystemUserSerializer
permission_classes
=
(
IsSuperUser
,)
## update the IDC, and add or delete the assets to the IDC
class
IDCupdateAssetsApi
(
generics
.
RetrieveUpdateAPIView
):
queryset
=
IDC
.
objects
.
all
()
serializer_class
=
serializers
.
IDCUpdateAssetsSerializer
permission_classes
=
(
IsSuperUser
,)
class
IDCViewSet
(
IDInFilterMixin
,
BulkModelViewSet
):
"""API endpoint that allows IDC to be viewed or edited."""
queryset
=
IDC
.
objects
.
all
()
serializer_class
=
serializers
.
IDCSerializer
permission_classes
=
(
IsSuperUser
,)
class
AdminUserViewSet
(
viewsets
.
ModelViewSet
):
class
AdminUserViewSet
(
IDInFilterMixin
,
Bulk
ModelViewSet
):
queryset
=
AdminUser
.
objects
.
all
()
serializer_class
=
serializers
.
AdminUserSerializer
permission_classes
=
(
IsSuperUser
,)
class
SystemUserViewSet
(
viewsets
.
ModelViewSet
):
class
SystemUserViewSet
(
IDInFilterMixin
,
BulkModelViewSet
):
queryset
=
SystemUser
.
objects
.
all
()
serializer_class
=
serializers
.
SystemUserSerializer
permission_classes
=
(
IsSuperUser
,)
class
SystemUserUpdateApi
(
generics
.
RetrieveUpdateAPIView
):
queryset
=
Asset
.
objects
.
all
()
serializer_class
=
serializers
.
AssetUpdateSystemUserSerializer
permission_classes
=
(
IsSuperUser
,)
class
SystemUserUpdateAssetsApi
(
generics
.
RetrieveUpdateAPIView
):
queryset
=
SystemUser
.
objects
.
all
()
serializer_class
=
serializers
.
SystemUserUpdateAssetsSerializer
permission_classes
=
(
IsSuperUser
,)
class
SystemUserUpdateAssetGroupApi
(
generics
.
RetrieveUpdateAPIView
):
queryset
=
SystemUser
.
objects
.
all
()
serializer_class
=
serializers
.
SystemUserUpdateAssetGroupSerializer
permission_classes
=
(
IsSuperUser
,)
# class IDCAssetsApi(generics.ListAPIView):
# model = IDC
...
...
@@ -115,3 +155,14 @@ class SystemUserAuthApi(APIView):
return
Response
({
'msg'
:
'error system user id or username'
},
status
=
401
)
class
TagViewSet
(
IDInFilterMixin
,
BulkModelViewSet
):
queryset
=
Tag
.
objects
.
all
()
serializer_class
=
serializers
.
TagSerializer
permission_classes
=
(
IsSuperUser
,)
## update the IDC, and add or delete the assets to the IDC
class
TagUpdateAssetsApi
(
generics
.
RetrieveUpdateAPIView
):
queryset
=
Tag
.
objects
.
all
()
serializer_class
=
serializers
.
TagUpdateAssetsSerializer
permission_classes
=
(
IsSuperUser
,)
apps/assets/forms.py
View file @
dbdb8a58
...
...
@@ -37,6 +37,14 @@ class AssetCreateForm(forms.ModelForm):
self
.
instance
.
tags
.
clear
()
self
.
instance
.
tags
.
add
(
*
tuple
(
tags
))
def
clean
(
self
):
clean_data
=
super
(
AssetCreateForm
,
self
)
.
clean
()
ip
=
clean_data
.
get
(
'ip'
)
port
=
clean_data
.
get
(
'port'
)
query
=
Asset
.
objects
.
filter
(
ip
=
ip
,
port
=
port
)
if
query
:
raise
forms
.
ValidationError
(
'this asset has exists.'
)
class
Meta
:
model
=
Asset
tags
=
forms
.
ModelMultipleChoiceField
(
queryset
=
Tag
.
objects
.
all
())
...
...
@@ -293,10 +301,10 @@ class AssetTagForm(forms.ModelForm):
super
(
AssetTagForm
,
self
)
.
__init__
(
*
args
,
**
kwargs
)
def
_save_m2m
(
self
):
super
(
AssetTagForm
,
self
)
.
_save_m2m
()
assets
=
self
.
cleaned_data
[
'assets'
]
self
.
instance
.
asset_set
.
clear
()
self
.
instance
.
asset_set
.
add
(
*
tuple
(
assets
))
self
.
instance
.
assets
.
clear
()
self
.
instance
.
assets
.
add
(
*
tuple
(
assets
))
super
(
AssetTagForm
,
self
)
.
_save_m2m
()
class
Meta
:
model
=
Tag
...
...
apps/assets/models.py
View file @
dbdb8a58
...
...
@@ -269,6 +269,19 @@ class AssetGroup(models.Model):
def
get_default_idc
():
return
IDC
.
initial
()
class
Tag
(
models
.
Model
):
name
=
models
.
CharField
(
max_length
=
64
,
unique
=
True
,
verbose_name
=
_
(
'Name'
))
created_time
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
_
(
'Create time'
))
created_by
=
models
.
CharField
(
max_length
=
32
,
null
=
True
,
blank
=
True
,
verbose_name
=
_
(
'Created by'
))
def
__unicode__
(
self
):
return
self
.
name
__str__
=
__unicode__
class
Meta
:
db_table
=
'tag'
class
Asset
(
models
.
Model
):
STATUS_CHOICES
=
(
...
...
@@ -320,7 +333,7 @@ class Asset(models.Model):
is_active
=
models
.
BooleanField
(
default
=
True
,
verbose_name
=
_
(
'Is active'
))
date_created
=
models
.
DateTimeField
(
auto_now_add
=
True
,
null
=
True
,
blank
=
True
,
verbose_name
=
_
(
'Date added'
))
comment
=
models
.
TextField
(
max_length
=
128
,
default
=
''
,
blank
=
True
,
verbose_name
=
_
(
'Comment'
))
tags
=
models
.
ManyToManyField
(
'Tag
'
,
blank
=
True
,
verbose_name
=
_
(
'Tags'
))
tags
=
models
.
ManyToManyField
(
Tag
,
related_name
=
'assets
'
,
blank
=
True
,
verbose_name
=
_
(
'Tags'
))
def
__unicode__
(
self
):
return
'
%(ip)
s:
%(port)
s'
%
{
'ip'
:
self
.
ip
,
'port'
:
self
.
port
}
...
...
@@ -339,7 +352,7 @@ class Asset(models.Model):
class
Meta
:
db_table
=
'asset'
unique_together
=
(
'ip'
,
'port'
)
#
unique_together = ('ip', 'port')
@classmethod
def
generate_fake
(
cls
,
count
=
100
):
...
...
@@ -365,18 +378,7 @@ class Asset(models.Model):
continue
class
Tag
(
models
.
Model
):
name
=
models
.
CharField
(
max_length
=
64
,
unique
=
True
,
verbose_name
=
_
(
'Name'
))
created_time
=
models
.
DateTimeField
(
auto_now_add
=
True
,
verbose_name
=
_
(
'Create time'
))
created_by
=
models
.
CharField
(
max_length
=
32
,
null
=
True
,
blank
=
True
,
verbose_name
=
_
(
'Created by'
))
def
__unicode__
(
self
):
return
self
.
name
__str__
=
__unicode__
class
Meta
:
db_table
=
'tag'
def
init_all_models
():
...
...
apps/assets/serializers.py
View file @
dbdb8a58
# -*- coding: utf-8 -*-
from
django.utils.translation
import
ugettext_lazy
as
_
from
rest_framework
import
viewsets
,
serializers
,
generics
from
.models
import
AssetGroup
,
Asset
,
IDC
,
AdminUser
,
SystemUser
from
.models
import
AssetGroup
,
Asset
,
IDC
,
AdminUser
,
SystemUser
,
Tag
from
common.mixins
import
IDInFilterMixin
from
rest_framework_bulk
import
BulkListSerializer
,
BulkSerializerMixin
class
AssetGroupSerializer
(
serializers
.
ModelSerializer
):
class
AssetGroupSerializer
(
BulkSerializerMixin
,
serializers
.
ModelSerializer
):
assets_amount
=
serializers
.
SerializerMethodField
()
# assets = serializers.PrimaryKeyRelatedField(many=True, read_only=True
)
assets
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
Asset
.
objects
.
all
()
)
class
Meta
:
model
=
AssetGroup
list_serializer_class
=
BulkListSerializer
@staticmethod
def
get_assets_amount
(
obj
):
...
...
@@ -31,7 +32,43 @@ class AssetUpdateSystemUserSerializer(serializers.ModelSerializer):
model
=
Asset
fields
=
[
'id'
,
'system_users'
]
## update the asset group, and add or delete the asset to the group
class
AssetGroupUpdateSerializer
(
serializers
.
ModelSerializer
):
assets
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
Asset
.
objects
.
all
())
class
Meta
:
model
=
AssetGroup
fields
=
[
'id'
,
'assets'
]
## update the asset group, and add or delete the system_user to the group
class
AssetGroupUpdateSystemUserSerializer
(
serializers
.
ModelSerializer
):
system_users
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
SystemUser
.
objects
.
all
())
class
Meta
:
model
=
AssetGroup
fields
=
[
'id'
,
'system_users'
]
## update the IDC, and add or delete the assets to the IDC
class
IDCUpdateAssetsSerializer
(
serializers
.
ModelSerializer
):
assets
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
Asset
.
objects
.
all
())
class
Meta
:
model
=
IDC
fields
=
[
'id'
,
'assets'
]
## tags API
class
TagSerializer
(
BulkSerializerMixin
,
serializers
.
ModelSerializer
):
assets_amount
=
serializers
.
SerializerMethodField
()
assets
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
Asset
.
objects
.
all
())
class
Meta
:
model
=
Tag
list_serializer_class
=
BulkListSerializer
@staticmethod
def
get_assets_amount
(
obj
):
return
obj
.
assets
.
count
()
class
AdminUserSerializer
(
serializers
.
ModelSerializer
):
assets
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
Asset
.
objects
.
all
())
class
Meta
:
model
=
AdminUser
...
...
@@ -52,6 +89,20 @@ class SystemUserSerializer(serializers.ModelSerializer):
return
fields
class
SystemUserUpdateAssetsSerializer
(
serializers
.
ModelSerializer
):
assets
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
Asset
.
objects
.
all
())
class
Meta
:
model
=
SystemUser
fields
=
[
'id'
,
'assets'
]
class
SystemUserUpdateAssetGroupSerializer
(
serializers
.
ModelSerializer
):
asset_groups
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
AssetGroup
.
objects
.
all
())
class
Meta
:
model
=
SystemUser
fields
=
[
'id'
,
'asset_groups'
]
class
AssetSerializer
(
BulkSerializerMixin
,
serializers
.
ModelSerializer
):
# system_users = SystemUserSerializer(many=True, read_only=True)
# admin_user = AdminUserSerializer(many=False, read_only=True)
...
...
@@ -96,8 +147,9 @@ class AssetGrantedSerializer(serializers.ModelSerializer):
return
', '
.
join
([
system_user
.
username
for
system_user
in
obj
.
system_users
.
all
()])
class
IDCSerializer
(
serializers
.
ModelSerializer
):
class
IDCSerializer
(
BulkSerializerMixin
,
serializers
.
ModelSerializer
):
assets_amount
=
serializers
.
SerializerMethodField
()
assets
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
Asset
.
objects
.
all
())
class
Meta
:
model
=
IDC
...
...
@@ -110,3 +162,11 @@ class IDCSerializer(serializers.ModelSerializer):
fields
=
super
(
IDCSerializer
,
self
)
.
get_field_names
(
declared_fields
,
info
)
fields
.
append
(
'assets_amount'
)
return
fields
class
TagUpdateAssetsSerializer
(
serializers
.
ModelSerializer
):
assets
=
serializers
.
PrimaryKeyRelatedField
(
many
=
True
,
queryset
=
Asset
.
objects
.
all
())
class
Meta
:
model
=
Tag
fields
=
[
'id'
,
'assets'
]
\ No newline at end of file
apps/assets/templates/assets/_asset_bulk_update_modal.html
View file @
dbdb8a58
...
...
@@ -6,8 +6,7 @@
{% block modal_body %}
{% load bootstrap %}
<p
class=
"text-success text-center"
>
{% trans "Hint: only change the field you want to update." %}
</p>
<div
class=
"ydxbd"
id=
"ydxbd"
style=
"display: block;"
>
<div
class=
"ydxbd"
id=
"ydxbd"
style=
"display: block;"
>
<div>
<p
id=
"tags_p"
>
<a
href=
"/assets/asset-by-tag/5"
>
...
...
@@ -15,21 +14,25 @@
</a>
</p>
</div>
</div>
</div>
<form
method=
"post"
class=
"form-horizontal"
action=
""
id=
"fm_asset_bulk_update"
>
<div
class=
"form-group"
>
<label
class=
"control-label col-sm-2 col-lg-2 "
for=
"id_
role"
>
{% trans "Rol
e" %}
</label>
<label
class=
"control-label col-sm-2 col-lg-2 "
for=
"id_
type"
>
{% trans "System Typ
e" %}
</label>
<div
class=
" col-sm-9 col-lg-9 "
>
<select
class=
" select2 form-control"
id=
"id_
role"
name=
"rol
e"
>
<select
class=
" select2 form-control"
id=
"id_
type"
name=
"typ
e"
>
<option
value=
""
>
---------
</option>
<option
value=
"Admin"
>
{% trans "Admin" %}
</option>
<option
value=
"User"
>
{% trans "User" %}
</option>
<option
value=
"Server"
>
{% trans "Server" %}
</option>
<option
value=
"VM"
>
{% trans "VM" %}
</option>
<option
value=
"Switch"
>
{% trans "Switch" %}
</option>
<option
value=
"Storage"
>
{% trans "Storage" %}
</option>
<option
value=
"Router"
>
{% trans "Router" %}
</option>
<option
value=
"Firewall"
>
{% trans "Firewall" %}
</option>
</select>
</div>
</div>
<div
class=
"form-group"
>
<label
for=
"groups"
class=
"col-sm-2 control-label"
>
{% trans 'Groups' %}
</label>
<div
class=
"form-group"
>
<label
for=
"groups"
class=
"col-sm-2 control-label"
>
{% trans 'Asset Groups' %}
</label>
<div
class=
"col-sm-9"
id=
"select2-container"
>
<select
name=
"groups"
id=
"select2_groups"
data-placeholder=
"{% trans 'Select Group' %}"
class=
"select2 form-control m-b"
multiple
>
{% for group in groups %}
...
...
@@ -38,6 +41,18 @@
</select>
</div>
</div>
<div
class=
"form-group"
>
<label
for=
"users"
class=
"col-sm-2 control-label"
>
{% trans 'System Users' %}
</label>
<div
class=
"col-sm-9"
id=
"select2-container"
>
<select
name=
"system_users"
id=
"select2_users"
data-placeholder=
"{% trans 'Select System Users' %}"
class=
"select2 form-control m-b"
multiple
>
{% for system_user in system_users %}
<option
value=
"{{ system_user.id }}"
>
{{ system_user.name }}
</option>
{% endfor %}
</select>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"col-sm-9 col-lg-9 col-sm-offset-2"
>
<div
class=
"checkbox checkbox-success"
>
...
...
@@ -48,27 +63,16 @@
<div
class=
"form-group"
>
<label
class=
"control-label col-sm-2 col-lg-2 "
for=
"id_tags"
>
标签集合
</label>
<div
class=
" col-sm-9 col-lg-9 "
>
<select
multiple=
"multiple"
class=
"select2 form-control"
data-placeholder=
"Select asset tags"
id=
"tags"
name=
"tags"
>
<option
value=
"1"
>
物理机
</option>
<option
value=
"2"
>
虚拟机
</option>
<option
value=
"3"
>
数据库备份
</option>
<option
value=
"4"
>
亦庄机房
</option>
<option
value=
"5"
>
三年质保
</option>
</select>
{% for tag in tags %}
<option
value=
"{{ tag.id }}"
>
{{ tag.name }}
</option>
{% endfor %}
</select>
<p
class=
"help-block"
>
最多5个标签,单个标签最长8个汉字,按回车确认
</p>
</div>
</div>
...
...
apps/assets/templates/assets/_asset_group_bulk_update_modal.html
0 → 100644
View file @
dbdb8a58
{% extends '_modal.html' %}
{% load i18n %}
{% block modal_id %}asset_group_bulk_update_modal{% endblock %}
{% block modal_class %}modal-lg{% endblock %}
{% block modal_title%}{% trans "Update Asset Group" %}{% endblock %}
{% block modal_body %}
{% load bootstrap %}
<p
class=
"text-success text-center"
>
{% trans "Hint: only change the field you want to update." %}
</p>
<form
method=
"post"
class=
"form-horizontal"
action=
""
id=
"fm_asset_group_bulk_update"
>
<div
class=
"form-group"
>
<label
for=
"assets"
class=
"col-sm-2 control-label"
>
{% trans 'Assets' %}
</label>
<div
class=
"col-sm-9"
id=
"select2-container"
>
<select
name=
"assets"
id=
"select2_groups"
data-placeholder=
"{% trans 'Select Asset' %}"
class=
"select2 form-control m-b"
multiple
>
{% for asset in assets %}
<option
value=
"{{ asset.id }}"
>
{{ asset.ip }}
</option>
{% endfor %}
</select>
</div>
</div>
<div
class=
"form-group"
>
<label
for=
"system_users"
class=
"col-sm-2 control-label"
>
{% trans 'System Users' %}
</label>
<div
class=
"col-sm-9"
id=
"select2-container"
>
<select
name=
"system_users"
id=
"select2_groups"
data-placeholder=
"{% trans 'Select System Users' %}"
class=
"select2 form-control m-b"
multiple
>
{% for system_user in system_users %}
<option
value=
"{{ system_user.id }}"
>
{{ system_user.name }}
</option>
{% endfor %}
</select>
</div>
</div>
<div
class=
"form-group"
>
<div
class=
"col-sm-9 col-lg-9 col-sm-offset-2"
>
<div
class=
"checkbox checkbox-success"
>
<input
type=
"checkbox"
name=
"enable_otp"
checked
id=
"id_enable_otp"
><label
for=
"id_enable_otp"
>
{% trans 'Enable-OTP' %}
</label>
</div>
</div>
</div>
</form>
{% endblock %}
{% block modal_confirm_id %}btn_asset_group_bulk_update{% endblock %}
\ No newline at end of file
apps/assets/templates/assets/admin_user_detail.html
View file @
dbdb8a58
This diff is collapsed.
Click to expand it.
apps/assets/templates/assets/admin_user_list.html
View file @
dbdb8a58
...
...
@@ -23,6 +23,18 @@
<tbody>
</tbody>
</table>
<div
id=
"actions"
class=
"hide"
>
<div
class=
"input-group"
>
<select
class=
"form-control m-b"
style=
"width: auto"
id=
"slct_bulk_update"
>
<option
value=
"delete"
>
{% trans 'Delete selected' %}
</option>
</select>
<div
class=
"input-group-btn pull-left"
style=
"padding-left: 5px;"
>
<button
id=
'btn_bulk_update'
style=
"height: 32px;"
class=
"btn btn-sm btn-primary"
>
{% trans 'Submit' %}
</button>
</div>
</div>
</div>
{% endblock %}
{% block content_bottom_left %}{% endblock %}
{% block custom_foot_js %}
...
...
@@ -48,8 +60,72 @@ $(document).ready(function(){
ajax_url
:
'{% url "api-assets:admin-user-list" %}'
,
columns
:
[{
data
:
function
(){
return
""
}},
{
data
:
"name"
},
{
data
:
"username"
},
{
data
:
"assets_amount"
},
{
data
:
function
()
{
return
'lost'
}
},
{
data
:
"comment"
},
{
data
:
"id"
}],
op_html
:
$
(
'#actions'
).
html
()
};
jumpserver
.
initDataTable
(
options
);
})
.
on
(
'click'
,
'.btn_admin_user_delete'
,
function
()
{
var
$this
=
$
(
this
);
var
$data_table
=
$
(
"#admin_user_list_table"
).
DataTable
();
var
name
=
$
(
this
).
closest
(
"tr"
).
find
(
":nth-child(2)"
).
children
(
'a'
).
html
();
var
uid
=
$this
.
data
(
'uid'
);
var
the_url
=
'{% url "api-assets:admin-user-detail" pk=99991937 %}'
.
replace
(
'99991937'
,
uid
);
objectDelete
(
$this
,
name
,
the_url
);
$data_table
.
ajax
.
reload
();
})
.
on
(
'click'
,
'#btn_bulk_update'
,
function
()
{
var
action
=
$
(
'#slct_bulk_update'
).
val
();
var
$data_table
=
$
(
'#admin_user_list_table'
).
DataTable
();
var
id_list
=
[];
var
plain_id_list
=
[];
$data_table
.
rows
({
selected
:
true
}).
every
(
function
(){
id_list
.
push
({
id
:
this
.
data
().
id
});
plain_id_list
.
push
(
this
.
data
().
id
);
});
if
(
plain_id_list
.
length
==
0
)
{
return
false
;
}
var
the_url
=
"{% url 'api-assets:admin-user-list' %}"
;
function
doDelete
()
{
swal
({
title
:
"{% trans 'Are you sure?' %}"
,
text
:
"{% trans 'This will delete the selected Admin Users !!!' %}"
,
type
:
"warning"
,
showCancelButton
:
true
,
confirmButtonColor
:
"#DD6B55"
,
confirmButtonText
:
"{% trans 'Confirm' %}"
,
closeOnConfirm
:
false
},
function
()
{
var
success
=
function
()
{
var
msg
=
"{% trans 'Admin Users Deleted.' %}"
;
swal
(
"{% trans 'Admin Users Delete' %}"
,
msg
,
"success"
);
$
(
'#admin_user_list_table'
).
DataTable
().
ajax
.
reload
();
};
var
fail
=
function
()
{
var
msg
=
"{% trans 'Admin Users Deleting failed.' %}"
;
swal
(
"{% trans 'Admin Users Delete' %}"
,
msg
,
"error"
);
};
var
url_delete
=
the_url
+
'?id__in='
+
JSON
.
stringify
(
plain_id_list
);
APIUpdateAttr
({
url
:
url_delete
,
method
:
'DELETE'
,
success
:
success
,
error
:
fail
});
$data_table
.
ajax
.
reload
();
jumpserver
.
checked
=
false
;
});
}
function
doUpdate
()
{
}
switch
(
action
)
{
case
'delete'
:
doDelete
();
break
;
case
'update'
:
doUpdate
();
break
;
default
:
break
;
}
});
</script>
{% endblock %}
...
...
apps/assets/templates/assets/asset_detail.html
View file @
dbdb8a58
...
...
@@ -200,7 +200,7 @@
<i
class=
"fa fa-info-circle"
></i>
{% trans 'Asset groups' %}
</div>
<div
class=
"panel-body"
>
<table
class=
"table group_edit"
>
<table
class=
"table group_edit"
id=
"add-asset2group"
>
<tbody>
<form>
<tr>
...
...
@@ -236,7 +236,7 @@
<i
class=
"fa fa-info-circle"
></i>
{% trans 'System users' %}
</div>
<div
class=
"panel-body"
>
<table
class=
"table group_edit"
>
<table
class=
"table group_edit"
id=
"add-asset2systemuser"
>
<tbody>
<form>
<tr
class=
"no-borders-tr"
>
...
...
@@ -288,7 +288,7 @@ function updateAssetGroups(groups) {
$
.
map
(
jumpserver
.
groups_selected
,
function
(
group_name
,
index
)
{
$
(
'#opt_'
+
index
).
remove
();
// change tr html of user groups.
$
(
'
.group_edit
tbody'
).
append
(
$
(
'
#add-asset2group
tbody'
).
append
(
'<tr>'
+
'<td><b class="bdg_group" data-gid="'
+
index
+
'">'
+
group_name
+
'</b></td>'
+
'<td><button class="btn btn-danger btn-xs pull-right btn_leave_group" type="button"><i class="fa fa-minus"></i></button></td>'
+
...
...
@@ -316,7 +316,7 @@ function updateAssetSystem(system_users) {
$
.
map
(
jumpserver
.
groups_selected
,
function
(
name
,
index
)
{
$
(
'#opt_'
+
index
).
remove
();
$
(
'
.group_edit
tbody'
).
append
(
$
(
'
#add-asset2systemuser
tbody'
).
append
(
'<tr>'
+
'<td><b class="bdg_group" data-sid="'
+
index
+
'">'
+
name
+
'</b></td>'
+
'<td><button class="btn btn-danger btn-xs pull-right btn_leave_system" type="button"><i class="fa fa-minus"></i></button></td>'
+
...
...
@@ -418,7 +418,6 @@ $(document).ready(function () {
var
system_users
=
$
(
'.bdg_group'
).
map
(
function
()
{
return
$
(
this
).
data
(
'sid'
);
}).
get
();
console
.
log
(
system_users
);
updateAssetSystem
(
system_users
)
})
...
...
apps/assets/templates/assets/asset_group_detail.html
View file @
dbdb8a58
This diff is collapsed.
Click to expand it.
apps/assets/templates/assets/asset_group_list.html
View file @
dbdb8a58
...
...
@@ -21,6 +21,20 @@
<tbody>
</tbody>
</table>
<div
id=
"actions"
class=
"hide"
>
<div
class=
"input-group"
>
<select
class=
"form-control m-b"
style=
"width: auto"
id=
"slct_bulk_update"
>
<option
value=
"delete"
>
{% trans 'Delete selected' %}
</option>
<option
value=
"update"
>
{% trans 'Update selected' %}
</option>
</select>
<div
class=
"input-group-btn pull-left"
style=
"padding-left: 5px;"
>
<button
id=
'btn_bulk_update'
style=
"height: 32px;"
class=
"btn btn-sm btn-primary"
>
{% trans 'Submit' %}
</button>
</div>
</div>
</div>
{% include 'assets/_asset_group_bulk_update_modal.html' %}
{% endblock %}
{% block content_bottom_left %}{% endblock %}
{% block custom_foot_js %}
...
...
@@ -43,17 +57,125 @@ $(document).ready(function(){
$
(
td
).
html
(
update_btn
+
del_btn
)
}}],
ajax_url
:
'{% url "api-assets:asset-group-list" %}'
,
columns
:
[{
data
:
"id"
},
{
data
:
"name"
},
{
data
:
"assets_amount"
},
{
data
:
"comment"
},
{
data
:
"id"
}]
columns
:
[{
data
:
"id"
},
{
data
:
"name"
},
{
data
:
"assets_amount"
},
{
data
:
"comment"
},
{
data
:
"id"
}],
op_html
:
$
(
'#actions'
).
html
()
};
jumpserver
.
initDataTable
(
options
);
})
.
on
(
'click'
,
'.btn_asset_group_delete'
,
function
()
{
.
on
(
'click'
,
'.btn_asset_group_delete'
,
function
()
{
var
$this
=
$
(
this
);
var
$data_table
=
$
(
'#asset_groups_list_table'
).
DataTable
();
var
name
=
$
(
this
).
closest
(
"tr"
).
find
(
":nth-child(2)"
).
children
(
'a'
).
html
();
var
uid
=
$this
.
data
(
'uid'
);
var
the_url
=
'{% url "api-assets:asset-group-detail" pk=99991937 %}'
.
replace
(
'99991937'
,
uid
);
objectDelete
(
$this
,
name
,
the_url
);
$data_table
.
ajax
.
reload
();
})
.
on
(
'click'
,
'#btn_bulk_update'
,
function
()
{
var
action
=
$
(
'#slct_bulk_update'
).
val
();
var
$data_table
=
$
(
'#asset_groups_list_table'
).
DataTable
();
var
id_list
=
[];
var
plain_id_list
=
[];
$data_table
.
rows
({
selected
:
true
}).
every
(
function
(){
id_list
.
push
({
id
:
this
.
data
().
id
});
plain_id_list
.
push
(
this
.
data
().
id
);
});
if
(
id_list
===
[])
{
return
false
;
}
var
the_url
=
'{% url "api-assets:asset-group-list" %}'
;
console
.
log
(
plain_id_list
);
console
.
log
(
the_url
);
function
doDelete
()
{
swal
({
title
:
"{% trans 'Are you sure?' %}"
,
text
:
"{% trans 'This will delete the selected groups !!!' %}"
,
type
:
"warning"
,
showCancelButton
:
true
,
confirmButtonColor
:
"#DD6B55"
,
confirmButtonText
:
"{% trans 'Confirm' %}"
,
closeOnConfirm
:
false
},
function
()
{
var
success
=
function
()
{
var
msg
=
"{% trans 'Group Deleted.' %}"
;
swal
(
"{% trans 'Group Delete' %}"
,
msg
,
"success"
);
$
(
'#asset_groups_list_table'
).
DataTable
().
ajax
.
reload
();
};
var
fail
=
function
()
{
var
msg
=
"{% trans 'Group Deleting failed.' %}"
;
swal
(
"{% trans 'Group Delete' %}"
,
msg
,
"error"
);
};
var
url_delete
=
the_url
+
'?id__in='
+
JSON
.
stringify
(
plain_id_list
);
APIUpdateAttr
({
url
:
url_delete
,
method
:
'DELETE'
,
success
:
success
,
error
:
fail
});
$data_table
.
ajax
.
reload
();
jumpserver
.
checked
=
false
;
});
}
function
doUpdate
()
{
$
(
'#asset_group_bulk_update_modal'
).
modal
(
'show'
);
}
switch
(
action
)
{
case
'delete'
:
doDelete
();
break
;
case
'update'
:
doUpdate
();
break
;
default
:
break
;
}
})
.
on
(
'click'
,
'#btn_asset_group_bulk_update'
,
function
()
{
var
json_data
=
$
(
"#fm_asset_group_bulk_update"
).
serializeObject
();
var
body
=
{};
body
.
enable_otp
=
(
json_data
.
enable_otp
===
'on'
)?
true
:
false
;
if
(
json_data
.
type
!=
''
)
{
body
.
type
=
json_data
.
type
;
}
if
(
json_data
.
assets
!=
undefined
)
{
body
.
assets
=
json_data
.
assets
;
}
if
(
typeof
body
.
assets
===
'string'
)
{
body
.
assets
=
[
parseInt
(
body
.
assets
)]
}
else
if
(
typeof
body
.
assets
===
'array'
)
{
var
new_assets
=
body
.
assets
.
map
(
Number
);
body
.
assets
=
new_assets
;
}
if
(
json_data
.
system_users
!=
undefined
)
{
body
.
system_users
=
json_data
.
system_users
;
}
if
(
typeof
body
.
system_users
===
'string'
)
{
body
.
system_users
=
[
parseInt
(
body
.
system_users
)];
}
else
if
(
typeof
body
.
system_users
===
'array'
)
{
var
new_system_users
=
body
.
system_users
.
map
(
Number
);
body
.
system_users
=
new_system_users
;
}
var
post_list
=
[];
var
$data_table
=
$
(
'#asset_groups_list_table'
).
DataTable
()
$data_table
.
rows
({
selected
:
true
}).
every
(
function
(){
var
content
=
Object
.
assign
({
id
:
this
.
data
().
id
},
body
);
post_list
.
push
(
content
);
});
if
(
post_list
===
[])
{
return
false
}
var
the_url
=
'{% url "api-assets:asset-group-list" %}'
;
var
success
=
function
()
{
var
msg
=
"{% trans 'The selected asset groups has been updated successfully.' %}"
;
swal
(
"{% trans 'AssetGroup Updated' %}"
,
msg
,
"success"
);
$
(
'#asset_groups_list_table'
).
DataTable
().
ajax
.
reload
();
jumpserver
.
checked
=
false
;
};
{
#
console
.
log
(
JSON
.
stringify
(
post_list
));
#
}
APIUpdateAttr
({
url
:
the_url
,
method
:
'PATCH'
,
body
:
JSON
.
stringify
(
post_list
),
success
:
success
});
$
(
'#asset_group_bulk_update_modal'
).
modal
(
'hide'
);
});
</script>
{% endblock %}
apps/assets/templates/assets/asset_list.html
View file @
dbdb8a58
...
...
@@ -72,6 +72,7 @@
<option
value=
"delete"
>
{% trans 'Delete selected' %}
</option>
<option
value=
"update"
>
{% trans 'Update selected' %}
</option>
<option
value=
"deactive"
>
{% trans 'Deactive selected' %}
</option>
<option
value=
"active"
>
{% trans 'Active' %}
</option>
</select>
<div
class=
"input-group-btn pull-left"
style=
"padding-left: 5px;"
>
<button
id=
'btn_bulk_update'
style=
"height: 32px;"
class=
"btn btn-sm btn-primary"
>
...
...
@@ -81,12 +82,13 @@
</div>
</div>
{% include 'assets/_asset_import_modal.html' %}
{% include 'assets/_asset_bulk_update_modal.html' %}
{% endblock %}
{% block custom_foot_js %}
<script
src=
"{% static 'js/jquery.form.min.js' %}"
></script>
<script
type=
"text/javascript"
>
window
.
onload
=
function
(){
window
.
onload
=
function
(){
var
tag_on
=
document
.
getElementsByName
(
"tag_on"
);
var
oDiv
=
document
.
getElementById
(
"ydxbd"
);
if
(
tag_on
.
length
>
0
){
...
...
@@ -94,16 +96,16 @@
}
};
function
tagShow
()
{
function
tagShow
()
{
var
oDiv
=
document
.
getElementById
(
"ydxbd"
);
if
(
oDiv
.
style
.
display
==
'none'
){
oDiv
.
style
.
display
=
"block"
;
}
else
{
oDiv
.
style
.
display
=
"none"
;
}
}
//onload;
}
//onload;
$
(
document
).
ready
(
function
(){
$
(
document
).
ready
(
function
(){
var
options
=
{
ele
:
$
(
'#asset_list_table'
),
columnDefs
:
[
...
...
@@ -129,7 +131,6 @@
var
update_btn
=
'<a href="{% url "assets:asset-update" pk=99991937 %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'
.
replace
(
'99991937'
,
cellData
);
var
del_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn_asset_delete" data-uid="99991937">{% trans "Delete" %}</a>'
.
replace
(
'99991937'
,
cellData
);
$
(
td
).
html
(
update_btn
+
del_btn
)
}}
],
ajax_url
:
'{% url "api-assets:asset-list" %}'
,
...
...
@@ -139,13 +140,13 @@
op_html
:
$
(
'#actions'
).
html
()
};
var
table
=
jumpserver
.
initDataTable
(
options
);
$
(
'.btn_export'
).
click
(
function
()
{
var
assets
=
[];
var
rows
=
table
.
rows
(
'.selected'
).
data
();
$
.
each
(
rows
,
function
(
index
,
obj
)
{
assets
.
push
(
obj
.
id
)
});
console
.
log
(
assets
);
$
.
ajax
({
url
:
"{% url "
assets
:
asset
-
export
" %}"
,
method
:
'POST'
,
...
...
@@ -159,7 +160,6 @@
}
})
});
$
(
'#btn_asset_import'
).
click
(
function
()
{
var
$form
=
$
(
'#fm_asset_import'
);
$form
.
find
(
'.help-block'
).
remove
();
...
...
@@ -179,15 +179,150 @@
}
$form
.
ajaxSubmit
({
success
:
success
});
})
})
})
.
on
(
'click'
,
'.btn_asset_delete'
,
function
()
{
.
on
(
'click'
,
'.btn_asset_delete'
,
function
()
{
var
$this
=
$
(
this
);
var
$data_table
=
$
(
"#asset_list_table"
).
DataTable
();
var
name
=
$
(
this
).
closest
(
"tr"
).
find
(
":nth-child(2)"
).
children
(
'a'
).
html
();
var
uid
=
$this
.
data
(
'uid'
);
var
the_url
=
'{% url "api-assets:asset-detail" pk=99991937 %}'
.
replace
(
'99991937'
,
uid
);
objectDelete
(
$this
,
name
,
the_url
);
$data_table
.
ajax
.
reload
();
})
.
on
(
'click'
,
'#btn_bulk_update'
,
function
()
{
var
action
=
$
(
'#slct_bulk_update'
).
val
();
var
$data_table
=
$
(
'#asset_list_table'
).
DataTable
();
var
id_list
=
[];
var
plain_id_list
=
[];
$data_table
.
rows
({
selected
:
true
}).
every
(
function
(){
id_list
.
push
({
id
:
this
.
data
().
id
});
plain_id_list
.
push
(
this
.
data
().
id
);
});
if
(
plain_id_list
.
length
==
0
)
{
return
false
;
}
var
the_url
=
"{% url 'api-assets:asset-list' %}"
;
function
doDeactive
()
{
var
body
=
$
.
each
(
id_list
,
function
(
index
,
asset_object
)
{
asset_object
[
'is_active'
]
=
false
;
});
APIUpdateAttr
({
url
:
the_url
,
method
:
'PATCH'
,
body
:
JSON
.
stringify
(
body
)});
$data_table
.
ajax
.
reload
();
jumpserver
.
checked
=
false
;
}
function
doActive
()
{
var
body
=
$
.
each
(
id_list
,
function
(
index
,
asset_object
)
{
asset_object
[
'is_active'
]
=
true
;
});
APIUpdateAttr
({
url
:
the_url
,
method
:
'PATCH'
,
body
:
JSON
.
stringify
(
body
)});
$data_table
.
ajax
.
reload
();
jumpserver
.
checked
=
false
;
}
function
doDelete
()
{
swal
({
title
:
"{% trans 'Are you sure?' %}"
,
text
:
"{% trans 'This will delete the selected assets !!!' %}"
,
type
:
"warning"
,
showCancelButton
:
true
,
confirmButtonColor
:
"#DD6B55"
,
confirmButtonText
:
"{% trans 'Confirm' %}"
,
closeOnConfirm
:
false
},
function
()
{
var
success
=
function
()
{
var
msg
=
"{% trans 'Asset Deleted.' %}"
;
swal
(
"{% trans 'Asset Delete' %}"
,
msg
,
"success"
);
$
(
'#asset_list_table'
).
DataTable
().
ajax
.
reload
();
};
var
fail
=
function
()
{
var
msg
=
"{% trans 'Asset Deleting failed.' %}"
;
swal
(
"{% trans 'Asset Delete' %}"
,
msg
,
"error"
);
};
var
url_delete
=
the_url
+
'?id__in='
+
JSON
.
stringify
(
plain_id_list
);
APIUpdateAttr
({
url
:
url_delete
,
method
:
'DELETE'
,
success
:
success
,
error
:
fail
});
$data_table
.
ajax
.
reload
();
jumpserver
.
checked
=
false
;
});
}
function
doUpdate
()
{
$
(
'#asset_bulk_update_modal'
).
modal
(
'show'
);
}
switch
(
action
)
{
case
'deactive'
:
doDeactive
();
break
;
case
'delete'
:
doDelete
();
break
;
case
'update'
:
doUpdate
();
break
;
case
'active'
:
doActive
();
break
;
default
:
break
;
}
})
.
on
(
'click'
,
'#btn_asset_bulk_update'
,
function
()
{
var
json_data
=
$
(
"#fm_asset_bulk_update"
).
serializeObject
();
var
body
=
{};
body
.
enable_otp
=
(
json_data
.
enable_otp
===
'on'
)?
true
:
false
;
if
(
json_data
.
type
!=
''
)
{
body
.
type
=
json_data
.
type
;
}
if
(
json_data
.
groups
!=
undefined
)
{
body
.
groups
=
json_data
.
groups
;
}
if
(
typeof
body
.
groups
===
'string'
)
{
body
.
groups
=
[
parseInt
(
body
.
groups
)]
}
else
if
(
typeof
body
.
groups
===
'array'
)
{
var
new_groups
=
body
.
groups
.
map
(
Number
);
body
.
groups
=
new_groups
;
}
if
(
json_data
.
system_users
!=
undefined
)
{
body
.
system_users
=
json_data
.
system_users
;
}
if
(
typeof
body
.
system_users
===
'string'
)
{
body
.
system_users
=
[
parseInt
(
body
.
system_users
)]
}
else
if
(
typeof
body
.
system_users
===
'array'
)
{
var
new_users
=
body
.
system_users
.
map
(
Number
);
body
.
system_users
=
new_users
;
}
if
(
json_data
.
tags
!=
undefined
)
{
body
.
tags
=
json_data
.
tags
;
}
if
(
typeof
body
.
tags
==
'string'
)
{
body
.
tags
=
[
parseInt
(
body
.
tags
)];
}
else
if
(
typeof
body
.
tags
===
'array'
)
{
var
new_tags
=
body
.
tags
.
map
(
Number
);
body
.
tags
=
new_tags
;
}
var
$data_table
=
$
(
'#asset_list_table'
).
DataTable
();
var
post_list
=
[];
$data_table
.
rows
({
selected
:
true
}).
every
(
function
(){
var
content
=
Object
.
assign
({
id
:
this
.
data
().
id
},
body
);
post_list
.
push
(
content
);
});
if
(
post_list
===
[])
{
return
false
}
var
the_url
=
"{% url 'api-assets:asset-list' %}"
;
var
success
=
function
()
{
var
msg
=
"{% trans 'The selected assets has been updated successfully.' %}"
;
swal
(
"{% trans 'Asset Updated' %}"
,
msg
,
"success"
);
$
(
'#asset_list_table'
).
DataTable
().
ajax
.
reload
();
jumpserver
.
checked
=
false
;
};
console
.
log
(
JSON
.
stringify
(
post_list
));
console
.
log
(
the_url
);
{
#
APIUpdateAttr
({
url
:
the_url
,
method
:
'PATCH'
,
body
:
JSON
.
stringify
(
post_list
),
success
:
success
});
#
}
$
(
'#asset_bulk_update_modal'
).
modal
(
'hide'
);
});
</script>
{% endblock %}
\ No newline at end of file
apps/assets/templates/assets/asset_tag_detail.html
View file @
dbdb8a58
This diff is collapsed.
Click to expand it.
apps/assets/templates/assets/asset_tags_list.html
View file @
dbdb8a58
{% extends '_base_list.html' %}
{% load i18n %}
{% load common_tags %}
{% block content_left_head %}
<a
href=
"{% url 'assets:asset-tag-create' %}"
class=
"btn btn-sm btn-primary "
>
{% trans "Create tag" %}
</a>
{% load i18n static %}
{#{% load common_tags %}#}
{% block custom_head_css_js %}
<link
href=
"{% static 'css/plugins/select2/select2.min.css' %}"
rel=
"stylesheet"
>
<script
src=
"{% static 'js/plugins/select2/select2.full.min.js' %}"
></script>
{% endblock %}
{% block table_head %}
<th
class=
"text-center"
>
<input
type=
"checkbox"
id=
"check_all"
onclick=
"checkAll('check_all', 'checked')"
>
</th>
<th
class=
"text-center"
><a
href=
"{% url 'assets:asset-tag-list' %}?sort=name"
>
{% trans 'Tag Name' %}
</a></th>
{#{% block content_left_head %}#}
{#
<a
href=
"{% url 'assets:asset-tag-create' %}"
class=
"btn btn-sm btn-primary "
>
{% trans "Create tag" %}
</a>
#}
{#{% endblock %}#}
{#{% block table_head %}#}
{#
<th
class=
"text-center"
>
#}
{#
<input
type=
"checkbox"
id=
"check_all"
onclick=
"checkAll('check_all', 'checked')"
>
#}
{#
</th>
#}
{#
<th
class=
"text-center"
><a
href=
"{% url 'assets:asset-tag-list' %}?sort=name"
>
{% trans 'Tag Name' %}
</a></th>
#}
{#
<th
class=
"text-center"
>
{% trans 'Asset num' %}
</th>
#}
{#
<th
class=
"text-center"
></th>
#}
{#{% endblock %}#}
{#{% block table_body %}#}
{# {% for asset_tag in asset_tags_list %}#}
{#
<tr
class=
"gradeX"
>
#}
{#
<td
class=
"text-center"
>
#}
{#
<input
type=
"checkbox"
name=
"checked"
value=
"{{ asset_tag.id }}"
>
#}
{#
</td>
#}
{#
<td
class=
"text-center"
>
#}
{#
<a
href=
"{% url 'assets:asset-tag-detail' pk=asset_tag.id %}"
>
#}
{# {{ asset_tag.name }}#}
{#
</a>
#}
{#
</td>
#}
{#
<td
class=
"text-center"
>
{{ asset_tag.asset_set.count }}
</td>
#}
{#
<td
class=
"text-center"
>
#}
{#
<a
href=
"{% url 'assets:asset-tag-update' pk=asset_tag.id %}"
class=
"btn btn-xs btn-info"
>
{% trans 'Update' %}
</a>
#}
{#
<a
onclick=
"objectDelete(this,'{{ asset_tag.name }}','{% url 'assets:asset-tag-delete' asset_tag.id %}')"
class=
"btn btn-xs btn-danger del"
>
{% trans 'Delete' %}
</a>
#}
{#
</td>
#}
{#
</tr>
#}
{# {% endfor %}#}
{#{% endblock %}#}
{#{% block content_bottom_left %}#}
{#
<form
id=
""
method=
"get"
action=
""
class=
" mail-search"
>
#}
{#
<div
class=
"input-group"
>
#}
{#
<select
class=
"form-control m-b"
style=
"width: auto"
>
#}
{#
<option>
{% trans 'Delete selected' %}
</option>
#}
{#
<option>
{% trans 'Update selected' %}
</option>
#}
{#
<option>
{% trans 'Deactive selected' %}
</option>
#}
{#
<option>
{% trans 'Export selected' %}
</option>
#}
{#
</select>
#}
{#
<div
class=
"input-group-btn pull-left"
style=
"padding-left: 5px;"
>
#}
{#
<button
id=
'search_btn'
type=
"submit"
style=
"height: 32px;"
class=
"btn btn-sm btn-primary"
>
#}
{# {% trans 'Submit' %}#}
{#
</button>
#}
{#
</div>
#}
{#
</div>
#}
{#
</form>
#}
{#{% endblock %}#}
{% block table_search %}{% endblock %}
{% block table_container %}
<div
class=
"uc pull-left m-l-5 m-r-5"
>
<a
href=
"{% url "
assets:asset-tag-create
"
%}"
class=
"btn btn-sm btn-primary"
>
{% trans "Create Tag" %}
</a>
</div>
<table
class=
"table table-striped table-bordered table-hover "
id=
"tag_list_table"
>
<thead>
<tr>
<th
class=
"text-center"
><input
type=
"checkbox"
class=
"ipt_check_all"
></th>
<th
class=
"text-center"
>
{% trans 'TagName' %}
</th>
<th
class=
"text-center"
>
{% trans 'Asset num' %}
</th>
<th
class=
"text-center"
></th>
{% endblock %}
{% block table_body %}
{% for asset_tag in asset_tags_list %}
<tr
class=
"gradeX"
>
<td
class=
"text-center"
>
<input
type=
"checkbox"
name=
"checked"
value=
"{{ asset_tag.id }}"
>
</td>
<td
class=
"text-center"
>
<a
href=
"{% url 'assets:asset-tag-detail' pk=asset_tag.id %}"
>
{{ asset_tag.name }}
</a>
</td>
<td
class=
"text-center"
>
{{ asset_tag.asset_set.count }}
</td>
<td
class=
"text-center"
>
<a
href=
"{% url 'assets:asset-tag-update' pk=asset_tag.id %}"
class=
"btn btn-xs btn-info"
>
{% trans 'Update' %}
</a>
<a
onclick=
"objectDelete(this,'{{ asset_tag.name }}','{% url 'assets:asset-tag-delete' asset_tag.id %}')"
class=
"btn btn-xs btn-danger del"
>
{% trans 'Delete' %}
</a>
</td>
<th
class=
"text-center"
>
{% trans 'Action' %}
</th>
</tr>
{% endfor %}
{% endblock %}
{% block content_bottom_left %}
<form
id=
""
method=
"get"
action=
""
class=
" mail-search
"
>
</thead>
<tbody>
</tbody>
</table>
<div
id=
"actions"
class=
"hide
"
>
<div
class=
"input-group"
>
<select
class=
"form-control m-b"
style=
"width: auto"
>
<option>
{% trans 'Delete selected' %}
</option>
<option>
{% trans 'Update selected' %}
</option>
<option>
{% trans 'Deactive selected' %}
</option>
<option>
{% trans 'Export selected' %}
</option>
<select
class=
"form-control m-b"
style=
"width: auto"
id=
"slct_bulk_update"
>
<option
value=
"delete"
>
{% trans 'Delete selected' %}
</option>
<option
value=
"update"
>
{% trans 'Update selected' %}
</option>
</select>
<div
class=
"input-group-btn pull-left"
style=
"padding-left: 5px;"
>
<button
id=
'search_btn'
type=
"submit"
style=
"height: 32px;"
class=
"btn btn-sm btn-primary"
>
<button
id=
'btn_bulk_update'
style=
"height: 32px;"
class=
"btn btn-sm btn-primary"
>
{% trans 'Submit' %}
</button>
</div>
</div>
</form>
</div>
{% endblock %}
{% block custom_foot_js %}
<script
src=
"{% static 'js/jquery.form.min.js' %}"
></script>
<script
type=
"text/javascript"
>
$
(
document
).
ready
(
function
()
{
var
options
=
{
ele
:
$
(
"#tag_list_table"
),
columnDefs
:[
{
targets
:
1
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
detail_btn
=
'<a href="{% url '
assets
:
asset
-
tag
-
detail
' pk=99991937 %}">'
+
cellData
+
'</a>'
;
$
(
td
).
html
(
detail_btn
.
replace
(
'99991937'
,
rowData
.
id
));
}},
{
targets
:
3
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
update_btn
=
'<a href="{% url '
assets
:
asset
-
tag
-
detail
' pk=99991937 %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'
.
replace
(
'99991937'
,
cellData
);
var
del_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn_tag_delete" data-uid="99991937">{% trans "Delete" %}</a>'
.
replace
(
'99991937'
,
cellData
);
$
(
td
).
html
(
update_btn
+
del_btn
)
}}
],
ajax_url
:
'{% url "api-assets:asset-tag-list" %}'
,
columns
:
[{
data
:
function
(){
return
""
}},
{
data
:
"name"
},
{
data
:
"assets_amount"
},{
data
:
"id"
}]
};
jumpserver
.
initDataTable
(
options
);
})
.
on
(
'click'
,
'.btn_tag_delete'
,
function
()
{
var
$this
=
$
(
this
);
var
$data_table
=
$
(
'#tag_list_table'
).
DataTable
();
var
name
=
$
(
this
).
closest
(
"tr"
).
find
(
":nth-child(2)"
).
children
(
'a'
).
html
();
var
uid
=
$this
.
data
(
'uid'
);
var
the_url
=
'{% url "api-assets:asset-tag-detail" pk=99991937 %}'
.
replace
(
'99991937'
,
uid
);
objectDelete
(
$this
,
name
,
the_url
);
$data_table
.
ajax
.
reload
();
})
</script>
{% endblock %}
\ No newline at end of file
apps/assets/templates/assets/idc_assets.html
View file @
dbdb8a58
This diff is collapsed.
Click to expand it.
apps/assets/templates/assets/idc_detail.html
View file @
dbdb8a58
...
...
@@ -27,7 +27,7 @@
<a
class=
"btn btn-outline btn-default"
href=
"{% url 'assets:idc-update' pk=idc.id %}"
><i
class=
"fa fa-edit"
></i>
Update
</a>
</li>
<li
class=
"pull-right"
>
<a
class=
"btn btn-outline btn-danger
"
href=
"{% url 'assets:idc-delete' pk=idc.id %}
"
>
<a
class=
"btn btn-outline btn-danger
btn-delete-idc
"
>
<i
class=
"fa fa-edit"
></i>
Delete
</a>
</li>
...
...
@@ -53,9 +53,9 @@
</div>
</div>
<div
class=
"ibox-content"
>
<table
class=
"table"
>
<table
class=
"table
idc-details
"
>
<tbody>
<tr
class=
"no-borders-tr"
>
<tr
class=
"no-borders-tr"
data-name=
"{{ idc.name }}"
>
<td>
{% trans 'Name' %}:
</td>
<td><b>
{{ idc.name }}
</b></td>
</tr>
...
...
@@ -113,26 +113,47 @@
{% endblock %}
{% block custom_foot_js %}
<script>
{
#
function
switch_user_status
(
obj
)
{
#
}
{
#
var
status
=
$
(
obj
).
prop
(
'checked'
);
#
}
{
##
}
{
#
$
.
ajax
({
#
}
{
#
url
:
"{% url 'users:user-active-api' pk=user.id %}"
,
#
}
{
#
type
:
"PUT"
,
#
}
{
#
data
:
{
#
}
{
#
'is_active'
:
status
#
}
{
#
},
#
}
{
#
success
:
function
(
data
,
status
)
{
#
}
{
#
console
.
log
(
data
)
#
}
{
#
},
#
}
{
#
error
:
function
()
{
#
}
{
#
console
.
log
(
'error'
)
#
}
{
#
}
#
}
{
#
})
#
}
{
#
}
#
}
$
(
document
).
ready
(
function
()
{
$
(
'.select2'
).
select2
();
<script>
function
idcDelete
(
name
,
url
)
{
function
doDelete
()
{
var
body
=
{};
var
success
=
function
()
{
swal
(
'Deleted!'
,
"[ "
+
name
+
"]"
+
" has been deleted "
,
"success"
);
window
.
location
.
href
=
"{% url 'assets:idc-list' %}"
;
};
var
fail
=
function
()
{
swal
(
"Failed"
,
"Delete"
+
"[ "
+
name
+
" ]"
+
"failed"
,
"error"
);
};
APIUpdateAttr
({
url
:
url
,
body
:
JSON
.
stringify
(
body
),
method
:
'DELETE'
,
success
:
success
,
error
:
fail
});
}
swal
({
title
:
'Are you sure delete ?'
,
text
:
" ["
+
name
+
"] "
,
type
:
"warning"
,
showCancelButton
:
true
,
cancelButtonText
:
'Cancel'
,
confirmButtonColor
:
"#DD6B55"
,
confirmButtonText
:
'Confirm'
,
closeOnConfirm
:
false
},
function
()
{
doDelete
()
});
</script>
}
$
(
document
).
ready
(
function
()
{
$
(
'.select2'
).
select2
();
})
.
on
(
'click'
,
'.btn-delete-idc'
,
function
()
{
var
name
=
$
(
'.idc-details > tbody > tr'
).
attr
(
"data-name"
);
var
id
=
{{
idc
.
id
}};
var
the_url
=
'{% url "api-assets:idc-detail" pk=99991937 %}'
.
replace
(
99991937
,
id
);
idcDelete
(
name
,
the_url
);
});
</script>
{% endblock %}
\ No newline at end of file
apps/assets/templates/assets/idc_list.html
View file @
dbdb8a58
{% extends '_base_list.html' %}
{% load i18n static %}
{% block custom_head_css_js %}
<link
href=
"{% static 'css/plugins/select2/select2.min.css' %}"
rel=
"stylesheet"
>
<script
src=
"{% static 'js/plugins/select2/select2.full.min.js' %}"
></script>
{% endblock %}
{% block table_search %}{% endblock %}
{% block table_container %}
<div
class=
"uc pull-left m-l-5 m-r-5"
>
...
...
@@ -22,6 +26,18 @@
<tbody>
</tbody>
</table>
<div
id=
"actions"
class=
"hide"
>
<div
class=
"input-group"
>
<select
class=
"form-control m-b"
style=
"width: auto"
id=
"slct_bulk_update"
>
<option
value=
"delete"
>
{% trans 'Delete selected' %}
</option>
</select>
<div
class=
"input-group-btn pull-left"
style=
"padding-left: 5px;"
>
<button
id=
'btn_bulk_update'
style=
"height: 32px;"
class=
"btn btn-sm btn-warning"
>
{% trans 'Submit' %}
</button>
</div>
</div>
</div>
{% endblock %}
{% block content_bottom_left %}{% endblock %}
{% block custom_foot_js %}
...
...
@@ -34,20 +50,10 @@ $(document).ready(function(){
var
detail_btn
=
'<a href="{% url "assets:idc-detail" pk=99991937 %}">'
+
cellData
+
'</a>'
;
$
(
td
).
html
(
detail_btn
.
replace
(
'99991937'
,
rowData
.
id
));
}},
{
#
{
targets
:
4
,
createdCell
:
function
(
td
,
cellData
)
{
#
}
{
#
var
innerHtml
=
cellData
.
length
>
8
?
cellData
.
substring
(
0
,
8
)
+
'...'
:
cellData
;
#
}
{
#
$
(
td
).
html
(
'<a href="javascript:void(0);" data-toggle="tooltip" title="'
+
cellData
+
'">'
+
innerHtml
+
'</a>'
);
#
}
{
#
}},
#
}
{
#
{
targets
:
6
,
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
:
6
,
createdCell
:
function
(
td
,
cellData
,
rowData
)
{
var
update_btn
=
'<a href="{% url "assets:idc-update" pk=99991937 %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'
.
replace
(
'99991937'
,
cellData
);
var
del_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn_
user
_delete" data-uid="99991937">{% trans "Delete" %}</a>'
.
replace
(
'99991937'
,
cellData
);
var
del_btn
=
'<a class="btn btn-xs btn-danger m-l-xs btn_
idc
_delete" data-uid="99991937">{% trans "Delete" %}</a>'
.
replace
(
'99991937'
,
cellData
);
$
(
td
).
html
(
update_btn
+
del_btn
)
}}],
ajax_url
:
'{% url "api-assets:idc-list" %}'
,
...
...
@@ -56,6 +62,64 @@ $(document).ready(function(){
op_html
:
$
(
'#actions'
).
html
()
};
jumpserver
.
initDataTable
(
options
);
})
.
on
(
'click'
,
'.btn_idc_delete'
,
function
()
{
var
$this
=
$
(
this
);
var
$data_table
=
$
(
'#idc_list_table'
).
DataTable
();
var
name
=
$
(
this
).
closest
(
"tr"
).
find
(
":nth-child(2)"
).
children
(
'a'
).
html
();
var
uid
=
$this
.
data
(
'uid'
);
var
the_url
=
'{% url "api-assets:idc-detail" pk=99991937 %}'
.
replace
(
'99991937'
,
uid
);
objectDelete
(
$this
,
name
,
the_url
);
$data_table
.
ajax
.
reload
();
{
#
TODO
:
reload
the
tale
#
}
})
.
on
(
'click'
,
'#btn_bulk_update'
,
function
()
{
var
action
=
$
(
'#slct_bulk_update'
).
val
();
var
$data_table
=
$
(
'#idc_list_table'
).
DataTable
();
var
id_list
=
[];
var
plain_id_list
=
[];
$data_table
.
rows
({
selected
:
true
}).
every
(
function
(){
id_list
.
push
({
id
:
this
.
data
().
id
});
plain_id_list
.
push
(
this
.
data
().
id
);
});
if
(
id_list
===
[])
{
return
false
;
}
var
the_url
=
"{% url 'api-assets:idc-list' %}"
;
function
doDelete
()
{
swal
({
title
:
"{% trans 'Are you sure?' %}"
,
text
:
"{% trans 'This will delete the selected idc !!!' %}"
,
type
:
"warning"
,
showCancelButton
:
true
,
confirmButtonColor
:
"#DD6B55"
,
confirmButtonText
:
"{% trans 'Confirm' %}"
,
closeOnConfirm
:
false
},
function
()
{
var
success
=
function
()
{
var
msg
=
"{% trans 'IDC Deleted.' %}"
;
swal
(
"{% trans 'IDC Delete' %}"
,
msg
,
"success"
);
$
(
'#idc_list_table'
).
DataTable
().
ajax
.
reload
();
};
var
fail
=
function
()
{
var
msg
=
"{% trans 'IDC Deleting failed.' %}"
;
swal
(
"{% trans 'IDC Delete' %}"
,
msg
,
"error"
);
};
var
url_delete
=
the_url
+
'?id__in='
+
JSON
.
stringify
(
plain_id_list
);
APIUpdateAttr
({
url
:
url_delete
,
method
:
'DELETE'
,
success
:
success
,
error
:
fail
});
$data_table
.
ajax
.
reload
();
jumpserver
.
checked
=
false
;
});
}
switch
(
action
)
{
case
'delete'
:
doDelete
();
break
;
default
:
break
;
}
});
</script>
{% endblock %}
...
...
apps/assets/templates/assets/system_user_asset.html
View file @
dbdb8a58
This diff is collapsed.
Click to expand it.
apps/assets/templates/assets/system_user_list.html
View file @
dbdb8a58
...
...
@@ -26,10 +26,23 @@
<tbody>
</tbody>
</table>
<div
id=
"actions"
class=
"hide"
>
<div
class=
"input-group"
>
<select
class=
"form-control m-b"
style=
"width: auto"
id=
"slct_bulk_update"
>
<option
value=
"delete"
>
{% trans 'Delete selected' %}
</option>
<option
value=
"update"
>
{% trans 'Update selected' %}
</option>
</select>
<div
class=
"input-group-btn pull-left"
style=
"padding-left: 5px;"
>
<button
id=
'btn_bulk_update'
style=
"height: 32px;"
class=
"btn btn-sm btn-warning"
>
{% trans 'Submit' %}
</button>
</div>
</div>
</div>
{% endblock %}
{% block custom_foot_js %}
<script>
$
(
document
).
ready
(
function
(){
$
(
document
).
ready
(
function
(){
var
options
=
{
ele
:
$
(
'#system_user_list_table'
),
columnDefs
:
[
...
...
@@ -50,9 +63,73 @@
ajax_url
:
'{% url "api-assets:system-user-list" %}'
,
columns
:
[{
data
:
"id"
},
{
data
:
"name"
},
{
data
:
"username"
},
{
data
:
"assets_amount"
},
{
data
:
function
()
{
return
"3"
}},
{
data
:
"comment"
},
{
data
:
"id"
}],
op_html
:
$
(
'#actions'
).
html
()
};
jumpserver
.
initDataTable
(
options
);
})
.
on
(
'click'
,
'.btn_admin_user_delete'
,
function
()
{
var
$this
=
$
(
this
);
var
$data_table
=
$
(
'#idc_list_table'
).
DataTable
();
var
name
=
$
(
this
).
closest
(
"tr"
).
find
(
":nth-child(2)"
).
children
(
'a'
).
html
();
var
uid
=
$this
.
data
(
'uid'
);
var
the_url
=
'{% url "api-assets:system-user-detail" pk=99991937 %}'
.
replace
(
'99991937'
,
uid
);
objectDelete
(
$this
,
name
,
the_url
);
$data_table
.
ajax
.
reload
();
})
.
on
(
'click'
,
'#btn_bulk_update'
,
function
()
{
var
action
=
$
(
'#slct_bulk_update'
).
val
();
var
$data_table
=
$
(
'#system_user_list_table'
).
DataTable
();
var
id_list
=
[];
var
plain_id_list
=
[];
$data_table
.
rows
({
selected
:
true
}).
every
(
function
(){
id_list
.
push
({
id
:
this
.
data
().
id
});
plain_id_list
.
push
(
this
.
data
().
id
);
});
if
(
id_list
===
[])
{
return
false
;
}
var
the_url
=
"{% url 'api-assets:system-user-list' %}"
;
function
doDelete
()
{
swal
({
title
:
"{% trans 'Are you sure?' %}"
,
text
:
"{% trans 'This will delete the selected System Users !!!' %}"
,
type
:
"warning"
,
showCancelButton
:
true
,
confirmButtonColor
:
"#DD6B55"
,
confirmButtonText
:
"{% trans 'Confirm' %}"
,
closeOnConfirm
:
false
},
function
()
{
var
success
=
function
()
{
var
msg
=
"{% trans 'System Users Deleted.' %}"
;
swal
(
"{% trans 'System Users Delete' %}"
,
msg
,
"success"
);
$
(
'#system_user_list_table'
).
DataTable
().
ajax
.
reload
();
};
var
fail
=
function
()
{
var
msg
=
"{% trans 'System Users Deleting failed.' %}"
;
swal
(
"{% trans 'System Users Delete' %}"
,
msg
,
"error"
);
};
var
url_delete
=
the_url
+
'?id__in='
+
JSON
.
stringify
(
plain_id_list
);
APIUpdateAttr
({
url
:
url_delete
,
method
:
'DELETE'
,
success
:
success
,
error
:
fail
});
$data_table
.
ajax
.
reload
();
jumpserver
.
checked
=
false
;
});
}
function
doUpdate
()
{
{
#
TODO
:
bulk
update
the
System
Users
#
}
}
switch
(
action
)
{
case
'delete'
:
doDelete
();
break
;
case
'update'
:
doUpdate
();
break
;
default
:
break
;
}
})
</script>
{% endblock %}
...
...
apps/assets/urls/api_urls.py
View file @
dbdb8a58
...
...
@@ -2,16 +2,18 @@
from
django.conf.urls
import
url
from
..
import
api
from
rest_framework
import
routers
from
rest_framework_bulk.routes
import
BulkRouter
app_name
=
'assets'
router
=
routers
.
Default
Router
()
router
=
Bulk
Router
()
router
.
register
(
r'v1/asset-groups'
,
api
.
AssetGroupViewSet
,
'asset-group'
)
router
.
register
(
r'v1/assets'
,
api
.
AssetViewSet
,
'asset'
)
router
.
register
(
r'v1/idc'
,
api
.
IDCViewSet
,
'idc'
)
router
.
register
(
r'v1/admin-user'
,
api
.
AdminUserViewSet
,
'admin-user'
)
router
.
register
(
r'v1/system-user'
,
api
.
SystemUserViewSet
,
'system-user'
)
router
.
register
(
r'v1/tags'
,
api
.
TagViewSet
,
'asset-tag'
)
urlpatterns
=
[
url
(
r'^v1/assets_bulk/$'
,
api
.
AssetListUpdateApi
.
as_view
(),
name
=
'asset-bulk-update'
),
...
...
@@ -20,8 +22,31 @@ urlpatterns = [
url
(
r'^v1/assets/(?P<pk>\d+)/groups/$'
,
api
.
AssetUpdateGroupApi
.
as_view
(),
name
=
'asset-update-group'
),
url
(
r'^v1/assets/(?P<pk>\d+)/system-users/$'
,
api
.
SystemUserUpdateApi
.
as_view
(),
name
=
'asset-update-systemusers'
),
## update the system users, which add and delete the asset to the system user
url
(
r'^v1/system_user/(?P<pk>\d+)/assets/$'
,
api
.
SystemUserUpdateAssetsApi
.
as_view
(),
name
=
'systemuser-update-assets'
),
url
(
r'^v1/system_user/(?P<pk>\d+)/groups/$'
,
api
.
SystemUserUpdateAssetGroupApi
.
as_view
(),
name
=
'systemuser-update-assetgroups'
),
## update the asset group, which add or delete the asset to the group
url
(
r'^v1/groups/(?P<pk>\d+)/assets/$'
,
api
.
AssetGroupUpdateApi
.
as_view
(),
name
=
'asset-groups-update'
),
## update the asset group, and add or delete the system_user to the group
url
(
r'^v1/groups/(?P<pk>\d+)/system-users/$'
,
api
.
AssetGroupUpdateSystemUserApi
.
as_view
(),
name
=
'asset-groups-update-systemusers'
),
## update the IDC, and add or delete the assets to the IDC
url
(
r'^v1/idc/(?P<pk>\d+)/assets/$'
,
api
.
IDCupdateAssetsApi
.
as_view
(),
name
=
'idc-update-assets'
),
url
(
r'v1/tag/(?P<pk>\d+)/assets/$'
,
api
.
TagUpdateAssetsApi
.
as_view
(),
name
=
'tag-update-assets'
),
]
urlpatterns
+=
router
.
urls
...
...
apps/assets/views.py
View file @
dbdb8a58
...
...
@@ -16,7 +16,7 @@ from django.urls import reverse_lazy
from
django.contrib.messages.views
import
SuccessMessageMixin
from
django.views.generic.detail
import
DetailView
,
SingleObjectMixin
from
django.shortcuts
import
get_object_or_404
,
reverse
,
redirect
from
django.http
import
HttpResponse
,
JsonResponse
from
django.http
import
HttpResponse
,
JsonResponse
,
HttpResponseRedirect
from
django.views.decorators.csrf
import
csrf_protect
,
csrf_exempt
from
django.utils.decorators
import
method_decorator
from
django.core.cache
import
cache
...
...
@@ -37,8 +37,10 @@ class AssetListView(AdminUserRequiredMixin, TemplateView):
context
=
{
'app'
:
'Assets'
,
'action'
:
'asset list'
,
'tag_list'
:
[(
i
.
id
,
i
.
name
,
i
.
asset_set
.
all
()
.
count
())
for
i
in
Tag
.
objects
.
all
()
.
order_by
(
'name'
)]
'groups'
:
AssetGroup
.
objects
.
all
(),
'system_users'
:
SystemUser
.
objects
.
all
(),
'tag_list'
:
[(
i
.
id
,
i
.
name
,
i
.
assets
.
all
()
.
count
())
for
i
in
Tag
.
objects
.
all
()
.
order_by
(
'name'
)],
'tags'
:
Tag
.
objects
.
all
()
.
order_by
(
'name'
)
}
kwargs
.
update
(
context
)
return
super
(
AssetListView
,
self
)
.
get_context_data
(
**
kwargs
)
...
...
@@ -261,6 +263,8 @@ class AssetGroupListView(AdminUserRequiredMixin, TemplateView):
context
=
{
'app'
:
_
(
'Assets'
),
'action'
:
_
(
'Asset group list'
),
'assets'
:
Asset
.
objects
.
all
(),
'system_users'
:
SystemUser
.
objects
.
all
(),
'keyword'
:
self
.
request
.
GET
.
get
(
'keyword'
,
''
)
}
kwargs
.
update
(
context
)
...
...
@@ -280,6 +284,7 @@ class AssetGroupDetailView(AdminUserRequiredMixin, DetailView):
'app'
:
_
(
'Assets'
),
'action'
:
_
(
'Asset group detail'
),
'assets_remain'
:
assets_remain
,
'assets'
:
[
asset
for
asset
in
Asset
.
objects
.
all
()
if
asset
not
in
assets_remain
],
'system_users'
:
system_users
,
'system_users_remain'
:
system_users_remain
,
}
...
...
@@ -383,6 +388,22 @@ class IDCAssetsView(AdminUserRequiredMixin, DetailView):
template_name
=
'assets/idc_assets.html'
context_object_name
=
'idc'
def
get_context_data
(
self
,
**
kwargs
):
assets_remain
=
Asset
.
objects
.
exclude
(
id__in
=
self
.
object
.
assets
.
all
())
context
=
{
'app'
:
_
(
'Assets'
),
'action'
:
_
(
'Asset detail'
),
'groups'
:
AssetGroup
.
objects
.
all
(),
'system_users'
:
SystemUser
.
objects
.
all
(),
'tags'
:
Tag
.
objects
.
all
(),
'assets_remain'
:
assets_remain
,
'assets'
:
[
asset
for
asset
in
Asset
.
objects
.
all
()
if
asset
not
in
assets_remain
],
}
kwargs
.
update
(
context
)
return
super
(
IDCAssetsView
,
self
)
.
get_context_data
(
**
kwargs
)
class
IDCDeleteView
(
AdminUserRequiredMixin
,
DeleteView
):
model
=
IDC
...
...
@@ -477,10 +498,19 @@ class AdminUserDetailView(AdminUserRequiredMixin, SingleObjectMixin, ListView):
def
get_queryset
(
self
):
return
self
.
object
.
assets
.
all
()
# def get_asset_groups(self):
# return self.object.asset_groups.all()
def
get_context_data
(
self
,
**
kwargs
):
asset_groups
=
AssetGroup
.
objects
.
all
()
assets
=
self
.
get_queryset
()
context
=
{
'app'
:
'assets'
,
'action'
:
'Admin user detail'
'action'
:
'Admin user detail'
,
'assets_remain'
:
[
asset
for
asset
in
Asset
.
objects
.
all
()
if
asset
not
in
assets
],
'asset_groups'
:
asset_groups
,
# 'asset_groups_remain': [asset_group for asset_group in AssetGroup.objects.all()
# if asset_group not in asset_groups]
}
kwargs
.
update
(
context
)
return
super
(
AdminUserDetailView
,
self
)
.
get_context_data
(
**
kwargs
)
...
...
@@ -630,7 +660,7 @@ class TagsListView(AdminUserRequiredMixin, ListView):
return
super
(
TagsListView
,
self
)
.
get_context_data
(
**
kwargs
)
class
AssetTagCreateView
(
AdminUserRequiredMixin
,
CreateView
):
class
AssetTagCreateView
(
AdminUserRequiredMixin
,
Create
AssetTagsMiXin
,
Create
View
):
model
=
Tag
form_class
=
forms
.
AssetTagForm
template_name
=
'assets/asset_tag_create.html'
...
...
@@ -653,7 +683,7 @@ class AssetTagCreateView(AdminUserRequiredMixin, CreateView):
assets_id_list
=
self
.
request
.
POST
.
getlist
(
'assets'
,
[])
assets
=
[
get_object_or_404
(
Asset
,
id
=
int
(
asset_id
))
for
asset_id
in
assets_id_list
]
asset_tag
.
created_by
=
self
.
request
.
user
.
username
or
'Admin'
asset_tag
.
asset_set
.
add
(
*
tuple
(
assets
))
asset_tag
.
assets
.
add
(
*
tuple
(
assets
))
asset_tag
.
save
()
return
super
(
AssetTagCreateView
,
self
)
.
form_valid
(
form
)
...
...
@@ -662,18 +692,22 @@ class AssetTagDetailView(SingleObjectMixin, AdminUserRequiredMixin, ListView):
template_name
=
'assets/asset_tag_detail.html'
paginate_by
=
settings
.
CONFIG
.
DISPLAY_PER_PAGE
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
self
.
object
=
self
.
get_object
(
queryset
=
Tag
.
objects
.
all
())
return
super
(
AssetTagDetailView
,
self
)
.
get
(
request
,
*
args
,
**
kwargs
)
def
get_queryset
(
self
):
return
self
.
object
.
asset_set
.
all
()
return
self
.
object
.
assets
.
all
()
def
get_context_data
(
self
,
**
kwargs
):
assets_remain
=
Asset
.
objects
.
exclude
(
id__in
=
self
.
object
.
assets
.
all
())
context
=
{
'app'
:
_
(
'Tag'
),
'action'
:
_
(
'Asset Tags detail'
),
'asset_tag'
:
self
.
object
,
'assets_remain'
:
assets_remain
,
'assets'
:
[
asset
for
asset
in
Asset
.
objects
.
all
()
if
asset
not
in
assets_remain
]
}
kwargs
.
update
(
context
)
return
super
(
AssetTagDetailView
,
self
)
.
get_context_data
(
**
kwargs
)
...
...
@@ -690,7 +724,7 @@ class AssetTagUpdateView(AdminUserRequiredMixin, UpdateView):
return
super
(
AssetTagUpdateView
,
self
)
.
get
(
request
,
*
args
,
**
kwargs
)
def
get_context_data
(
self
,
**
kwargs
):
assets_all
=
self
.
object
.
asset_set
.
all
()
assets_all
=
self
.
object
.
assets
.
all
()
context
=
{
'app'
:
_
(
'Tag'
),
'action'
:
_
(
'Asset Tags detail'
),
...
...
@@ -713,9 +747,9 @@ class AssetExportView(View):
@staticmethod
def
get_asset_attr
(
asset
,
attr
):
if
attr
in
[
'admin_user'
,
'idc'
]:
return
getattr
(
asset
,
attr
)
.
name
elif
attr
in
[
'status'
,
'type'
,
'env'
]:
return
getattr
(
asset
,
'get_{}_display'
.
format
(
attr
))(
)
return
getattr
(
asset
,
attr
)
#
elif attr in ['status', 'type', 'env']:
# return getattr(asset, 'get_{}_display'.format(attr)
)
else
:
return
getattr
(
asset
,
attr
)
...
...
@@ -735,8 +769,10 @@ class AssetExportView(View):
ws
.
append
(
header
)
for
asset
in
assets
:
print
[
self
.
get_asset_attr
(
asset
,
attr
)
for
attr
in
header
]
ws
.
append
([
self
.
get_asset_attr
(
asset
,
attr
)
for
attr
in
header
])
filename
=
'assets-{}.xlsx'
.
format
(
timezone
.
localtime
(
timezone
.
now
())
.
strftime
(
'
%
Y-
%
m-
%
d_
%
H-
%
M-
%
S'
))
response
=
HttpResponse
(
save_virtual_workbook
(
wb
),
content_type
=
'application/vnd.ms-excel'
)
response
[
'Content-Disposition'
]
=
'attachment; filename="
%
s"'
%
filename
...
...
@@ -745,13 +781,13 @@ class AssetExportView(View):
def
post
(
self
,
request
,
*
args
,
**
kwargs
):
try
:
assets_id
=
json
.
loads
(
request
.
body
)
.
get
(
'assets_id'
,
[])
print
(
assets_id
)
except
ValueError
:
return
HttpResponse
(
'Json object not valid'
,
status
=
400
)
spm
=
uuid
.
uuid4
()
.
get_hex
()
cache
.
set
(
spm
,
assets_id
,
300
)
url
=
reverse
(
'assets:asset-export'
)
+
'?spm=
%
s'
%
spm
return
JsonResponse
({
'redirect'
:
url
})
print
url
return
HttpResponse
({
'redirect'
:
url
})
class
BulkImportAssetView
(
AdminUserRequiredMixin
,
JSONResponseMixin
,
FormView
):
...
...
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