diff --git a/msp/msp/doctype/ip_network/ip_network.js b/msp/msp/doctype/ip_network/ip_network.js index cfa8bd8..b72534a 100644 --- a/msp/msp/doctype/ip_network/ip_network.js +++ b/msp/msp/doctype/ip_network/ip_network.js @@ -14,5 +14,134 @@ frappe.ui.form.on('IP Network', { } }) }) + getUsedIpsInNetwork(frm); } }); + +function getUsedIpsInNetwork(frm) { + displayLoader(); + + 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?.ip_address} + + + ${(element?.title === '') ? "-" : element?.title} + + ${(element?.type === '') ? "-" : element?.type} + + `; + }); + + const table = tableBody ? ` + + + + + + + + + + ${tableBody} + +
IPNameType
+ ` : 'No IPs used for this network'; + + container.innerHTML = table; + + document.querySelectorAll('[data-doctype-name]').forEach(element => { + element.addEventListener('click', (event) => { + event.preventDefault(); + if (event.target.dataset?.doctypeName === '') { + return; + } + + frappe.set_route('Form', event.target.dataset?.doctypeType, event.target.dataset?.doctypeName); + }); + }); + }) +} +function displayLoader() { + const container = document.getElementById("usage-overview-table"); + const loader = ` +
+ + `; + + // Set width and height to
parent element and to
grandparent element so relative width and height with % works greate + container.parentElement.parentElement.style.width = '100%'; + container.parentElement.parentElement.style.height = '100%'; + container.parentElement.style.width = '100%'; + + // Set this styles to showcase where the information will appear + container.style.width = '100%'; + container.style.height = '100%'; + container.innerHTML = loader; +} + 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..aab3951 100644 --- a/msp/msp/doctype/ip_network/ip_network.py +++ b/msp/msp/doctype/ip_network/ip_network.py @@ -8,7 +8,37 @@ 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, 'status': 'Decommissioned'} + result = [] + result = frappe.db.sql(""" + SELECT + ipa.name as ip_address_name, + ipa.ip_address, + ito.name as it_object_name, + 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 + AND ito.status != %(status)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