mirror of
https://github.com/RobbieHan/sandboxMP.git
synced 2026-04-09 13:51:07 +08:00
network_asset
This commit is contained in:
390
.idea/workspace.xml
generated
390
.idea/workspace.xml
generated
@@ -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>
|
||||
@@ -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': '请填写内网端口'}
|
||||
}
|
||||
|
||||
|
||||
@@ -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='到保日期')
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'),
|
||||
),
|
||||
]
|
||||
@@ -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='编号'),
|
||||
),
|
||||
]
|
||||
Binary file not shown.
Binary file not shown.
@@ -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')
|
||||
]
|
||||
|
||||
@@ -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')
|
||||
@@ -160,6 +160,7 @@ SAFE_URL = [r'^/$',
|
||||
'/admin/',
|
||||
'/ckeditor/',
|
||||
'/test/',
|
||||
'/system/personal_password_change/'
|
||||
]
|
||||
|
||||
# session timeout
|
||||
|
||||
12
static/plugins/echarts/echarts.js
Normal file
12
static/plugins/echarts/echarts.js
Normal file
File diff suppressed because one or more lines are too long
@@ -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 %}
|
||||
|
||||
|
||||
@@ -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 %}
|
||||
@@ -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();
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
|
||||
81
templates/system/users/personal_passwd_change.html
Normal file
81
templates/system/users/personal_passwd_change.html
Normal 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 %}
|
||||
@@ -213,11 +213,11 @@
|
||||
});
|
||||
layer.full(div)
|
||||
}
|
||||
|
||||
// 修改密码
|
||||
function doChangepasswd(id) {
|
||||
layer.open({
|
||||
type: 2,
|
||||
title: '编辑',
|
||||
title: '修改密码',
|
||||
shadeClose: false,
|
||||
maxmin: true,
|
||||
area: ['850px', '350px'],
|
||||
|
||||
Reference in New Issue
Block a user