network_asset

This commit is contained in:
RobbieHan
2019-04-08 16:17:54 +08:00
parent 0e7bb2678f
commit 9430fa0781
20 changed files with 834 additions and 283 deletions

390
.idea/workspace.xml generated
View File

@@ -5,9 +5,21 @@
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/apps/cmdb/forms.py" beforeDir="false" afterPath="$PROJECT_DIR$/apps/cmdb/forms.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/apps/cmdb/models.py" beforeDir="false" afterPath="$PROJECT_DIR$/apps/cmdb/models.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/apps/cmdb/urls.py" beforeDir="false" afterPath="$PROJECT_DIR$/apps/cmdb/urls.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/apps/cmdb/views.py" beforeDir="false" afterPath="$PROJECT_DIR$/apps/cmdb/views.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/apps/cmdb/views_eam.py" beforeDir="false" afterPath="$PROJECT_DIR$/apps/cmdb/views_eam.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/apps/system/migrations/0001_initial.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/apps/system/migrations/0002_auto_20181115_2124.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/apps/system/urls.py" beforeDir="false" afterPath="$PROJECT_DIR$/apps/system/urls.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/apps/system/views_user.py" beforeDir="false" afterPath="$PROJECT_DIR$/apps/system/views_user.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/sandboxMP/settings.py" beforeDir="false" afterPath="$PROJECT_DIR$/sandboxMP/settings.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/static/plugins/fastclick/fastclick.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/static/plugins/fastclick/fastclick.min.js" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/templates/base-static.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/base-static.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/cmdb/cmdb_index.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/cmdb/cmdb_index.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/cmdb/network_asset.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/cmdb/network_asset.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/cmdb/networkasset_form.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/cmdb/networkasset_form.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/head-footer.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/head-footer.html" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/system/users/user.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/system/users/user.html" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
@@ -21,33 +33,10 @@
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/apps/cmdb/forms.py">
<entry file="file://$PROJECT_DIR$/apps/cmdb/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2414">
<caret line="142" selection-start-line="142" selection-end-line="142" />
<folding>
<element signature="e#73#97#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/apps/cmdb/models.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<folding>
<element signature="e#0#29#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/apps/cmdb/views_eam.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="735">
<caret line="384" column="26" lean-forward="true" selection-start-line="384" selection-start-column="26" selection-end-line="384" selection-end-column="26" />
<state relative-caret-position="253">
<caret line="15" column="24" selection-start-line="15" selection-start-column="24" selection-end-line="15" selection-end-column="24" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
@@ -56,40 +45,49 @@
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/apps/cmdb/urls.py">
<entry file="file://$PROJECT_DIR$/apps/system/views_structure.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="595">
<caret line="59" selection-start-line="59" selection-end-line="59" />
<state relative-caret-position="-359" />
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/templates/cmdb/cmdb_index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="509">
<caret line="101" column="16" lean-forward="true" selection-start-line="101" selection-start-column="16" selection-end-line="101" selection-end-column="16" />
<folding>
<element signature="e#0#28#0" expanded="true" />
<element signature="e#192#3193#0#HTML" />
<element signature="e#958#980#0#HTML" expanded="true" />
<element signature="e#1191#1213#0#HTML" expanded="true" />
<element signature="e#2887#2926#0#HTML" expanded="true" />
<element signature="e#3008#3029#0#HTML" expanded="true" />
<element signature="e#3420#3459#0#HTML" expanded="true" />
<element signature="e#3539#3578#0#HTML" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/templates/cmdb/natrule.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="295">
<caret line="63" column="82" selection-start-line="63" selection-start-column="82" selection-end-line="63" selection-end-column="82" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/templates/cmdb/natrule_form.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="595">
<caret line="63" column="18" selection-start-line="63" selection-start-column="18" selection-end-line="63" selection-end-column="18" />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="JavaScript File" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>all_cabinet</find>
<find>disk</find>
<find>passwor</find>
<find>个人中心</find>
<find>Monthly Recap Report</find>
<find>访问来源</find>
<find>Latest Orders</find>
<find>Browser Usage</find>
</findStrings>
</component>
<component name="Git.Settings">
@@ -98,12 +96,27 @@
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/apps/cmdb/forms.py" />
<option value="$PROJECT_DIR$/apps/cmdb/urls.py" />
<option value="$PROJECT_DIR$/templates/cmdb/network_asset.html" />
<option value="$PROJECT_DIR$/templates/cmdb/natrule.html" />
<option value="$PROJECT_DIR$/templates/cmdb/natrule_form.html" />
<option value="$PROJECT_DIR$/apps/cmdb/models.py" />
<option value="$PROJECT_DIR$/templates/cmdb/networkasset_form.html" />
<option value="$PROJECT_DIR$/static/dist/css/AdminLTE.css" />
<option value="$PROJECT_DIR$/apps/cmdb/views_eam.py" />
<option value="$PROJECT_DIR$/templates/cmdb/network_asset.html" />
<option value="$PROJECT_DIR$/templates/system/users/user.html" />
<option value="$PROJECT_DIR$/sandboxMP/settings.py" />
<option value="$PROJECT_DIR$/apps/system/urls.py" />
<option value="$PROJECT_DIR$/apps/system/views_user.py" />
<option value="$PROJECT_DIR$/templates/head-footer.html" />
<option value="$PROJECT_DIR$/templates/system/users/personal_passwd_change.html" />
<option value="$PROJECT_DIR$/templates/base-static.html" />
<option value="$PROJECT_DIR$/static/plugins/echarts/echarts.min.js" />
<option value="$PROJECT_DIR$/static/plugins/highcharts/highcharts.js" />
<option value="$PROJECT_DIR$/apps/cmdb/urls.py" />
<option value="$PROJECT_DIR$/templates/index2.html" />
<option value="$PROJECT_DIR$/apps/cmdb/forms.py" />
<option value="$PROJECT_DIR$/apps/cmdb/views.py" />
<option value="$PROJECT_DIR$/templates/cmdb/cmdb_index.html" />
</list>
</option>
</component>
@@ -129,23 +142,6 @@
<item name="sandboxMP" type="462c0819:PsiDirectoryNode" />
<item name="apps" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="sandboxMP" type="b2602c69:ProjectViewProjectNode" />
<item name="sandboxMP" type="462c0819:PsiDirectoryNode" />
<item name="apps" type="462c0819:PsiDirectoryNode" />
<item name="cmdb" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="sandboxMP" type="b2602c69:ProjectViewProjectNode" />
<item name="sandboxMP" type="462c0819:PsiDirectoryNode" />
<item name="templates" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="sandboxMP" type="b2602c69:ProjectViewProjectNode" />
<item name="sandboxMP" type="462c0819:PsiDirectoryNode" />
<item name="templates" type="462c0819:PsiDirectoryNode" />
<item name="cmdb" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
@@ -164,6 +160,13 @@
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/static/plugins/echarts" />
<recent name="$PROJECT_DIR$/templates" />
<recent name="$PROJECT_DIR$/templates/system/users" />
<recent name="$PROJECT_DIR$/templates/cmdb" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/static/plugins/echarts" />
<recent name="$PROJECT_DIR$/templates/cmdb" />
</key>
</component>
@@ -216,24 +219,27 @@
<option name="presentableId" value="Default" />
<updated>1554181508462</updated>
<workItem from="1554181511110" duration="8527000" />
<workItem from="1554199194064" duration="1961000" />
<workItem from="1554199194064" duration="7844000" />
<workItem from="1554255904237" duration="12068000" />
<workItem from="1554305728868" duration="446000" />
<workItem from="1554533797978" duration="10677000" />
<workItem from="1554604330772" duration="12685000" />
</task>
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="10488000" />
<option name="totallyTimeSpent" value="52247000" />
</component>
<component name="ToolWindowManager">
<frame x="0" y="23" width="1680" height="973" extended-state="0" />
<editor active="true" />
<layout>
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.18803419" />
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.1965812" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" />
<window_info anchor="bottom" id="Run" order="2" weight="0.21793416" />
<window_info active="true" anchor="bottom" id="Debug" order="3" visible="true" weight="0.25198638" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.25198638" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
<window_info anchor="bottom" id="TODO" order="6" />
@@ -263,35 +269,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/network_asset.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="490">
<caret line="155" column="29" lean-forward="true" selection-start-line="155" selection-start-column="29" selection-end-line="155" selection-end-column="29" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/deviceinfo.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/apps/cmdb/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2414">
<caret line="142" selection-start-line="142" selection-end-line="142" />
<folding>
<element signature="e#73#97#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/cmdb/models.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<folding>
<element signature="e#0#29#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/natrule.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="295">
@@ -299,32 +276,223 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/natrule_form.html">
<entry file="file://$USER_HOME$/Library/Caches/PyCharm2018.3/remote_sources/-1817203215/-2003647482/django/forms/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="595">
<caret line="63" column="18" selection-start-line="63" selection-start-column="18" selection-end-line="63" selection-end-column="18" />
<state relative-caret-position="671">
<caret line="408" selection-start-line="408" selection-end-line="408" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/cmdb/urls.py">
<entry file="file://$PROJECT_DIR$/templates/cmdb/scan_config.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/networkasset_form.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="595">
<caret line="59" selection-start-line="59" selection-end-line="59" />
<state relative-caret-position="315">
<caret line="39" column="66" lean-forward="true" selection-start-line="39" selection-start-column="66" selection-end-line="39" selection-end-column="66" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/dist/css/alt/AdminLTE-without-plugins.min.css">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="102">
<caret line="6" column="26560" selection-start-line="6" selection-start-column="26560" selection-end-line="6" selection-end-column="26560" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/dist/css/AdminLTE.css">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="352">
<caret line="1361" column="1" selection-start-line="1361" selection-start-column="1" selection-end-line="1361" selection-end-column="1" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/custom.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="211">
<caret line="83" selection-start-line="83" selection-end-line="83" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/users/passwd_change.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/apps/utils/sandbox_utils.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="476">
<caret line="53" column="29" selection-start-line="53" selection-start-column="12" selection-end-line="53" selection-end-column="29" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/sandboxMP/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="445">
<caret line="162" column="31" selection-start-line="162" selection-start-column="31" selection-end-line="162" selection-end-column="31" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/users/personal_passwd_change.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="496">
<caret line="69" lean-forward="true" selection-start-line="69" selection-end-line="69" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/natrule_form.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="200">
<caret line="107" column="14" selection-start-line="107" selection-start-column="14" selection-end-line="107" selection-end-column="14" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/base-static.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2142">
<caret line="126" column="7" lean-forward="true" selection-start-line="126" selection-start-column="7" selection-end-line="126" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/users/user.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="200">
<caret line="98" column="30" selection-start-line="98" selection-start-column="8" selection-end-line="98" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/plugins/echarts/echarts.min.js" />
<entry file="file://$PROJECT_DIR$/apps/system/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="567">
<caret line="40" selection-start-line="40" selection-end-line="40" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/plugins/highcharts/highcharts.js" />
<entry file="file://$PROJECT_DIR$/static/plugins/echarts/echarts.js">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/views_user.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-331">
<caret line="27" column="45" lean-forward="true" selection-start-line="27" selection-start-column="45" selection-end-line="27" selection-end-column="45" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/index2.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="163">
<caret line="1236" column="48" selection-start-line="1212" selection-start-column="9" selection-end-line="1258" selection-end-column="16" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1082" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/cmdb/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="151">
<caret line="137" column="4" lean-forward="true" selection-start-line="137" selection-start-column="4" selection-end-line="137" selection-end-column="15" />
<folding>
<element signature="e#0#29#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/static/bootstrap/css/bootstrap.css">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="216">
<caret line="250" column="3" selection-start-line="250" selection-start-column="3" selection-end-line="250" selection-end-column="3" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/head-footer.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="462">
<caret line="114" column="40" selection-start-line="114" selection-start-column="14" selection-end-line="114" selection-end-column="40" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/network_asset.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="226">
<caret line="52" column="44" lean-forward="true" selection-start-line="52" selection-start-column="44" selection-end-line="52" selection-end-column="44" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/cmdb/views_eam.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="735">
<caret line="384" column="26" lean-forward="true" selection-start-line="384" selection-start-column="26" selection-end-line="384" selection-end-column="26" />
<state relative-caret-position="190">
<caret line="329" column="20" selection-start-line="329" selection-start-column="20" selection-end-line="329" selection-end-column="20" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/cmdb/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="2" selection-start-line="2" selection-end-line="2" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/cmdb/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="253">
<caret line="15" column="24" selection-start-line="15" selection-start-column="24" selection-end-line="15" selection-end-column="24" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/cmdb/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="508">
<caret line="143" column="49" selection-start-line="143" selection-start-column="49" selection-end-line="143" selection-end-column="49" />
<folding>
<element signature="e#73#82#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/views_structure.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-359" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/deviceinfo.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="459">
<caret line="354" selection-start-line="354" selection-end-line="356" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/deviceinfo_detail.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-2183" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/cmdb/cmdb_index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="509">
<caret line="101" column="16" lean-forward="true" selection-start-line="101" selection-start-column="16" selection-end-line="101" selection-end-column="16" />
<folding>
<element signature="e#192#3193#0#HTML" />
<element signature="e#958#980#0#HTML" expanded="true" />
<element signature="e#1191#1213#0#HTML" expanded="true" />
<element signature="e#2887#2926#0#HTML" expanded="true" />
<element signature="e#3008#3029#0#HTML" expanded="true" />
<element signature="e#3420#3459#0#HTML" expanded="true" />
<element signature="e#3539#3578#0#HTML" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
</project>

View File

@@ -2,6 +2,8 @@
# @Author : RobbieHan
# @File : forms.py
import re
from django import forms
from .models import Code, DeviceInfo, ConnectionInfo, DeviceFile, NetworkAsset, NatRule
@@ -103,7 +105,7 @@ class DeviceFileUploadForm(forms.ModelForm):
fields = '__all__'
class NetworkAssetCreateForm(forms.ModelForm):
class NetworkAssetForm(forms.ModelForm):
class Meta:
model = NetworkAsset
fields = '__all__'
@@ -112,22 +114,37 @@ class NetworkAssetCreateForm(forms.ModelForm):
}
def clean(self):
cleaned_data = super(NetworkAssetCreateForm, self).clean()
ip_address = cleaned_data.get('ip_address')
if NetworkAsset.objects.filter(ip_address=ip_address).count():
raise forms.ValidationError('资产地址已存在:{}已存在'.format(ip_address))
cleaned_data = super(NetworkAssetForm, self).clean()
memory = cleaned_data.get('memory')
disk = cleaned_data.get('disk')
show_on_top = cleaned_data.get('show_on_top')
# if NetworkAsset.objects.filter(ip_address=ip_address).count():
# raise forms.ValidationError('资产地址已存在:{}已存在'.format(ip_address))
if memory:
me = re.match('(.*)/(.*)', memory)
if me:
try:
int(me.group(1))
int(me.group(2))
except Exception:
raise forms.ValidationError('内存使用量和总量为整数')
else:
raise forms.ValidationError('内存格式不对格式为5/16 (用量/总量)')
if disk:
di = re.match('(.*)/(.*)', disk)
if di:
try:
int(di.group(1))
int(di.group(2))
except Exception:
raise forms.ValidationError('硬盘使用量和总量为整数')
else:
raise forms.ValidationError('硬盘格式不对格式为5/16 (用量/总量)')
show_on_top_count = NetworkAsset.objects.filter(show_on_top=True).count()
if show_on_top and show_on_top_count >= 5:
raise forms.ValidationError('首页最多展示5个链接')
class NetworkAssetUpdateForm(NetworkAssetCreateForm):
def clean(self):
cleaned_data = self.cleaned_data
ip_address = cleaned_data.get('ip_address')
if self.instance:
matching_asset = NetworkAsset.objects.exclude(pk=self.instance.pk)
if matching_asset.filter(ip_address=ip_address).exists():
raise forms.ValidationError('资产地址已存在:{}已存在'.format(ip_address))
class NatRuleForm(forms.ModelForm):
@@ -140,3 +157,4 @@ class NatRuleForm(forms.ModelForm):
'lan_ip': {'required': '请填写内网地址'},
'dest_port': {'required': '请填写内网端口'}
}

View File

@@ -137,6 +137,8 @@ class NetworkAsset(models.Model):
management = models.CharField(max_length=100, blank=True, default='', verbose_name='管理地址')
show_on_top = models.BooleanField(default=False, verbose_name='首页展示')
provider = models.ForeignKey('Supplier', blank=True, null=True, on_delete=models.SET_NULL, verbose_name='服务商')
memory = models.CharField(max_length=20, blank=True, default='', verbose_name='内存用量')
disk = models.CharField(max_length=20, blank=True, default='', verbose_name='硬盘用量')
state = models.BooleanField(default=True, verbose_name='状态')
buyDate = models.DateField(default=datetime.now, blank=True, null=True, verbose_name='购买日期')
warrantyDate = models.DateField(default=datetime.now, blank=True, null=True, verbose_name='到保日期')

View File

@@ -1,9 +1,51 @@
from django.views.generic import TemplateView
import re
from django.views.generic import View
from django.shortcuts import render
from system.mixin import LoginRequiredMixin
from custom import BreadcrumbMixin
from .models import Cabinet, Code, DeviceInfo, NetworkAsset
class CmdbView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
class CmdbView(LoginRequiredMixin, View):
template_name = 'cmdb/cmdb_index.html'
def get(self, request):
ret = dict()
cabinet_all = Cabinet.objects.all()
operation_type_all = Code.objects.filter(parent__key='operation_type')
net_asset=list(NetworkAsset.objects.filter(show_on_top=True).values())
cabinet_list = []
cabinet_count = []
for cabinet in cabinet_all:
cabinet_list.append(cabinet.number)
cabinet_count.append(
DeviceInfo.objects.filter(dev_cabinet=cabinet.id).count()
)
operations = []
for operation in operation_type_all:
count = DeviceInfo.objects.filter(operation_type=operation.id).count()
data = {
'name': operation.value,
'count': count
}
operations.append(data)
for asset in net_asset:
disk = asset['disk']
memory = asset['memory']
if disk:
di = re.match('(.*)/(.*)', disk)
di_used = int(di.group(1))
di_total = int(di.group(2))
di_percent = '{:.0%}'.format(di_used / di_total)
asset['disk'] = {'disk': disk, 'percent': di_percent}
if memory:
me = re.match('(.*)/(.*)', memory)
me_used = int(me.group(1))
me_total = int(me.group(2))
me_percent = '{:.0%}'.format(me_used / me_total)
asset['memory'] = {'memory': memory, 'percent': me_percent}
ret['cabinet_list'] = cabinet_list
ret['cabinet_count'] = cabinet_count
ret['operations'] = operations
ret['net_asset'] = net_asset
return render(request, 'cmdb/cmdb_index.html', ret)

View File

@@ -13,8 +13,8 @@ from custom import (BreadcrumbMixin, SandboxDeleteView,
from .models import (Cabinet, DeviceInfo, Code, ConnectionInfo, DeviceFile,
Supplier, NetworkAsset, NatRule, DomainName)
from .forms import (DeviceCreateForm, DeviceUpdateForm, ConnectionInfoForm,
DeviceFileUploadForm, NetworkAssetCreateForm,
NetworkAssetUpdateForm,NatRuleForm)
DeviceFileUploadForm, NetworkAssetForm,
NatRuleForm)
from utils.db_utils import MongodbDriver
from utils.sandbox_utils import LoginExecution
@@ -78,7 +78,8 @@ class DeviceView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
class DeviceListView(SandboxListView):
model = DeviceInfo
fields = ['id', 'sys_hostname', 'hostname', 'service_type', 'operation_type', 'config', 'dev_cabinet', 'network_type']
fields = ['id', 'sys_hostname', 'hostname', 'service_type', 'operation_type', 'config', 'dev_cabinet',
'network_type']
def get_filters(self):
data = self.request.GET
@@ -282,7 +283,7 @@ class NetworkAssetView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
class NetworkAssetCreateView(SandboxCreateView):
model = NetworkAsset
form_class = NetworkAssetCreateForm
form_class = NetworkAssetForm
def get_context_data(self, **kwargs):
kwargs['all_provider'] = Supplier.objects.all()
@@ -291,7 +292,7 @@ class NetworkAssetCreateView(SandboxCreateView):
class NetworkAssetUpdateView(SandboxUpdateView):
model = NetworkAsset
form_class = NetworkAssetUpdateForm
form_class = NetworkAssetForm
def get_context_data(self, **kwargs):
kwargs['all_provider'] = Supplier.objects.all()
@@ -300,7 +301,7 @@ class NetworkAssetUpdateView(SandboxUpdateView):
class NetworkAssetListView(SandboxListView):
model = NetworkAsset
fields = ['id', 'name', 'ip_address', 'management', 'provider__firm', 'buyDate', 'warrantyDate', 'state']
fields = ['id', 'name', 'ip_address', 'management', 'provider__firm', 'memory', 'disk', 'buyDate', 'warrantyDate', 'state']
def get_filters(self):
data = self.request.GET
@@ -310,6 +311,26 @@ class NetworkAssetListView(SandboxListView):
if 'ip_address' in data and data['ip_address']:
filters['ip_address__icontains'] = data['ip_address']
return filters
def get_datatables_paginator(self, request):
context_data = super().get_datatables_paginator(request)
data = context_data['data']
for asset in data:
disk = asset['disk']
memory = asset['memory']
if disk:
di = re.match('(.*)/(.*)', disk)
di_used = int(di.group(1))
di_total = int(di.group(2))
di_percent = '{:.0%}'.format(di_used/di_total)
asset['disk'] = {'disk': disk, 'percent': di_percent}
if memory:
me = re.match('(.*)/(.*)', memory)
me_used = int(me.group(1))
me_total = int(me.group(2))
me_percent = '{:.0%}'.format(me_used / me_total)
asset['memory'] = {'memory': memory, 'percent': me_percent}
return context_data
class NetworkAssetDeleteView(SandboxDeleteView):
@@ -367,7 +388,6 @@ class NatRuleListView(SandboxListView):
class NatRuleDeleteView(SandboxDeleteView):
model = NatRule
# class DomainNameView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
# template_name = 'cmdb/domainname.html'
#
@@ -408,4 +428,4 @@ class NatRuleDeleteView(SandboxDeleteView):
#
#
# class DomainNameDeleteView(SandboxDeleteView):
# model = DomainName
# model = DomainName

View File

@@ -1,112 +0,0 @@
# Generated by Django 2.1.2 on 2018-10-17 15:09
from django.conf import settings
import django.contrib.auth.models
import django.contrib.auth.validators
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
('auth', '0009_alter_user_last_name_max_length'),
]
operations = [
migrations.CreateModel(
name='UserProfile',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('name', models.CharField(default='', max_length=20, verbose_name='姓名')),
('birthday', models.DateField(blank=True, null=True, verbose_name='出生日期')),
('gender', models.CharField(choices=[('male', ''), ('female', '')], default='male', max_length=10, verbose_name='性别')),
('mobile', models.CharField(default='', max_length=11, verbose_name='手机号码')),
('email', models.EmailField(max_length=50, verbose_name='邮箱')),
('image', models.ImageField(blank=True, default='image/default.jpg', null=True, upload_to='image/%Y/%m')),
('post', models.CharField(blank=True, max_length=50, null=True, verbose_name='职位')),
],
options={
'verbose_name': '用户信息',
'verbose_name_plural': '用户信息',
'ordering': ['id'],
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
),
migrations.CreateModel(
name='Menu',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=30, unique=True, verbose_name='菜单名')),
('icon', models.CharField(blank=True, max_length=50, null=True, verbose_name='图标')),
('code', models.CharField(blank=True, max_length=50, null=True, verbose_name='编码')),
('url', models.CharField(blank=True, max_length=128, null=True, unique=True)),
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Menu', verbose_name='父菜单')),
],
options={
'verbose_name': '菜单',
'verbose_name_plural': '菜单',
},
),
migrations.CreateModel(
name='Role',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=32, unique=True, verbose_name='角色')),
('desc', models.CharField(blank=True, max_length=50, null=True, verbose_name='描述')),
('permissions', models.ManyToManyField(blank=True, to='system.Menu', verbose_name='URL授权')),
],
),
migrations.CreateModel(
name='Structure',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=60, verbose_name='名称')),
('type', models.CharField(choices=[('unit', '单位'), ('department', '部门')], default='department', max_length=20, verbose_name='类型')),
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Structure', verbose_name='父类架构')),
],
options={
'verbose_name': '组织架构',
'verbose_name_plural': '组织架构',
},
),
migrations.AddField(
model_name='userprofile',
name='department',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Structure', verbose_name='部门'),
),
migrations.AddField(
model_name='userprofile',
name='groups',
field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'),
),
migrations.AddField(
model_name='userprofile',
name='roles',
field=models.ManyToManyField(blank=True, to='system.Role', verbose_name='角色'),
),
migrations.AddField(
model_name='userprofile',
name='superior',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='上级主管'),
),
migrations.AddField(
model_name='userprofile',
name='user_permissions',
field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'),
),
]

View File

@@ -1,22 +0,0 @@
# Generated by Django 2.1.2 on 2018-11-15 21:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('system', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='menu',
options={'ordering': ['number'], 'verbose_name': '菜单', 'verbose_name_plural': '菜单'},
),
migrations.AddField(
model_name='menu',
name='number',
field=models.FloatField(blank=True, null=True, verbose_name='编号'),
),
]

View File

@@ -35,4 +35,6 @@ urlpatterns = [
path('rbac/role/role2user/', views_role.Role2UserView.as_view(), name="rbac-role-role2user"),
path('rbac/role/role2menu/', views_role.Role2MenuView.as_view(), name="rbac-role-role2menu"),
path('rbac/role/role2menu_list/', views_role.Role2MenuListView.as_view(), name="rbac-role-role2menu_list"),
path('personal_password_change/', views_user.PersonalPasswordChangeView.as_view(), name='personal_password_change')
]

View File

@@ -218,4 +218,35 @@ class UserDisableView(LoginRequiredMixin, View):
queryset = User.objects.extra(where=["id IN(" + id_nums + ")"])
queryset.filter(is_active=True).update(is_active=False)
ret = {'result': 'True'}
return HttpResponse(json.dumps(ret), content_type='application/json')
# 用户修改密码临时接口
class PersonalPasswordChangeView(LoginRequiredMixin, View):
"""
登陆用户修改个人密码
"""
def get(self, request):
ret = dict()
user = get_object_or_404(User, pk=int(request.user.id))
ret['user'] = user
return render(request, 'system/users/personal_passwd_change.html', ret)
def post(self, request):
user = get_object_or_404(User, pk=int(request.user.id))
form = PasswordChangeForm(request.POST)
if form.is_valid():
new_password = request.POST.get('password')
user.set_password(new_password)
user.save()
ret = {'status': 'success'}
else:
pattern = '<li>.*?<ul class=.*?><li>(.*?)</li>'
errors = str(form.errors)
passwd_change_form_errors = re.findall(pattern, errors)
ret = {
'status': 'fail',
'password_change_form_errors': passwd_change_form_errors[0]
}
return HttpResponse(json.dumps(ret), content_type='application/json')

View File

@@ -160,6 +160,7 @@ SAFE_URL = [r'^/$',
'/admin/',
'/ckeditor/',
'/test/',
'/system/personal_password_change/'
]
# session timeout

File diff suppressed because one or more lines are too long

View File

@@ -15,6 +15,7 @@ scratch. This page gets rid of all links and provides the needed markup only.
<link rel="stylesheet" href="{% static 'dist/css/AdminLTE.min.css' %}">
<link rel="stylesheet" href="{% static 'dist/css/myself.css' %}">
<link rel="stylesheet" href="{% static 'dist/css/skins/skin-blue.min.css' %}">
<link rel="stylesheet" href="{% static 'js/plugins/layer/skin/layer.css' %}">
{% block css %} {% endblock %}
@@ -104,6 +105,22 @@ scratch. This page gets rid of all links and provides the needed markup only.
<script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
<!-- AdminLTE App -->
<script src="{% static 'dist/js/app.min.js' %}"></script>
<script src="{% static 'js/plugins/layer/layer.js' %}"></script>
<script type="text/javascript">
// 修改密码
function doChangepasswd() {
layer.open({
type: 2,
title: '修改密码',
shadeClose: false,
maxmin: true,
area: ['800px', '280px'],
content: ["{% url 'system:personal_password_change' %}" ],
});
}
</script>
{% block javascripts %}{% endblock %}

View File

@@ -6,15 +6,267 @@
<!-- Main content -->
<section class="content">
这里是配置管理首页临时内容
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">资产统计信息</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
</button>
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
</div>
</div>
<!-- /.box-header -->
<div class="box-body">
<div class="row">
<div class="col-md-6">
<div class="chart">
<!-- Sales Chart Canvas -->
<div id="dev_container" style="height: 400px;"></div>
</div>
<!-- /.chart-responsive -->
</div>
<!-- /.col -->
<div class="col-md-6">
<div id="ope_container" style="height: 400px;"></div>
</div>
<!-- /.col -->
</div>
<!-- /.row -->
</div>
<!-- ./box-body -->
</div>
<!-- /.box -->
</div>
<!-- /.col -->
</div>
<div class="row">
<div class="col-md-7">
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">快速访问接口</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
</button>
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
</div>
</div>
<!-- /.box-header -->
<div class="box-body no-padding">
<table class="table" cellspacing="0">
<thead>
<tr>
<th> 资产名称</th>
<th>访问地址</th>
<th>硬盘资源(T)</th>
<th>内存资源(G)</th>
</tr>
</thead>
<tbody>
{% for asset in net_asset %}
<tr>
<td><a href="{{ asset.management }}" target="_blank"> {{ asset.name }}</a></td>
<td><a href="{{ asset.management }}" target="_blank">{{ asset.management }}</a></td>
<td>
<div class="progress-group">
<div class="progress sm" style="background: #00a65a;color:#FFF;">
<div class="progress-bar progress-bar-yellow" style="width: {{ asset.disk.percent }}">
</div>
</div>
<span class="progress-number">{{ asset.disk.disk }}</span>
</div>
</td>
<td>
<div class="progress-group">
<div class="progress sm" style="background: #00a65a;color:#FFF;">
<div class="progress-bar progress-bar-yellow" style="width: {{ asset.memory.percent }}">
</div>
</div>
<span class="progress-number">{{ asset.memory.memory }}</span>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<!-- /.table-responsive -->
</div>
<!-- /.box-body -->
<div class="box-footer clearfix">
<button class="btn btn-sm btn-default pull-right" onclick="doNetworkAsset()">所有网络资产</button>
</div>
<!-- /.box-footer -->
</div>
</div>
<div class="col-md-5">
<div class="box box-danger">
<div class="box-header with-border">
<h3 class="box-title">提示消息</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
</button>
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
</div>
</div>
<!-- /.box-header -->
<div class="box-body">
<div class="table-responsive">
<table class="table no-margin">
<thead>
<tr>
<th>消息类型</th>
<th>消息内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>系统消息</td>
<td>消息功能暂未开放</td>
</tr>
<tr>
<td>系统消息</td>
<td>消息功能暂未开放</td>
</tr>
<tr>
<td>系统消息</td>
<td>消息功能暂未开放</td>
</tr>
<tr>
<td>系统消息</td>
<td>消息功能暂未开放</td>
</tr>
<tr>
<td>系统消息</td>
<td>消息功能暂未开放</td>
</tr>
</tbody>
</table>
</div>
<!-- /.table-responsive -->
</div>
<!-- /.box-body -->
<div class="box-footer clearfix">
<a href="javascript:void(0)" class="btn btn-sm btn-default btn-flat pull-right">所有消息</a>
</div>
<!-- /.box-footer -->
</div>
</div>
</div>
</section>
<!-- /.content -->
{% endblock %}
{% block javascripts %}
<script type="text/javascript" src="{% static 'plugins/echarts/echarts.js' %}"></script>
<script type="text/javascript">
var dev_dom = document.getElementById("dev_container");
var dev_Chart = echarts.init(dev_dom, 'macarons');
dev_option = null;
dev_option = {
title : {
text: '主机分布',
subtext: '数据来自设备管理'
},
tooltip : {
trigger: 'axis'
},
toolbox: {
show : true,
feature : {
dataView : {show: true, readOnly: false},
restore : {show: true},
saveAsImage : {show: true}
}
},
calculable : true,
xAxis : [
{
type : 'value',
boundaryGap : [0, 0.01]
}
],
yAxis : [
{
type : 'category',
data : [{% for cab in cabinet_list %} '{{ cab }}', {% endfor %}]
}
],
series : [
{
name:'云主机',
type:'bar',
data:{{ cabinet_count }}
}
]
};
;
if (dev_option && typeof dev_option === "object") {
dev_Chart.setOption(dev_option, true);
}
var ope_dom = document.getElementById("ope_container");
var ope_Chart = echarts.init(ope_dom, 'macarons');
ope_option = null;
ope_option = {
title : {
text: '项目分布',
subtext: '数据来自设备管理',
x:'center'
},
tooltip : {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
orient : 'vertical',
x : 'left',
data: [{% for ope in operations %} '{{ ope.name }}', {% endfor %}]
},
toolbox: {
show : true,
feature : {
dataView : {show: true, readOnly: false},
restore : {show: true},
saveAsImage : {show: true}
}
},
calculable : true,
series : [
{
name:'主机数量',
type:'pie',
radius : '55%',
center: ['50%', '60%'],
data:[
{% for ope in operations %}
{value:{{ ope.count }}, name:'{{ ope.name }}'},
{% endfor %}
]
}
]
};
;
if (ope_option && typeof ope_option === "object") {
ope_Chart.setOption(ope_option, true);
}
//图表窗体自适应
$(window).resize(function(){
ope_Chart.resize();
dev_Chart.resize();
});
//跳转到网络资产
function doNetworkAsset(){
window.location.href="{% url 'cmdb:eam-network_asset' %}";
}
</script>
{% endblock %}

View File

