Skip to content

Commit

Permalink
update dashboard
Browse files Browse the repository at this point in the history
  • Loading branch information
lijie3721 committed Nov 17, 2016
1 parent 94301ca commit 460c01f
Show file tree
Hide file tree
Showing 30 changed files with 65,748 additions and 227 deletions.
460 changes: 269 additions & 191 deletions .idea/workspace.xml

Large diffs are not rendered by default.

Binary file modified MadKing/__pycache__/views.cpython-35.pyc
Binary file not shown.
5 changes: 3 additions & 2 deletions MadKing/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@
# Create your views here.
import django


from assets.dashboard import AssetDashboard
from django.contrib.auth.decorators import login_required


@login_required
def index(request):

return render(request,'index.html')
return render(request,'index.html',)



Expand Down
Binary file modified assets/__pycache__/admin.cpython-35.pyc
Binary file not shown.
Binary file modified assets/__pycache__/asset_handle.cpython-35.pyc
Binary file not shown.
Binary file added assets/__pycache__/dashboard.cpython-35.pyc
Binary file not shown.
Binary file modified assets/__pycache__/models.cpython-35.pyc
Binary file not shown.
Binary file modified assets/__pycache__/rest_urls.cpython-35.pyc
Binary file not shown.
Binary file modified assets/__pycache__/tables.cpython-35.pyc
Binary file not shown.
Binary file modified assets/__pycache__/views.cpython-35.pyc
Binary file not shown.
10 changes: 5 additions & 5 deletions assets/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,18 +112,18 @@ class DiskInline(admin.TabularInline):
readonly_fields = ['create_date']

class AssetAdmin(admin.ModelAdmin):
list_display = ('id','asset_type','sn','name','manufactory','management_ip','idc','business_unit','admin','trade_date')
list_display = ('id','asset_type','sn','name','manufactory','management_ip','idc','business_unit','admin','trade_date','status')
inlines = [ServerInline,CPUInline,RAMInline,DiskInline,NICInline]
search_fields = ['sn',]
list_filter = ['idc','manufactory','business_unit','asset_type']
choice_fields = ('asset_type',)
choice_fields = ('asset_type','status')
fk_fields = ('manufactory','idc','business_unit','admin')
list_per_page = 10
list_filter = ('asset_type','manufactory','idc','business_unit','admin','trade_date')
list_filter = ('asset_type','status','manufactory','idc','business_unit','admin','trade_date')
dynamic_fk = 'asset_type'
dynamic_list_display = ('model','sub_asset_type')
dynamic_list_display = ('model','sub_asset_type','os_type','os_distribution')
dynamic_choice_fields = ('sub_asset_type',)

m2m_fields = ('tags',)

class NicAdmin(admin.ModelAdmin):
list_display = ('name','macaddress','ipaddress','netmask','bonding')
Expand Down
5 changes: 4 additions & 1 deletion assets/asset_handle.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,4 +170,7 @@ def by_asset_type(self):
tree.append(node_dic)


return json.dumps(tree)
return json.dumps(tree)



84 changes: 84 additions & 0 deletions assets/dashboard.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#_*_coding:utf-8_*_

from assets import models
from django.db.models import Count
import random

class AssetDashboard(object):
'''首页画图需要的数据都在这里生产'''
def __init__(self,reqeust):
self.requeset = reqeust
self.asset_list = models.Asset.objects.all()
self.data = {}

def searilize_page(self):
'''生成页面需要的数据'''
self.data['asset_categories'] = self.get_asset_categories()
self.data['asset_status_list'] = self.get_asset_status_statistics()
self.data['business_load'] = self.get_business_load()

def get_business_load(self):
'''调用监控等系统,得到每个业务线的负载率'''

dataset = {
'names':[],
'data':{'load':[], 'left':[]} #left是为了填充百分比用的
}


for obj in models.BusinessUnit.objects.filter(parent_level=None):
load_val = random.randint(1,100) #这是个模拟数据,模拟各业务线的使用率负载
dataset['names'].append(obj.name)
dataset['data']['load'].append(load_val)
dataset['data']['left'].append(100-load_val)
print('business load ',dataset)
return dataset
def get_asset_status_statistics(self):
'''资产状态分类统计'''
queryset = list( self.asset_list.values('status').annotate(value=Count('status')))
dataset = {
'names':[],
'data':[]
}
for index,item in enumerate(queryset):
for db_val, display_name in models.Asset.status_choices:
if db_val == item['status']:
queryset[index]['name'] = display_name
if db_val ==0:#online
queryset[index]['itemStyle'] ={
'normal': {'color': 'yellowgreen'}
}
#queryset[index]['selected'] = True

