Commit 968b1b4c authored by ibuler's avatar ibuler

Stash

parent afb92373
# ~*~ coding: utf-8 ~*~ # ~*~ coding: utf-8 ~*~
from rest_framework import serializers from rest_framework import viewsets, generics, mixins
from rest_framework import viewsets, serializers, generics
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin, ListBulkCreateUpdateDestroyAPIView from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin, ListBulkCreateUpdateDestroyAPIView
from django.shortcuts import get_object_or_404
from common.mixins import BulkDeleteApiMixin from common.mixins import BulkDeleteApiMixin
from common.utils import get_object_or_none, signer from common.utils import get_object_or_none, signer
from .hands import IsSuperUserOrTerminalUser, IsSuperUser from .hands import IsSuperUserOrTerminalUser, IsSuperUser
from .models import AssetGroup, Asset, IDC, SystemUser from .models import AssetGroup, Asset, IDC, SystemUser, AdminUser
from .serializers import AssetBulkUpdateSerializer from . import serializers
class AssetGroupSerializer(serializers.ModelSerializer):
class Meta:
model = AssetGroup
class AssetSerializer(serializers.ModelSerializer):
class Meta:
model = Asset
# fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
class IDCSerializer(serializers.ModelSerializer):
class Meta:
model = IDC
# fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
class AssetGroupViewSet(viewsets.ModelViewSet): class AssetGroupViewSet(viewsets.ModelViewSet):
...@@ -35,26 +18,50 @@ class AssetGroupViewSet(viewsets.ModelViewSet): ...@@ -35,26 +18,50 @@ class AssetGroupViewSet(viewsets.ModelViewSet):
some other comment some other comment
""" """
queryset = AssetGroup.objects.all() queryset = AssetGroup.objects.all()
serializer_class = AssetGroupSerializer serializer_class = serializers.AssetGroupSerializer
class AssetViewSet(viewsets.ModelViewSet): class AssetViewSet(viewsets.ModelViewSet):
"""API endpoint that allows Asset to be viewed or edited.""" """API endpoint that allows Asset to be viewed or edited."""
queryset = Asset.objects.all() queryset = Asset.objects.all()
serializer_class = AssetSerializer serializer_class = serializers.AssetSerializer
class IDCViewSet(viewsets.ReadOnlyModelViewSet): class IDCViewSet(viewsets.ModelViewSet):
"""API endpoint that allows IDC to be viewed or edited.""" """API endpoint that allows IDC to be viewed or edited."""
queryset = IDC.objects.all() queryset = IDC.objects.all()
serializer_class = IDCSerializer serializer_class = serializers.IDCSerializer
permission_classes = (IsSuperUser,)
class AdminUserViewSet(viewsets.ModelViewSet):
queryset = AdminUser.objects.all()
serializer_class = serializers.AdminUserSerializer
permission_classes = (IsSuperUser,)
class SystemUserViewSet(viewsets.ModelViewSet):
queryset = SystemUser.objects.all()
serializer_class = serializers.SystemUserSerializer
permission_classes = (IsSuperUser,) permission_classes = (IsSuperUser,)
class IDCAssetsApi(generics.ListAPIView):
model = IDC
serializer_class = serializers.AssetSerializer
def get(self, request, *args, **kwargs):
filter_kwargs = {self.lookup_field: self.kwargs[self.lookup_field]}
self.object = get_object_or_404(self.model, **filter_kwargs)
return super(IDCAssetsApi, self).get(request, *args, **kwargs)
def get_queryset(self):
return self.object.assets.all()
class AssetListUpdateApi(BulkDeleteApiMixin, ListBulkCreateUpdateDestroyAPIView): class AssetListUpdateApi(BulkDeleteApiMixin, ListBulkCreateUpdateDestroyAPIView):
queryset = Asset.objects.all() queryset = Asset.objects.all()
serializer_class = AssetBulkUpdateSerializer serializer_class = serializers.AssetBulkUpdateSerializer
permission_classes = (IsSuperUser,) permission_classes = (IsSuperUser,)
......
...@@ -329,6 +329,7 @@ class Asset(models.Model): ...@@ -329,6 +329,7 @@ class Asset(models.Model):
def __unicode__(self): def __unicode__(self):
return '%(ip)s:%(port)s' % {'ip': self.ip, 'port': self.port} return '%(ip)s:%(port)s' % {'ip': self.ip, 'port': self.port}
@property
def is_valid(self): def is_valid(self):
warning = '' warning = ''
if not self.is_active: if not self.is_active:
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework import viewsets, serializers,generics from rest_framework import viewsets, serializers,generics
from .models import AssetGroup, Asset, IDC, AssetExtend from .models import AssetGroup, Asset, IDC, AssetExtend, AdminUser, SystemUser
from common.mixins import BulkDeleteApiMixin from common.mixins import BulkDeleteApiMixin
from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin from rest_framework_bulk import BulkListSerializer, BulkSerializerMixin
...@@ -14,11 +14,47 @@ class AssetBulkUpdateSerializer(BulkSerializerMixin, serializers.ModelSerializer ...@@ -14,11 +14,47 @@ class AssetBulkUpdateSerializer(BulkSerializerMixin, serializers.ModelSerializer
class Meta(object): class Meta(object):
model = Asset model = Asset
list_serializer_class = BulkListSerializer list_serializer_class = BulkListSerializer
fields = ['id', 'port', 'idc'] fields = ('id', 'port', 'idc')
# def get_group_display(self, obj): # def get_group_display(self, obj):
# return " ".join([group.name for group in obj.groups.all()]) # return " ".join([group.name for group in obj.groups.all()])
# #
# def get_active_display(self, obj): # def get_active_display(self, obj):
# # TODO: user ative state # # TODO: user ative state
# return not (obj.is_expired and obj.is_active) # return not (obj.is_expired and obj.is_active)
\ No newline at end of file
class AssetGroupSerializer(serializers.ModelSerializer):
class Meta:
model = AssetGroup
class AssetSerializer(serializers.ModelSerializer):
class Meta:
model = Asset
class AdminUserSerializer(serializers.ModelSerializer):
class Meta:
model = AdminUser
class SystemUserSerializer(serializers.ModelSerializer):
class Meta:
model = SystemUser
class IDCSerializer(serializers.ModelSerializer):
assets_amount = serializers.SerializerMethodField()
class Meta:
model = IDC
@staticmethod
def get_assets_amount(obj):
return obj.assets.count()
def get_field_names(self, declared_fields, info):
fields = super(IDCSerializer, self).get_field_names(declared_fields, info)
fields.append('assets_amount')
return fields
{% extends '_base_list.html' %} {% extends '_base_list.html' %}
{% load i18n %} {#{% load i18n %}#}
{% load common_tags %} {#{% load common_tags %}#}
{% block content_left_head %} {#{% block content_left_head %}#}
<a href="{% url 'assets:admin-user-create' %}" class="btn btn-sm btn-primary "> {% trans "Create admin user" %} </a> {# <a href="{% url 'assets:admin-user-create' %}" class="btn btn-sm btn-primary "> {% trans "Create admin user" %} </a>#}
{% endblock %} {#{% endblock %}#}
{##}
{#{% block table_head %}#}
{# <th class="text-center">{% trans 'ID' %}</th>#}
{# <th class="text-center"><a href="{% url 'assets:admin-user-list' %}?sort=name">{% trans 'Name' %}</a></th>#}
{# <th class="text-center"><a href="{% url 'assets:admin-user-list' %}?sort=username">{% trans 'Username' %}</a></th>#}
{# <th class="text-center">{% trans 'Asset num' %}</th>#}
{# <th class="text-center">{% trans 'Lost connection' %}</th>#}
{# <th class="text-center">{% trans 'Comment' %}</th>#}
{# <th class="text-center"></th>#}
{#{% endblock %}#}
{##}
{#{% block table_body %}#}
{# {% for admin_user in admin_user_list %}#}
{# <tr class="gradeX">#}
{# <td class="text-center">{{ admin_user.id }}</td>#}
{# <td>#}
{# <a href="{% url 'assets:admin-user-detail' pk=admin_user.id %}">#}
{# {{ admin_user.name }}#}
{# </a>#}
{# </td>#}
{# <td class="text-center">{{ admin_user.username }}</td>#}
{# <td class="text-center">{{ admin_user.assets.count }}</td>#}
{# <td class="text-center">{{ admin_user.assets.count }}</td>#}
{# <td class="text-center">{{ admin_user.comment|truncatewords:8 }}</td>#}
{# <td class="text-center">#}
{# <!-- Todo: Click script button will paste a url to clipboard like: curl http://url/admin_user_create.sh | bash -->#}
{# <a href="{% url 'assets:admin-user-update' pk=admin_user.id %}" class="btn btn-xs btn-primary">{% trans 'Script' %}</a>#}
{# <!-- Todo: Click refresh button will run a task to test admin user could connect asset or not immediately -->#}
{# <a href="{% url 'assets:admin-user-update' pk=admin_user.id %}" class="btn btn-xs btn-warning">{% trans 'Refresh' %}</a>#}
{# <a href="{% url 'assets:admin-user-update' pk=admin_user.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>#}
{# <a onclick="obj_del(this,'{{ admin_user.name }}','{% url 'assets:admin-user-delete' admin_user.id %}')" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a>#}
{# </td>#}
{# </tr>#}
{# {% endfor %}#}
{#{% endblock %}#}
{% extends '_base_list.html' %}
{% load i18n static %}
{% block custom_head_css_js %}
{{ block.super }}
<style>
div.dataTables_wrapper div.dataTables_filter,
.dataTables_length {
float: right !important;
}
{% block table_head %} div.dataTables_wrapper div.dataTables_filter {
<th class="text-center">{% trans 'ID' %}</th> margin-left: 15px;
<th class="text-center"><a href="{% url 'assets:admin-user-list' %}?sort=name">{% trans 'Name' %}</a></th> }
<th class="text-center"><a href="{% url 'assets:admin-user-list' %}?sort=username">{% trans 'Username' %}</a></th> </style>
<th class="text-center">{% trans 'Asset num' %}</th>
<th class="text-center">{% trans 'Lost connection' %}</th>
<th class="text-center">{% trans 'Comment' %}</th>
<th class="text-center"></th>
{% endblock %} {% endblock %}
{% block table_search %}{% endblock %}
{% block table_body %} {% block table_container %}
{% for admin_user in admin_user_list %} <div class="uc pull-left m-l-5 m-r-5">
<tr class="gradeX"> <a href="{% url "assets:idc-create" %}" class="btn btn-sm btn-primary"> {% trans "Create IDC" %} </a>
<td class="text-center">{{ admin_user.id }}</td> </div>
<td> <table class="table table-striped table-bordered table-hover " id="admin_user_list_table" >
<a href="{% url 'assets:admin-user-detail' pk=admin_user.id %}"> <thead>
{{ admin_user.name }} <tr>
</a> <th class="text-center">
</td> <input type="checkbox" id="check_all" class="ipt_check_all" >
<td class="text-center">{{ admin_user.username }}</td> </th>
<td class="text-center">{{ admin_user.assets.count }}</td> <th class="text-center">{% trans 'Name' %}</th>
<td class="text-center">{{ admin_user.assets.count }}</td> <th class="text-center">{% trans 'Username' %}</th>
<td class="text-center">{{ admin_user.comment|truncatewords:8 }}</td> <th class="text-center">{% trans 'Asset num' %}</th>
<td class="text-center"> <th class="text-center">{% trans 'Lost connection' %}</th>
<!-- Todo: Click script button will paste a url to clipboard like: curl http://url/admin_user_create.sh | bash --> <th class="text-center">{% trans 'Comment' %}</th>
<a href="{% url 'assets:admin-user-update' pk=admin_user.id %}" class="btn btn-xs btn-primary">{% trans 'Script' %}</a> <th class="text-center"></th>
<!-- Todo: Click refresh button will run a task to test admin user could connect asset or not immediately --> </tr>
<a href="{% url 'assets:admin-user-update' pk=admin_user.id %}" class="btn btn-xs btn-warning">{% trans 'Refresh' %}</a> </thead>
<a href="{% url 'assets:admin-user-update' pk=admin_user.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a> <tbody>
<a onclick="obj_del(this,'{{ admin_user.name }}','{% url 'assets:admin-user-delete' admin_user.id %}')" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a> </tbody>
</td> </table>
</tr> {% endblock %}
{% endfor %} {% block content_bottom_left %}{% endblock %}
{% block custom_foot_js %}
<script>
$(document).ready(function(){
var options = {
ele: $('#admin_user_list_table'),
columnDefs: [
{targets: 1, createdCell: function (td, cellData, rowData) {
var detail_btn = '<a href="{% url "assets:admin-user-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);
$(td).html(update_btn + del_btn)
}}],
ajax_url: '{% url "assets:idc-list-create-api" %}',
columns: [{data: function(){return ""}}, {data: "name" }, {data: "assets_amount" }, {data: "contact" }, {data: "phone" },
{data: "operator" }, {data: "id" }],
op_html: $('#actions').html()
};
jumpserver.initDataTable(options);
});
</script>
{% endblock %} {% endblock %}
...@@ -7,19 +7,19 @@ ...@@ -7,19 +7,19 @@
<script src="{% static 'js/plugins/select2/select2.full.min.js' %}"></script> <script src="{% static 'js/plugins/select2/select2.full.min.js' %}"></script>
<style> <style>
div.dataTables_wrapper div.dataTables_filter { div.dataTables_wrapper div.dataTables_filter {
margin-left: 15px; margin-left: 15px;
float: right !important; float: right !important;
}
div.dataTables_wrapper div.dataTables_filter,
.dataTables_length {
float: right !important;
}
.custom{
/*float:left;*/
margin-right:5px;
} }
#modal .modal-body { max-height: 200px; } div.dataTables_wrapper div.dataTables_filter,
.dataTables_length {
float: right !important;
}
.custom{
/*float:left;*/
margin-right:5px;
}
#modal .modal-body { max-height: 200px; }
</style> </style>
{% endblock %} {% endblock %}
{% block content_left_head %}{% endblock %} {% block content_left_head %}{% endblock %}
...@@ -80,7 +80,8 @@ div.dataTables_wrapper div.dataTables_filter, ...@@ -80,7 +80,8 @@ div.dataTables_wrapper div.dataTables_filter,
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'assets:asset-update' pk=asset.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a> <a href="{% url 'assets:asset-update' pk=asset.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a>
<a onclick="objectDelete(this,'{{ asset.hostname }}','{% url 'assets:asset-delete' pk=asset.id %}')" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a> <a onclick="objectDelete(this,'{{ asset.hostname }}','{% url 'assets:asset-detail-update-delete-api' pk=asset.id %}')" class="btn btn-xs btn-danger del">
{% trans 'Delete' %}</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
...@@ -190,7 +191,7 @@ div.dataTables_wrapper div.dataTables_filter, ...@@ -190,7 +191,7 @@ div.dataTables_wrapper div.dataTables_filter,
}else{ }else{
$(this).addClass('selected'); $(this).addClass('selected');
this.children[0].children[0].checked=1; this.children[0].children[0].checked=1;
}; }
}); });
$('#btn_bulk_update').on('click',function(){ $('#btn_bulk_update').on('click',function(){
...@@ -201,7 +202,7 @@ div.dataTables_wrapper div.dataTables_filter, ...@@ -201,7 +202,7 @@ div.dataTables_wrapper div.dataTables_filter,
for(var i=0;i<column2.length;i++){ for(var i=0;i<column2.length;i++){
id_list.push({id: column2[i].id,hostname:column2[i].ip}); id_list.push({id: column2[i].id,hostname:column2[i].ip});
plain_id_list.push(parseInt(column2[i].id)); plain_id_list.push(parseInt(column2[i].id));
}; }
var url_delete = the_url + '?id__in=' + JSON.stringify(plain_id_list); var url_delete = the_url + '?id__in=' + JSON.stringify(plain_id_list);
//APIUpdateAttr({url: url_delete, method: 'DELETE', success: success, error: fail}); //APIUpdateAttr({url: url_delete, method: 'DELETE', success: success, error: fail});
...@@ -227,18 +228,18 @@ div.dataTables_wrapper div.dataTables_filter, ...@@ -227,18 +228,18 @@ div.dataTables_wrapper div.dataTables_filter,
} }
}); });
}); });
}; }
function doUpdate() { function doUpdate() {
// alert(plain_id_list); // alert(plain_id_list);
// $('#asset_bulk_update_modal').modal('show'); // $('#asset_bulk_update_modal').modal('show');
window.location.href="{% url 'assets:asset-modal-update' %}?plain_id_lists="+plain_id_list window.location.href="{% url 'assets:asset-modal-update' %}?plain_id_lists="+plain_id_list
}; }
var action = $('#slct_bulk_update option:selected').val(); var action = $('#slct_bulk_update option:selected').val();
if (id_list.length === 0) { if (id_list.length === 0) {
action = 'default'; action = 'default';
}; }
switch(action) { switch(action) {
case 'deactive': case 'deactive':
alert(action+"未完成"); alert(action+"未完成");
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<body> <body>
<form action="" method="post"> <form action="" method="post">
{% csrf_token %} {% csrf_token %}
<p>Are you sure you want to delete "{{ object.name }}"?</p> <p>{% trans 'Are you sure delete' %} <b>{{ object.name }} </b> ?</p>
<input type="submit" value="Confirm" /> <input type="submit" value="Confirm" />
</form> </form>
</body> </body>
......
{% extends 'base.html' %}
{% load common_tags %}
{% load users_tags %}
{% load static %}
{% load i18n %}
{% 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>
<style>
div.dataTables_wrapper div.dataTables_filter,
.dataTables_length {
float: right !important;
}
div.dataTables_wrapper div.dataTables_filter {
margin-left: 15px;
}
</style>
{% endblock %}
{% block content %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="panel-options">
<ul class="nav nav-tabs">
<li>
<a href="{% url 'assets:idc-detail' pk=idc.id %}" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Detail' %} </a>
</li>
<li class="active"><a href="{% url 'assets:idc-assets' pk=idc.id %}" class="text-center">
<i class="fa fa-bar-chart-o"></i> {% trans 'IDC assets' %}</a>
</li>
</ul>
</div>
<div class="tab-content">
<div class="col-sm-7" style="padding-left: 0;">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span style="float: left">{% trans 'IDC assets' %} <b>{{ idc.name }} </b><span class="badge"></span></span>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<table class="table table-striped table-bordered table-hover " id="idc_assets_table" >
<thead>
<tr>
<th class="text-center">
<input type="checkbox" id="check_all" class="ipt_check_all" >
</th>
<th>{% trans 'Hostname' %}</th>
<th>{% trans 'IP' %}</th>
<th>{% trans 'Port' %}</th>
<th>{% trans 'Type' %}</th>
<th>{% trans 'Valid' %}</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-sm-5" style="padding-left: 0;padding-right: 0">
<div class="panel panel-primary">
<div class="panel-heading">
<i class="fa fa-info-circle"></i> {% trans 'Attach to assets ' %}
</div>
<div class="panel-body">
<table class="table">
<tbody>
<form>
<tr class="no-borders-tr">
<td colspan="2">
<select data-placeholder="{% trans 'Select asset' %}" class="select2" style="width: 100%" multiple="" tabindex="4">
{% for asset in assets_remain %}
<option value="{{ asset.id }}">{{ asset.ip}}:{{ asset.port }}</option>
{% endfor %}
</select>
</td>
</tr>
<tr class="no-borders-tr">
<td colspan="2">
<button type="button" class="btn btn-primary btn-sm">{% trans 'Attach' %}</button>
</td>
</tr>
</form>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block custom_foot_js %}
<script>
$(document).ready(function () {
$('.select2').select2();
var options = {
ele: $('#idc_assets_table'),
buttons: [],
order: [],
columnDefs: [
{targets: 1, createdCell: function (td, cellData, rowData) {
var detail_btn = '<a href="{% url "assets:asset-detail" pk=99991937 %}">' + cellData + '</a>';
$(td).html(detail_btn.replace('99991937', rowData.id));
}},
{targets: 5, 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>')
}
}}],
ajax_url: '{% url "assets:idc-assets-api" pk=idc.id %}',
columns: [{data: function(){return ""}}, {data: "hostname" }, {data: "ip" }, {data: "port" },
{data: "type" }, {data: "is_active" }]
};
jumpserver.initDataTable(options);
});
</script>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% load common_tags %}
{% load users_tags %}
{% load static %}
{% load i18n %}
{% 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 content %}
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="panel-options">
<ul class="nav nav-tabs">
<li class="active">
<a href="{% url 'assets:idc-detail' pk=idc.id %}" class="text-center"><i class="fa fa-laptop"></i> {% trans 'Detail' %} </a>
</li>
<li>
<a href="{% url 'assets:idc-assets' pk=idc.id %}" class="text-center">
<i class="fa fa-bar-chart-o"></i> {% trans 'IDC assets' %}
</a>
</li>
<li class="pull-right">
<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 %}">
<i class="fa fa-edit"></i>Delete
</a>
</li>
</ul>
</div>
<div class="tab-content">
<div class="col-sm-9" style="padding-left: 0;">
<div class="ibox float-e-margins">
<div class="ibox-title">
<span class="label"><b>{{ idc.name }}</b></span>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<table class="table">
<tbody>
<tr class="no-borders-tr">
<td>{% trans 'Name' %}:</td>
<td><b>{{ idc.name }}</b></td>
</tr>
<tr>
<td>{% trans 'Bandwidth' %}:</td>
<td><b>{{ idc.bandwidth }}</b></td>
</tr>
<tr>
<td>{% trans 'Contact' %}:</td>
<td><b>{{ idc.contact }}</b></td>
</tr>
<tr>
<td>{% trans 'Phone' %}:</td>
<td><b>{{ idc.phone }}</b></td>
</tr>
<tr>
<td>{% trans 'Address' %}:</td>
<td><b>{{ idc.address }}</b></td>
</tr>
<tr>
<td>{% trans 'Intranet' %}:</td>
<td><b>{{ idc.Intranet }}</b></td>
</tr>
<tr>
<td>{% trans 'Extranet' %}:</td>
<td><b>{{ idc.extranet }}</b></td>
</tr>
<tr>
<td>{% trans 'Operator' %}:</td>
<td><b>{{ idc.operator }}</b></td>
</tr>
<tr>
<td>{% trans 'Date created' %}:</td>
<td><b>{{ system_user.date_created }}</b></td>
</tr>
<tr>
<td>{% trans 'Created by' %}:</td>
<td><b>{{ asset_group.created_by }}</b></td>
</tr>
<tr>
<td>{% trans 'Comment' %}:</td>
<td><b>{{ system_user.comment }}</b></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% 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>
{% endblock %}
\ No newline at end of file
{% extends '_base_list.html' %} {% extends '_base_list.html' %}
{% load i18n %} {% load i18n static %}
{% load common_tags %} {% block custom_head_css_js %}
{% block content_left_head %} {{ block.super }}
<a href="{% url 'assets:idc-create' %}" class="btn btn-sm btn-primary "> {% trans "Create IDC" %} </a> <style>
{% endblock %} div.dataTables_wrapper div.dataTables_filter,
.dataTables_length {
float: right !important;
}
{% block table_head %} div.dataTables_wrapper div.dataTables_filter {
<th class="text-center"> margin-left: 15px;
<input type="checkbox" id="check_all" onclick="checkAll('check_all', 'checked')"> }
</th> </style>
<th class="text-center"><a href="{% url 'assets:idc-list' %}?sort=name">{% trans 'Name' %}</a></th>
<th class="text-center">{% trans 'Asset num' %}</th>
<th class="text-center">{% trans 'Contact' %}</th>
<th class="text-center">{% trans 'Phone' %}</th>
<th class="text-center">{% trans 'operation' %}</th>
{% endblock %} {% endblock %}
{% block table_search %}{% endblock %}
{% block table_body %} {% block table_container %}
{% for idc in idc_list %} <div class="uc pull-left m-l-5 m-r-5">
<tr class="gradeX"> <a href="{% url "assets:idc-create" %}" class="btn btn-sm btn-primary"> {% trans "Create IDC" %} </a>
<td class="text-center"> </div>
<input type="checkbox" name="checked" value="{{ idc.id }}"> <table class="table table-striped table-bordered table-hover " id="idc_list_table" >
</td> <thead>
<td class="text-center">{{ idc.name }}</td> <tr>
<td class="text-center">{{ idc.assets.count }}</td> <th class="text-center">
{# <td class="text-center">{{ idc.bandwidth }}</td>#} <input type="checkbox" id="check_all" class="ipt_check_all" >
<td class="text-center">{{ idc.contact }}</td> </th>
<td class="text-center">{{ idc.phone }}</td> <th class="text-center"><a href="{% url 'assets:idc-list' %}?sort=name">{% trans 'Name' %}</a></th>
{# <td class="text-center">{{ idc.address }}</td>#} <th class="text-center">{% trans 'Asset num' %}</th>
<td class="text-center"> <th class="text-center">{% trans 'Contact' %}</th>
<a href="{% url 'assets:idc-update' pk=idc.id %}" class="btn btn-xs btn-info">{% trans 'Update' %}</a> <th class="text-center">{% trans 'Phone' %}</th>
<a onclick="objectDelete(this, '{{ idc.name }}', '{% url 'assets:idc-delete' idc.id %}')" class="btn btn-xs btn-danger del">{% trans 'Delete' %}</a> <th class="text-center">{% trans 'Operator' %}</th>
</td> <th class="text-center">{% trans 'Action' %}</th>
</tr> </tr>
{% endfor %} </thead>
<tbody>
</tbody>
</table>
{% endblock %} {% endblock %}
{% block content_bottom_left %}{% endblock %}
{% block custom_foot_js %} {% block custom_foot_js %}
<script> <script>
$(document).ready(function(){
var options = {
ele: $('#idc_list_table'),
columnDefs: [
{targets: 1, createdCell: function (td, cellData, rowData) {
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);
$(td).html(update_btn + del_btn)
}}],
ajax_url: '{% url "assets:idc-list-create-api" %}',
columns: [{data: function(){return ""}}, {data: "name" }, {data: "assets_amount" }, {data: "contact" }, {data: "phone" },
{data: "operator" }, {data: "id" }],
op_html: $('#actions').html()
};
jumpserver.initDataTable(options);
});
</script> </script>
{% endblock %} {% endblock %}
...@@ -2,14 +2,8 @@ ...@@ -2,14 +2,8 @@
from django.conf.urls import url, include from django.conf.urls import url, include
import views import views
import api import api
# from .api import ( from rest_framework import routers
# AssetGroupViewSet, AssetViewSet, IDCViewSet
# )
# from rest_framework import routers
# router = routers.DefaultRouter()
# router.register(r'assetgroup', AssetGroupViewSet)
# router.register(r'asset', AssetViewSet)
# router.register(r'idc', IDCViewSet)
app_name = 'assets' app_name = 'assets'
urlpatterns = [ urlpatterns = [
...@@ -43,6 +37,7 @@ urlpatterns = [ ...@@ -43,6 +37,7 @@ urlpatterns = [
url(r'^idc/(?P<pk>[0-9]+)$', views.IDCDetailView.as_view(), name='idc-detail'), url(r'^idc/(?P<pk>[0-9]+)$', views.IDCDetailView.as_view(), name='idc-detail'),
url(r'^idc/(?P<pk>[0-9]+)/update', views.IDCUpdateView.as_view(), name='idc-update'), url(r'^idc/(?P<pk>[0-9]+)/update', views.IDCUpdateView.as_view(), name='idc-update'),
url(r'^idc/(?P<pk>[0-9]+)/delete$', views.IDCDeleteView.as_view(), name='idc-delete'), url(r'^idc/(?P<pk>[0-9]+)/delete$', views.IDCDeleteView.as_view(), name='idc-delete'),
url(r'^idc/(?P<pk>[0-9]+)/assets$', views.IDCAssetsView.as_view(), name='idc-assets'),
# Resource admin user url # Resource admin user url
url(r'^admin-user$', views.AdminUserListView.as_view(), name='admin-user-list'), url(r'^admin-user$', views.AdminUserListView.as_view(), name='admin-user-list'),
...@@ -63,10 +58,49 @@ urlpatterns = [ ...@@ -63,10 +58,49 @@ urlpatterns = [
] ]
# router = routers.DefaultRouter()
# router.register(r'v1/asset-groups/', api.AssetGroupViewSet)
# router.register(r'v1/assets/', api.AssetViewSet)
# router.register(r'v1/idc/', api.IDCViewSet)
asset_list_view = api.AssetViewSet.as_view({
'get': 'list',
'post': 'create'
})
asset_detail_view = api.AssetViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy',
})
idc_list_view = api.IDCViewSet.as_view({
'get': 'list',
'post': 'create',
})
idc_detail_view = api.IDCViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy',
})
admin_user_list_view = api.AdminUserViewSet.as_view({
'get': 'list',
'post': 'create',
})
urlpatterns += [ urlpatterns += [
url(r'^v1/assets/$', api.AssetViewSet.as_view({'get':'list'}), name='assets-list-api'), url(r'^v1/assets/$', asset_list_view, name='asset-list-create-api'),
url(r'^v1/assets/(?P<pk>[0-9]+)/$', asset_detail_view, name='asset-detail-update-delete-api'),
url(r'^v1/assets_bulk/$', api.AssetListUpdateApi.as_view(), name='asset-bulk-update-api'), url(r'^v1/assets_bulk/$', api.AssetListUpdateApi.as_view(), name='asset-bulk-update-api'),
url(r'^v1/idc/$', api.IDCViewSet.as_view({'get':'list'}), name='idc-list-json'), url(r'^v1/idc/$', idc_list_view, name='idc-list-create-api'),
url(r'^v1/idc/(?P<pk>[0-9]+)/$', idc_detail_view, name='idc-detail-update-delete-api'),
url(r'^v1/idc/(?P<pk>[0-9]+)/assets/$', api.IDCAssetsApi.as_view(), name='idc-assets-api'),
url(r'^v1/admin-user/$', idc_list_view, name='idc-list-create-api'),
url(r'^v1/idc/(?P<pk>[0-9]+)/$', idc_detail_view, name='idc-detail-update-delete-api'),
url(r'^v1/system-user/auth/', api.SystemUserAuthApi.as_view(), name='system-user-auth'), url(r'^v1/system-user/auth/', api.SystemUserAuthApi.as_view(), name='system-user-auth'),
] ]
......
...@@ -30,14 +30,14 @@ class AssetListView(AdminUserRequiredMixin, ListView): ...@@ -30,14 +30,14 @@ class AssetListView(AdminUserRequiredMixin, ListView):
@staticmethod @staticmethod
def sorted_by_valid_and_ip(asset): def sorted_by_valid_and_ip(asset):
ip_list = int_seq(asset.ip.split('.')) ip_list = int_seq(asset.ip.split('.'))
ip_list.insert(0, asset.is_valid()[0]) ip_list.insert(0, asset.is_valid[0])
return ip_list return ip_list
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {
'app': 'Assets', 'app': 'Assets',
'action': 'asset list', 'action': 'asset list',
'tag_list': [(i.id,i.name,i.asset_set.all().count())for i in Tag.objects.all().order_by('name')] 'tag_list': [(i.id, i.name, i.asset_set.all().count())for i in Tag.objects.all().order_by('name')]
} }
kwargs.update(context) kwargs.update(context)
...@@ -341,33 +341,33 @@ class AssetGroupDeleteView(AdminUserRequiredMixin, DeleteView): ...@@ -341,33 +341,33 @@ class AssetGroupDeleteView(AdminUserRequiredMixin, DeleteView):
success_url = reverse_lazy('assets:asset-group-list') success_url = reverse_lazy('assets:asset-group-list')
class IDCListView(AdminUserRequiredMixin, ListView): class IDCListView(AdminUserRequiredMixin, TemplateView):
model = IDC # model = IDC
paginate_by = settings.CONFIG.DISPLAY_PER_PAGE # paginate_by = settings.CONFIG.DISPLAY_PER_PAGE
context_object_name = 'idc_list' # context_object_name = 'idc_list'
template_name = 'assets/idc_list.html' template_name = 'assets/idc_list.html'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {
'app': _('Assets'), 'app': _('Assets'),
'action': _('IDC list'), 'action': _('IDC list'),
'keyword': self.request.GET.get('keyword', '') # 'keyword': self.request.GET.get('keyword', '')
} }
kwargs.update(context) kwargs.update(context)
return super(IDCListView, self).get_context_data(**kwargs) return super(IDCListView, self).get_context_data(**kwargs)
def get_queryset(self): # def get_queryset(self):
self.queryset = super(IDCListView, self).get_queryset() # self.queryset = super(IDCListView, self).get_queryset()
self.keyword = keyword = self.request.GET.get('keyword', '') # self.keyword = keyword = self.request.GET.get('keyword', '')
self.sort = sort = self.request.GET.get('sort', '-date_created') # self.sort = sort = self.request.GET.get('sort', '-date_created')
#
if keyword: # if keyword:
self.queryset = self.queryset.filter(Q(name__icontains=keyword) | # self.queryset = self.queryset.filter(Q(name__icontains=keyword) |
Q(comment__icontains=keyword)) # Q(comment__icontains=keyword))
#
if sort: # if sort:
self.queryset = self.queryset.order_by(sort) # self.queryset = self.queryset.order_by(sort)
return self.queryset # return self.queryset
class IDCCreateView(AdminUserRequiredMixin, CreateView): class IDCCreateView(AdminUserRequiredMixin, CreateView):
...@@ -414,7 +414,15 @@ class IDCUpdateView(AdminUserRequiredMixin, UpdateView): ...@@ -414,7 +414,15 @@ class IDCUpdateView(AdminUserRequiredMixin, UpdateView):
class IDCDetailView(AdminUserRequiredMixin, DetailView): class IDCDetailView(AdminUserRequiredMixin, DetailView):
pass model = IDC
template_name = 'assets/idc_detail.html'
context_object_name = 'idc'
class IDCAssetsView(AdminUserRequiredMixin, DetailView):
model = IDC
template_name = 'assets/idc_assets.html'
context_object_name = 'idc'
class IDCDeleteView(AdminUserRequiredMixin, DeleteView): class IDCDeleteView(AdminUserRequiredMixin, DeleteView):
......
...@@ -234,7 +234,7 @@ class User(AbstractUser): ...@@ -234,7 +234,7 @@ class User(AbstractUser):
user.groups.add(UserGroup.initial()) user.groups.add(UserGroup.initial())
def delete(self): def delete(self):
if self.pk == 1: if self.pk == 1 or self.username == 'admin':
return return
return super(User, self).delete() return super(User, self).delete()
......
...@@ -79,7 +79,7 @@ $(document).ready(function(){ ...@@ -79,7 +79,7 @@ $(document).ready(function(){
{targets: 7, createdCell: function (td, cellData, rowData) { {targets: 7, createdCell: function (td, cellData, rowData) {
var update_btn = '<a href="{% url "users:user-update" pk=99991937 %}" class="btn btn-xs btn-info">{% trans "Update" %}</a>'.replace('99991937', cellData); var update_btn = '<a href="{% url "users:user-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_user_delete" data-uid="99991937">{% trans "Delete" %}</a>'.replace('99991937', cellData);
if (rowData.id === 1) { if (rowData.id === 1 || rowData.username == "admin") {
$(td).html(update_btn) $(td).html(update_btn)
} else { } else {
$(td).html(update_btn + del_btn) $(td).html(update_btn + del_btn)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment