From b49b98851d19ffbb2bc9c69af5dde74ddcd20530 Mon Sep 17 00:00:00 2001 From: Jordi Albert <63541019+jarg1023@users.noreply.github.com> Date: Thu, 18 Aug 2022 14:35:19 +0200 Subject: [PATCH] Add IP addresses usage information for an IP network in IP network view --- msp/msp/doctype/ip_network/ip_network.js | 41 +++++++++++++++ msp/msp/doctype/ip_network/ip_network.json | 30 ++++++++++- msp/msp/doctype/ip_network/ip_network.py | 29 ++++++++++- .../ip_network_reserved_range/__init__.py | 0 .../ip_network_reserved_range.json | 51 +++++++++++++++++++ .../ip_network_reserved_range.py | 8 +++ 6 files changed, 156 insertions(+), 3 deletions(-) create mode 100644 msp/msp/doctype/ip_network_reserved_range/__init__.py create mode 100644 msp/msp/doctype/ip_network_reserved_range/ip_network_reserved_range.json create mode 100644 msp/msp/doctype/ip_network_reserved_range/ip_network_reserved_range.py diff --git a/msp/msp/doctype/ip_network/ip_network.js b/msp/msp/doctype/ip_network/ip_network.js index cfa8bd8..60cd170 100644 --- a/msp/msp/doctype/ip_network/ip_network.js +++ b/msp/msp/doctype/ip_network/ip_network.js @@ -14,5 +14,46 @@ frappe.ui.form.on('IP Network', { } }) }) + }, + onload_post_render(frm) { + getUsedIpsInNetwork(frm); + }, + after_save(frm) { + getUsedIpsInNetwork(frm); } }); + +function getUsedIpsInNetwork(frm) { + frm.call('get_used_ips', {}) + .then((response) => { + const container = document.getElementById("usage-overview-table"); + let tableBody = ``; + + response?.message?.forEach((element) => { + tableBody += ` + + ${element?.ip_address ?? "-"} + ${element?.title ?? "-"} + ${element?.type ?? "-"} + + `; + }); + + const table = tableBody ? ` + + + + + + + + + + ${tableBody} + +
IPNameType
+ ` : 'No IPs used for this network'; + + container.innerHTML = table; + }) +} diff --git a/msp/msp/doctype/ip_network/ip_network.json b/msp/msp/doctype/ip_network/ip_network.json index 0396496..2cf5750 100644 --- a/msp/msp/doctype/ip_network/ip_network.json +++ b/msp/msp/doctype/ip_network/ip_network.json @@ -27,7 +27,11 @@ "it_landscape", "description", "customer", - "location" + "location", + "ip_network_reserved_ranges_section", + "ip_network_reserved_ranges_table", + "usage_overview_section", + "usage_overview_table" ], "fields": [ { @@ -146,10 +150,32 @@ "fieldname": "aditional_data_section", "fieldtype": "Section Break", "label": "Aditional Data" + }, + { + "fieldname": "ip_network_reserved_ranges_section", + "fieldtype": "Section Break", + "label": "IP Network Reserved Ranges" + }, + { + "fieldname": "ip_network_reserved_ranges_table", + "fieldtype": "Table", + "label": "IP Network Reserved Ranges Table", + "options": "IP Network Reserved Range" + }, + { + "fieldname": "usage_overview_section", + "fieldtype": "Section Break", + "label": "Usage Overview " + }, + { + "fieldname": "usage_overview_table", + "fieldtype": "HTML", + "label": "Usage Overview Table", + "options": "
Used IPs expected
" } ], "links": [], - "modified": "2022-06-17 11:20:37.093173", + "modified": "2022-08-18 10:28:34.233288", "modified_by": "Administrator", "module": "MSP", "name": "IP Network", diff --git a/msp/msp/doctype/ip_network/ip_network.py b/msp/msp/doctype/ip_network/ip_network.py index dcf44fa..acbdb3d 100644 --- a/msp/msp/doctype/ip_network/ip_network.py +++ b/msp/msp/doctype/ip_network/ip_network.py @@ -8,7 +8,34 @@ from ipaddress import IPv4Address, IPv4Network from frappe.model.document import Document class IPNetwork(Document): - pass + @frappe.whitelist() + def get_used_ips(self): + values = {'ip_network': self.name} + result = [] + result = frappe.db.sql(""" + SELECT + ipa.ip_address, + ito.title, + ito.type + FROM `tabIP Address` ipa + JOIN `tabIT Object` ito + ON ipa.it_object = ito.name + WHERE ipa.ip_network = %(ip_network)s + """, values=values, as_dict=1) + + for ip_network_reserved_range in self.ip_network_reserved_ranges_table: + result.append({ + 'ip_address': ip_network_reserved_range.start, + 'title': ip_network_reserved_range.type, + 'type': 'DHCP Range Start' + }) + result.append({ + 'ip_address': ip_network_reserved_range.end, + 'title': ip_network_reserved_range.type, + 'type': 'DHCP Range End' + }) + + return result @frappe.whitelist() def calculate_network_data(doc): diff --git a/msp/msp/doctype/ip_network_reserved_range/__init__.py b/msp/msp/doctype/ip_network_reserved_range/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/msp/msp/doctype/ip_network_reserved_range/ip_network_reserved_range.json b/msp/msp/doctype/ip_network_reserved_range/ip_network_reserved_range.json new file mode 100644 index 0000000..993669f --- /dev/null +++ b/msp/msp/doctype/ip_network_reserved_range/ip_network_reserved_range.json @@ -0,0 +1,51 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2022-08-17 13:39:06.497802", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "start", + "end", + "type", + "description" + ], + "fields": [ + { + "fieldname": "start", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Start" + }, + { + "fieldname": "end", + "fieldtype": "Data", + "in_list_view": 1, + "label": "End" + }, + { + "fieldname": "type", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Type", + "options": "DHCP range\nDHCP exclusion\nReservation" + }, + { + "fieldname": "description", + "fieldtype": "Text Editor", + "label": "Description" + } + ], + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2022-08-17 13:44:07.476976", + "modified_by": "Administrator", + "module": "MSP", + "name": "IP Network Reserved Range", + "owner": "Administrator", + "permissions": [], + "sort_field": "modified", + "sort_order": "DESC" +} \ No newline at end of file diff --git a/msp/msp/doctype/ip_network_reserved_range/ip_network_reserved_range.py b/msp/msp/doctype/ip_network_reserved_range/ip_network_reserved_range.py new file mode 100644 index 0000000..565eb78 --- /dev/null +++ b/msp/msp/doctype/ip_network_reserved_range/ip_network_reserved_range.py @@ -0,0 +1,8 @@ +# Copyright (c) 2022, itsdave GmbH and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + +class IPNetworkReservedRange(Document): + pass