#print(queryset)
dataset['names'] = [item['name'] for item in queryset]
dataset['data'] = queryset
return dataset
def get_asset_categories(self):
'''按资产类型进行分类'''

dataset ={
'names':[],
'data':[]
}
prefetch_data = {
models.Server:None,
models.NetworkDevice:None,
models.SecurityDevice:None,
models.Software:None,
}
for key in prefetch_data:
data_list = list(key.objects.values('sub_asset_type').annotate(total=Count('sub_asset_type')))
for index,category in enumerate(data_list):
for db_val,display_name in key.sub_assset_type_choices:
if category['sub_asset_type'] == db_val:
data_list[index]['name'] = display_name

for item in data_list:
dataset['names'].append(item['name'])
dataset['data'].append(item['total'])
#prefetch_data[key] = data_list
return dataset
# print("prefecth data",prefetch_data)
# print("dataset",dataset)

20 changes: 20 additions & 0 deletions assets/migrations/0008_software_sub_asset_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-11-16 09:50
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('assets', '0007_networkdevice_model'),
]

operations = [
migrations.AddField(
model_name='software',
name='sub_asset_type',
field=models.SmallIntegerField(choices=[(0, 'OS'), (1, '办公\\开发软件'), (2, '业务软件')], default=0, verbose_name='服务器类型'),
),
]
20 changes: 20 additions & 0 deletions assets/migrations/0009_asset_status.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-11-17 03:35
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('assets', '0008_software_sub_asset_type'),
]

operations = [
migrations.AddField(
model_name='asset',
name='status',
field=models.SmallIntegerField(choices=[(0, '在线'), (1, '已下线'), (2, '未知'), (3, '故障'), (4, '备用')], default=0),
),
]
Binary file not shown.
Binary file not shown.
13 changes: 10 additions & 3 deletions assets/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,13 @@ class Asset(models.Model):
admin = models.ForeignKey('UserProfile', verbose_name=u'资产管理员',null=True, blank=True)
idc = models.ForeignKey('IDC', verbose_name=u'IDC机房',null=True, blank=True)


status_choices = ((0,'在线'),
(1,'已下线'),
(2,'未知'),
(3,'故障'),
(4,'备用'),
)
status = models.SmallIntegerField(choices=status_choices,default=0)
#status = models.ForeignKey('Status', verbose_name = u'设备状态',default=1)
#Configuration = models.OneToOneField('Configuration',verbose_name='配置管理',blank=True,null=True)

Expand All @@ -59,7 +65,7 @@ class Server(models.Model):
asset = models.OneToOneField('Asset')
sub_assset_type_choices = (
(0,'PC服务器'),
(1,'PC服务器'),
(1,'刀片机'),
(2,'小型机'),
)
created_by_choices = (
Expand Down Expand Up @@ -136,12 +142,13 @@ class Software(models.Model):
'''
only save software which company purchased
'''
os_types_choice = (
sub_assset_type_choices = (
(0, 'OS'),
(1, '办公\开发软件'),
(2, '业务软件'),

)
sub_asset_type = models.SmallIntegerField(choices=sub_assset_type_choices,verbose_name="服务器类型",default=0)
license_num = models.IntegerField(verbose_name="授权数")
# os_distribution_choices = (('windows','Windows'),
# ('centos','CentOS'),
Expand Down
5 changes: 3 additions & 2 deletions assets/rest_urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from django.conf.urls import url, include
from rest_framework import routers
from assets import rest_views as views

from assets import views as asset_views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'assets', views.AssetViewSet)
Expand All @@ -14,5 +14,6 @@
urlpatterns = [
url(r'^', include(router.urls)),
url(r'asset_list/$',views.AssetList ),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^dashboard_data/',asset_views.get_dashboard_data,name="get_dashboard_data")
]
16 changes: 13 additions & 3 deletions assets/tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from django.utils import timezone
from django.db.models import Count

import time

def get_orderby(request, model_objs, admin_form):
orderby_field = request.GET.get('orderby')
Expand Down Expand Up @@ -46,6 +46,10 @@ def __init__(self, request, model_class, admin_class, query_sets, order_res):
hasattr(admin_class,'dynamic_list_display') else ()
self.dynamic_choice_fields = getattr(admin_class,'dynamic_choice_fields') if \
hasattr(admin_class,'dynamic_choice_fields') else ()

#for m2m fields
self.m2m_fields = getattr(admin_class,'m2m_fields') if \
hasattr(admin_class,'m2m_fields') else ()
def get_list_filter(self, list_filter):
filters = []
# print("list filters",list_filter)
Expand Down Expand Up @@ -75,9 +79,11 @@ def get_list_filter(self, list_filter):
((today_obj - timezone.timedelta(days=90)).strftime("%Y-%m-%d"), '过去3个月'),
((today_obj - timezone.timedelta(days=180)).strftime("%Y-%m-%d"), '过去6个月'),
((today_obj - timezone.timedelta(days=365)).strftime("%Y-%m-%d"), '过去1年'),
((today_obj - timezone.timedelta(seconds=time.time())).strftime("%Y-%m-%d"), 'ALL'),

]
data['choices'] = choices