@@ -48,7 +48,6 @@
</form>
</div>
</div>
<div class="box-body">
<table id="dtbList" class="display" cellspacing="0" width="100%">
<thead>
@@ -58,6 +57,8 @@
<th>资产名称</th>
<th>IP地址</th>
<th>管理地址</th>
<th>内存(G)</th>
<th>硬盘(T)</th>
<th>服务商</th>
<th>购买日期</th>
<th>到期时间</th>
@@ -108,8 +109,8 @@
ajax: {
"url": "{% url 'cmdb:eam-network_asset-list' %}",
"data": function (d) {
d.number = $("#name").val();
d.position = $("#ip_address").val();
d.name = $("#name").val();
d.ip_address = $("#ip_address").val();
}
},
columns: [
@@ -130,6 +131,33 @@
data: "management",
//width : "20%",
},
{
data: "memory",
render: function(data, type, row, meta) {
if (data) {
var ret= '<div class="progress-group"><span class="progress-text">mem</span>' +
'<span class="progress-number">'+ data.memory + '</span><div class="progress sm" ' +
'style="background: #00a65a;color:#FFF;"><div class="progress-bar progress-bar-yellow" ' +
'style="width: ' + data.percent + '"></div></div></div>'
return ret
}else { return ''}
}
},
{
data: "disk",
//width : "20%",
render: function(data, type, row, meta) {
if (data) {
var ret = '<div class="progress-group"><span class="progress-text">disk</span>' +
'<span class="progress-number">' + data.disk + '</span><div class="progress sm" ' +
'style="background: #00a65a;color:#FFF;"><div class="progress-bar progress-bar-yellow" ' +
'style="width: ' + data.percent + '"></div></div></div>'
return ret
}else { return ''}
}
},
{
data: "provider__firm",
//width : "20%",
@@ -186,7 +214,7 @@
title: '新增',
shadeClose: false,
maxmin: true,
area: ['800px', '550px'],
area: ['800px', '580px'],
content: "{% url 'cmdb:eam-network_asset-create' %}",
end: function () {
//关闭时做的事情
@@ -202,7 +230,7 @@
title: '编辑',
shadeClose: false,
maxmin: true,
area: ['800px', '550px'],
area: ['800px', '580px'],
content: ["{% url 'cmdb:eam-network_asset-update' %}" + '?id=' + id, 'no'],
end: function () {
oDataTable.ajax.reload();

View File

@@ -26,6 +26,16 @@
<input class="form-control" name="ip_address" type="text" value="{{ networkasset.ip_address }}" />
</div>
</div>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">内存用量</label>
<div class="col-sm-3">
<input class="form-control" name="memory" type="text" value="{{ networkasset.memory }}" placeholder="2/16(用量/总量)单位G"/>
</div>
<label class="col-sm-2 control-label">硬盘用量</label>
<div class="col-sm-3">
<input class="form-control" name="disk" type="text" value="{{ networkasset.disk }}" placeholder="2/16(用量/总量)单位T"/>
</div>
</div>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">购买日期</label>
<div class="col-sm-3">

View File

@@ -83,7 +83,7 @@
<!-- Menu Footer-->
<li class="user-footer">
<div class="pull-left">
<a href="" class="btn btn-default btn-flat">个人中心</a>
<button class="btn btn-default btn-flat" onclick="doChangepasswd()">修改密码</button>
</div>
<div class="pull-right">
<a href="/logout/" class="btn btn-default btn-flat">注销用户</a>
@@ -116,3 +116,4 @@
</footer>
{% endblock %}

View File

@@ -0,0 +1,81 @@
{% extends 'base-layer.html' %}
{% load staticfiles %}
{% block css %}
{% endblock %}
{% block main %}
<div class="box box-danger">
<form class="form-horizontal" id="addForm" method="post">
{% csrf_token %}
<input type="hidden" name='id' value="{{ user.id }}"/>
<input type="hidden" name='user' value="save"/>
<div class="box-body">
<fieldset>
<h4>修改密码</h4>
</legend>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">密码</label>
<div class="col-sm-3">
<input class="form-control" name="password" type="password" value=""/>
</div>
<label class="col-sm-2 control-label">确认密码</label>
<div class="col-sm-3">
<input class="form-control" name="confirm_password" type="password" value=""/>
</div>
</div>
</fieldset>
</div>
<div class="box-footer ">
<div class="row span7 text-center ">
<button type="button" id="btnCancel" class="btn btn-default margin-right ">重置</button>
<button type="button" id="btnSave" class="btn btn-info margin-right ">确定</button>
</div>
</div>
</form>
</div>
{% endblock %}
{% block javascripts %}
<script src="{% static 'plugins/combo-select/jquery.combo.select.js' %}"></script>
<script src="{% static 'bootstrap/js/bootstrap-datetimepicker.js' %}"></script>
<script type="text/javascript">
$("#btnSave").click(function () {
var data = $("#addForm").serialize();
$.ajax({
type: $("#addForm").attr('method'),
url: "{% url 'system:personal_password_change' %}",
data: data,
cache: false,
success: function (msg) {
if (msg.status == 'success') {
layer.alert('密码修改成功!', {icon: 1}, function (index) {
parent.layer.closeAll();
});
} else if (msg.status == 'fail') {
layer.alert(msg.password_change_form_errors, {icon: 5});
//$('errorMessage').html(msg.message)
}
return;
}
});
});
/*点取消刷新页面*/
$("#btnCancel").click(function () {
window.location.reload();
})
</script>
{% endblock %}

View File

@@ -213,11 +213,11 @@
});
layer.full(div)
}
// 修改密码
function doChangepasswd(id) {
layer.open({
type: 2,
title: '编辑',
title: '修改密码',
shadeClose: false,
maxmin: true,
area: ['850px', '350px'],