Skip to content

Commit

Permalink
cabinet
Browse files Browse the repository at this point in the history
  • Loading branch information
RobbieHan committed Jan 25, 2019
1 parent cea6fa7 commit a36f8d7
Show file tree
Hide file tree
Showing 7 changed files with 478 additions and 5 deletions.
9 changes: 8 additions & 1 deletion apps/cmdb/urls.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.urls import path

from .views import CmdbView
from . import views_code, views_scan
from . import views_code, views_scan, views_eam

app_name = 'cmdb'

Expand All @@ -19,5 +19,12 @@
path('portal/device_scan/detail/', views_scan.DeviceScanDetailView.as_view(), name='portal-device_scan-detail'),
path('portal/device_scan/delete/', views_scan.DeviceScanDeleteView.as_view(), name='portal-device_scan-delete'),
path('portal/device_scan/exec/', views_scan.DeviceScanExecView.as_view(), name='portal-device_scan-exec'),
path('portal/device_scan/inbound/', views_scan.DeviceScanInboundView.as_view(), name='portal-device_scan-inbound'),

path('eam/cabinet/', views_eam.CabinetView.as_view(), name='eam-cabinet'),
path('eam/cabinet/create/', views_eam.CabinetCreateView.as_view(), name='eam-cabinet-create'),
path('eam/cabinet/update/', views_eam.CabinetUpdateView.as_view(), name='eam-cabinet-update'),
path('eam/cabinet/list/', views_eam.CabinetListView.as_view(), name='eam-cabinet-list'),
path('eam/cabinet/delete/', views_eam.CabinetDeleteView.as_view(), name='eam-cabinet-delete'),

]
38 changes: 38 additions & 0 deletions apps/cmdb/views_eam.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from django.views.generic import TemplateView

from system.mixin import LoginRequiredMixin
from custom import (BreadcrumbMixin, SandboxDeleteView,
SandboxListView, SandboxUpdateView, SandboxCreateView)
from .models import Cabinet


class CabinetView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
template_name = 'cmdb/cabinet.html'


class CabinetCreateView(SandboxCreateView):
model = Cabinet
fields = '__all__'


class CabinetUpdateView(SandboxUpdateView):
model = Cabinet
fields = '__all__'


class CabinetListView(SandboxListView):
model = Cabinet
fields = ['id', 'number', 'position', 'desc']

def get_filters(self):
data = self.request.GET
filters = {}
if 'number' in data and data['number']:
filters['number__icontains'] = data['number']
if 'position' in data and data['position']:
filters['position__icontains'] = data['position']
return filters


class CabinetDeleteView(SandboxDeleteView):
model = Cabinet
30 changes: 28 additions & 2 deletions apps/cmdb/views_scan.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
from custom import BreadcrumbMixin, SandboxListView, SandboxDeleteView
from utils.sandbox_utils import ConfigFileMixin
from system.models import Menu
from .models import DeviceScanInfo
from .models import (DeviceScanInfo, ConnectionInfo, DeviceInfo,
ConnectionAbstract, DeviceAbstract)
from .tasks import scan_execution

error_logger = logging.getLogger('sandbox_error')
Expand Down Expand Up @@ -89,4 +90,29 @@ def get(self, request):
ret['status'] = 'success'
except AlreadyQueued:
ret['status'] = 'already_queued'
return JsonResponse(ret)
return JsonResponse(ret)