print(choices)
# handle selected data
if self.request.GET.get(i):
data['selected'] = self.request.GET.get(i)
Expand All @@ -94,8 +100,12 @@ def table_filter(request, model_admin, models_class):
filter_conditions = {}
for condition in model_admin.list_filter:
if request.GET.get(condition):
if 'ForeignKey' in models_class._meta.get_field(condition).__repr__():
filed_type_name = models_class._meta.get_field(condition).__repr__()

if 'ForeignKey' in filed_type_name:
filter_conditions['%s_id' % condition] = request.GET.get(condition)
elif 'DateField' in filed_type_name or 'DateTimeField' in filed_type_name:
filter_conditions['%s__gt' % condition] = request.GET.get(condition)
else:
filter_conditions[condition] = request.GET.get(condition)

Expand Down
Binary file modified assets/templatetags/__pycache__/custom_tag.cpython-35.pyc
Binary file not shown.
28 changes: 20 additions & 8 deletions assets/templatetags/custom_tag.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,17 +73,29 @@ def build_table_row(row_obj,table_obj,onclick_column=None,target_link=None):
dy_fk_obj = getattr(row_obj,dy_fk)
print("-->type",type(dy_fk_obj), dy_fk_obj )
for index,column_name in enumerate(table_obj.dynamic_list_display):
if column_name in table_obj.dynamic_choice_fields:
column_data = getattr(dy_fk_obj, 'get_%s_display' % column_name)()
if hasattr(dy_fk_obj,column_name):
if column_name in table_obj.dynamic_choice_fields:
column_data = getattr(dy_fk_obj, 'get_%s_display' % column_name)()
else:
column_data = dy_fk_obj._meta.get_field(column_name)._get_val_from_obj(dy_fk_obj)
print("dynamic column data", column_data)

column = "<td>%s</td>" % column_data
else:
column_data = dy_fk_obj._meta.get_field(column_name)._get_val_from_obj(dy_fk_obj)
print("dynamic column data", column_data)

column = "<td>%s</td>" % column_data
column = "<td>n/a</td>"
row_ele += column
else:
#这个关联的表还没创建呢
pass
#这个关联的表还没创建呢, 但也要创建空的html td占位符
for index, column_name in enumerate(table_obj.dynamic_list_display):
row_ele +="<td></td>"

for field in table_obj.m2m_fields:
m2m_obj = getattr(row_obj,field)
column = "<td> "
for obj in m2m_obj.select_related():
column += "<span style='display:inline-block' class='label label-mint label-info'>%s</span>" % obj.__str__()
column += "</td>"
row_ele += column
row_ele += "</tr>"
return mark_safe(row_ele)

Expand Down
11 changes: 10 additions & 1 deletion assets/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.core.exceptions import ObjectDoesNotExist
from assets import tables
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

from assets.dashboard import AssetDashboard

# Create your views here.

Expand Down Expand Up @@ -144,3 +144,12 @@ def asset_detail(request, asset_id):
except ObjectDoesNotExist as e:
return render(request, 'assets/asset_detail.html', {'error': e})
return render(request, 'assets/asset_detail.html', {"asset_obj": asset_obj})


@login_required
def get_dashboard_data(request):
'''返回主页面数据'''

dashboard_data = AssetDashboard(request)
dashboard_data.searilize_page()
return HttpResponse(json.dumps(dashboard_data.data))
Binary file modified db.sqlite3
Binary file not shown.
9 changes: 0 additions & 9 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,3 @@
cffi==1.8.3
cryptography==1.5.2
Django==1.10.2
idna==2.1
paramiko==2.0.2
pyasn1==0.1.9
pycparser==2.16
PyMySQL==0.7.9
PyYAML==3.12
six==1.10.0
SQLAlchemy==1.1.2
SQLAlchemy-Utils==0.32.9
Loading

0 comments on commit 460c01f

Please sign in to comment.