Topology button in Site View (#220)
* Topology button in Site View * Add mdi icons to Topology and Close Buttons * Fix buttons tag and class * fixed drag & site filter Co-authored-by: Mattijs Vanhaverbeke <mattijs.vanhaverbeke@ebo-enterprises.com>
This commit is contained in:
co-authored by
Mattijs Vanhaverbeke
parent
be402b1b5c
commit
7173564ea9
File diff suppressed because one or more lines are too long
@@ -70,8 +70,9 @@ const coordSaveCheckbox = document.querySelector('#id_save_coords')
|
|||||||
graph.fit()
|
graph.fit()
|
||||||
|
|
||||||
graph.on('dragEnd', (params) => {
|
graph.on('dragEnd', (params) => {
|
||||||
|
if (coordSaveCheckbox == null) return
|
||||||
if (!coordSaveCheckbox.checked) return
|
if (!coordSaveCheckbox.checked) return
|
||||||
|
|
||||||
Promise.allSettled(
|
Promise.allSettled(
|
||||||
Object.entries(graph.getPositions(params.nodes)).map(
|
Object.entries(graph.getPositions(params.nodes)).map(
|
||||||
async ([nodeId, nodePosition]) => {
|
async ([nodeId, nodePosition]) => {
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
from extras.plugins import PluginTemplateExtension
|
||||||
|
from django.conf import settings
|
||||||
|
from packaging import version
|
||||||
|
|
||||||
|
NETBOX_CURRENT_VERSION = version.parse(settings.VERSION)
|
||||||
|
|
||||||
|
|
||||||
|
class SiteButtons(PluginTemplateExtension):
|
||||||
|
model = 'dcim.site'
|
||||||
|
def buttons(self):
|
||||||
|
return self.render('netbox_topology_views/site_button.html')
|
||||||
|
|
||||||
|
|
||||||
|
template_extensions = [SiteButtons]
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{% load static %}
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="{% static 'netbox_topology_views/css/vendor.css' %}">
|
||||||
|
<link rel="stylesheet" href="{% static 'netbox_topology_views/css/app.css' %}">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Topology Views</h5>
|
||||||
|
<div class="controls">
|
||||||
|
<div class="control-group">
|
||||||
|
{% block extra_controls %}{% endblock %}
|
||||||
|
<a id="btnDownloadImage" class="btn btn-sm btn-info" href="#">
|
||||||
|
<i class="mdi mdi-download"></i>
|
||||||
|
Download
|
||||||
|
</a>
|
||||||
|
<a class="btn btn-sm btn-danger" data-bs-dismiss="modal">
|
||||||
|
<i class="mdi mdi-close-thick"></i>
|
||||||
|
Close
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body" >
|
||||||
|
<div style="width: 500px; height: 500px;">
|
||||||
|
<div id="visgraph" style="width: 100%; height: 100%;">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
const brokenImage = '{{ broken_image }}';
|
||||||
|
const topologyData = {{ topology_data | safe }};
|
||||||
|
</script>
|
||||||
|
<script src="{% static 'netbox_topology_views/js/app.js' %}?ver={{ epoch }} " defer></script>
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<a role="button" class="btn btn-sm btn-primary" title="Topology" href="#" hx-get="/plugins/netbox_topology_views/topology/?site_id={{ object.id }}" hx-target="#htmx-modal-content" data-bs-toggle="modal" data-bs-target="#htmx-modal">
|
||||||
|
<i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i>
|
||||||
|
Topology
|
||||||
|
</a>
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
import json
|
import json
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
from typing import DefaultDict, Dict, Optional, Union
|
from typing import DefaultDict, Dict, Optional, Union
|
||||||
|
import time
|
||||||
|
|
||||||
|
from utilities.htmx import is_htmx
|
||||||
from circuits.models import Circuit, CircuitTermination
|
from circuits.models import Circuit, CircuitTermination
|
||||||
from dcim.models import (
|
from dcim.models import (
|
||||||
Cable,
|
Cable,
|
||||||
@@ -609,6 +611,18 @@ class TopologyHomeView(PermissionRequiredMixin, View):
|
|||||||
query_string = q.urlencode()
|
query_string = q.urlencode()
|
||||||
return HttpResponseRedirect(f"{request.path}?{query_string}")
|
return HttpResponseRedirect(f"{request.path}?{query_string}")
|
||||||
|
|
||||||
|
if is_htmx(request):
|
||||||
|
return render(
|
||||||
|
request,
|
||||||
|
"netbox_topology_views/htmx_topology.html",
|
||||||
|
{
|
||||||
|
"filter_form": DeviceFilterForm(request.GET, label_suffix=""),
|
||||||
|
"topology_data": json.dumps(topo_data),
|
||||||
|
"broken_image": find_image_url("role-unknown"),
|
||||||
|
"epoch": int(time.time()),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
return render(
|
return render(
|
||||||
request,
|
request,
|
||||||
"netbox_topology_views/index.html",
|
"netbox_topology_views/index.html",
|
||||||
|
|||||||
Reference in New Issue
Block a user