class DeviceScanInboundView(LoginRequiredMixin, View):
def post(self, request):
ret = dict(result=False)
login_succeed = list(DeviceScanInfo.objects.filter(status='succeed').values())
connection_fields = [field.name for field in ConnectionAbstract._meta.fields if field.name is not 'id']
device_fields = [field.name for field in DeviceAbstract._meta.fields if field.name is not 'id']
device_fields.append('hostname')
for host in login_succeed:
connection_defaults = {key: host[key] for key in host.keys() & connection_fields}
device_defaults = {key: host[key] for key in host.keys() & device_fields}
connection_info, _ = ConnectionInfo.objects.update_or_create(
hostname=host['hostname'],
defaults=connection_defaults
)
connection_id = int(getattr(connection_info, 'id'))
device_defaults['dev_connection'] = connection_id
device_defaults['changed_by_id'] = request.user.id
DeviceInfo.objects.update_or_create(
hostname=host['hostname'],
defaults=device_defaults
)
ret['result'] = True
return JsonResponse(ret)
4 changes: 2 additions & 2 deletions apps/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,9 @@ def get_datatables_paginator(self, request):
filters = self.get_filters()
fields = self.get_fields()
if filters:
queryset = queryset.filter(**self.filters)
queryset = queryset.filter(**filters)
if fields:
queryset = queryset.values(*self.fields)
queryset = queryset.values(*fields)

record_filter_count = queryset.count()

Expand Down
276 changes: 276 additions & 0 deletions templates/cmdb/cabinet.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,276 @@
{% extends "base-left.html" %}
{% load staticfiles %}

{% block css %}
<link rel="stylesheet" href="{% static 'plugins/datatables/jquery.dataTables.min.css' %}">
<link rel="stylesheet" href="{% static 'js/plugins/layer/skin/layer.css' %}">
<link rel="stylesheet" href="{% static 'plugins/select2/select2.min.css' %}">
{% endblock %}

{% block content %}

<!-- Main content -->
<section class="content">
<div id="devlist">
<div class="box box-primary" id="liebiao">
<div class="box-header">
<div class="btn-group pull-left">
<button type="button" id="btnRefresh" class="btn btn-default">
<i class="glyphicon glyphicon-repeat"></i>刷新
</button>
</div>
<div class="btn-group pull-left">&nbsp</div>
<div class="btn-group pull-left">
<button type="button" id="btnCreate" class="btn btn-default">
<i class="glyphicon glyphicon-plus"></i>新增
</button>

</div>
<div class="btn-group pull-left">&nbsp</div>
<div class="btn-group pull-left">
<button type="button" id="btnDelete" class="btn btn-default">
<i class="glyphicon glyphicon-trash"></i>删除
</button>
</div>
<div class="pull-right">
<form class="form-inline" id="queryForm">
<div class="form-group searchArea margin-r-5 margin-top-5">
<label>机柜编号</label>
<input type="text" name="number" class="form-control inputText" id="number">
</div>
<div class="form-group searchArea margin-r-5 margin-top-5">
<label>机柜位置</label>
<input type="text" name="position" class="form-control inputText" id="position">
</div>
<button type="button" id="btnSearch" class="btn btn-default">
<i class="glyphicon glyphicon-search"></i>查询
</button>
</form>
</div>
</div>

<div class="box-body">
<table id="dtbList" class="display" cellspacing="0" width="100%">
<thead>
<tr valign="middle">
<th><input type="checkbox" id="checkAll"></th>
<th>ID</th>
<th>机柜编号</th>
<th>机柜位置</th>
<th>备注信息</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<br> <br>
</div>
</div>
</div>

</section>

<!-- /.content -->

{% endblock %}


{% block javascripts %}

<script src="{% static 'plugins/datatables/jquery.dataTables.min.js' %}"></script>
<script src="{% static 'plugins/datatables/dataTables.const-1.js' %}"></script>
<script src="{% static 'js/plugins/layer/layer.js' %}"></script>
<script src="{% static 'plugins/select2/select2.full.min.js' %}"></script>

<script type="text/javascript">
// 菜单选中高亮
$(function () {
$('#CMDB-EAM').addClass('active');
$('#CMDB-EAM-CABINET').addClass('active');

});

// datatables 初始化配置
var oDataTable = null;
$(function () {
oDataTable = initTable();

function initTable() {
var oTable = $('#dtbList').DataTable($.extend(true, {},
DATATABLES_CONSTANT.DATA_TABLES.SERVER_SIDE_OPTION,

{
ajax: {
"url": "{% url 'cmdb:eam-cabinet-list' %}",
"data": function (d) {
d.number = $("#number").val();
d.position = $("#position").val();
}
},
columns: [
DATATABLES_CONSTANT.DATA_TABLES.COLUMN.CHECKBOX,
{
data: "id",
width: "5%",
},
{
data: "number",
//width : "20%",
},
{
data: "position",
//width : "20%",
},
{
data: "desc",
//width : "20%",
},
{
data: "id",
width: "10%",
bSortable: "false",
render: function (data, type, row, meta) {
var ret = "";
var ret = "<button title='详情-修改' onclick='doUpdate("
+ data + ")'><i class='glyphicon glyphicon-pencil'></i></button>";
ret = ret + "<button title='删除' onclick='doDelete("
+ data + ")'><i class='glyphicon glyphicon-trash'></i></button>";
return ret;
}
}],
}));
return oTable;
}

});

// 刷新数据
$("#btnRefresh").click(function () {
oDataTable.ajax.reload();
});
//新建数据
$("#btnCreate").click(function () {
layer.open({
type: 2,
title: '新增',
shadeClose: false,
maxmin: true,
area: ['800px', '400px'],
content: "{% url 'cmdb:eam-cabinet-create' %}",
end: function () {
//关闭时做的事情
oDataTable.ajax.reload();
}
});
});

//修改数据
function doUpdate(id) {
layer.open({
type: 2,
title: '编辑',
shadeClose: false,
maxmin: true,
area: ['800px', '400px'],
content: ["{% url 'cmdb:eam-cabinet-update' %}" + '?id=' + id, 'no'],
end: function () {
oDataTable.ajax.reload();
}
});
}

//checkbox全选
$("#checkAll").on("click", function () {
if ($(this).prop("checked") === true) {
$("input[name='checkList']").prop("checked", $(this).prop("checked"));
$('#example tbody tr').addClass('selected');
} else {
$("input[name='checkList']").prop("checked", false);
$('#example tbody tr').removeClass('selected');
}
});

//批量删除
$("#btnDelete").click(function () {
if ($("input[name='checkList']:checked").length == 0) {
layer.msg("请选择要删除的记录");
return;
}

var arrId = new Array();
$("input[name='checkList']:checked").each(function () {
//alert($(this).val());
arrId.push($(this).val());
});

sId = arrId.join(',');

layer.alert('确定删除吗?', {
title: '提示'
, icon: 3 //0:感叹号 1对号 2差号 3问号 4小锁 5哭脸 6笑脸
, time: 0 //不自动关闭
, btn: ['YES', 'NO']
, yes: function (index) {
layer.close(index);
$.ajax({
type: "POST",
url: "{% url 'cmdb:eam-cabinet-delete' %}",
data: {"id": sId, csrfmiddlewaretoken: '{{ csrf_token }}'},
cache: false,
success: function (msg) {
if (msg.result) {
layer.alert("操作成功", {icon: 1});
oDataTable.ajax.reload();
} else {
//alert(msg.message);
layer.alert("操作失败", {icon: 2});
}
return;
}
});
}
});
});

//删除单个数据
function doDelete(id) {
layer.alert('确定删除吗?', {
title: '提示'
, icon: 3 //0:感叹号 1对号 2差号 3问号 4小锁 5哭脸 6笑脸
, time: 0 //不自动关闭
, btn: ['YES', 'NO']
, yes: function (index) {
layer.close(index);
$.ajax({
type: "POST",
url: "{% url 'cmdb:eam-cabinet-delete' %}",
data: {"id": id, csrfmiddlewaretoken: '{{ csrf_token }}'},
cache: false,
success: function (msg) {
if (msg.result) {
layer.alert('删除成功', {icon: 1});
oDataTable.ajax.reload();
} else {
//alert(msg.message);
layer.alert('删除失败', {icon: 2});
}
return;
}
});
}
});
}

//select2
$(function () {
//Initialize Select2 Elements
$(".select2").select2();
});

$("#btnSearch").click(function(){
oDataTable.ajax.reload();
});

</script>
{% endblock %}
Loading

0 comments on commit a36f8d7

Please sign in to comment.