Compare commits

...
10 Commits
Author SHA1 Message Date
mattieserver 74c295837c bump version (#449) 2024-01-13 21:59:37 +01:00
Mario a543f5cb0c fix pixel waste (#440) 2024-01-04 21:42:19 +01:00
mattieserver 50c90a4328 438 beta release for netbox v370 (#439)
* 3.9.0

* 3.9-beta1
2024-01-02 12:22:46 +01:00
mattieserver 374a88266a used EventRulesMixin (#437) 2024-01-02 11:42:47 +01:00
mattieserver 60cbc94a62 remove imp (#426) 2024-01-02 11:27:46 +01:00
Mario 649305c83e Fixes #416: Images View permissions incorrect (#418)
* Add resize listener and height calculation

* Fixed typos
2023-10-29 14:58:17 +01:00
Mario b3397f4f4a Fixes #417: README is missing some permissions (#419)
* Add resize listener and height calculation

* Fixed typos

* add permissions for new views
2023-10-29 14:56:42 +01:00
Mario a23604261a Update README.md (#415)
Version matrix wasn't in sync with the latest release.
2023-10-29 14:56:19 +01:00
mattieserver d9571b30b5 bump version (#410) 2023-10-23 19:17:22 +02:00
kkthxbye 76b43f5d1e Overwrite the form renderer of DeviceFilterForm to fix regression caused by netbox 3.6.4 (#408) 2023-10-20 06:38:33 +02:00
14 changed files with 110 additions and 91 deletions
+11
View File
@@ -50,6 +50,8 @@ python3 manage.py collectstatic --no-input
| netbox version | netbox-topology-views version | | netbox version | netbox-topology-views version |
| -------------- | ----------------------------- | | -------------- | ----------------------------- |
| >= 3.7.0 | >= v3.9.0 |
| >= 3.6.4 | >= v3.8.1 |
| >= 3.6.0 | >= v3.7.X | | >= 3.6.0 | >= v3.7.X |
| >= 3.5.0 | >= v3.4.X | | >= 3.5.0 | >= v3.4.X |
| >= 3.4.0 | >= v3.X.X | | >= 3.4.0 | >= v3.X.X |
@@ -200,3 +202,12 @@ Set `Coordinate Groups` according to your needs:
Set `Coordinates` according to your needs: Set `Coordinates` according to your needs:
+ netbox_topology_views | coordinate | view/add/change/delete + netbox_topology_views | coordinate | view/add/change/delete
Set `Power Feed Coordinates` according to your needs:
+ netbox_topology_views | power feed coordinate | view/add/change/delete
Set `Power Panel Coordinates` according to your needs:
+ netbox_topology_views | power panel coordinate | view/add/change/delete
Set `Circuit Coordinates` according to your needs:
+ netbox_topology_views | circuit coordinate | view/add/change/delete
+1 -1
View File
@@ -5,7 +5,7 @@ class TopologyViewsConfig(PluginConfig):
name = "netbox_topology_views" name = "netbox_topology_views"
verbose_name = "Topology views" verbose_name = "Topology views"
description = "An plugin to render topology maps" description = "An plugin to render topology maps"
version = "3.8.0" version = "3.9.0"
author = "Mattijs Vanhaverbeke" author = "Mattijs Vanhaverbeke"
author_email = "author@example.com" author_email = "author@example.com"
base_url = "netbox_topology_views" base_url = "netbox_topology_views"
+2 -2
View File
@@ -139,8 +139,8 @@ class SaveRoleImageViewSet(PermissionRequiredMixin, ReadOnlyModelViewSet):
queryset = DeviceRole.objects.none() queryset = DeviceRole.objects.none()
serializer_class = RoleImageSerializer serializer_class = RoleImageSerializer
permission_required = ( permission_required = (
"dcim.add_device_role", "dcim.add_devicerole",
"dcim.change_device_role", "dcim.change_devicerole",
) )
@action(detail=False, methods=["post"]) @action(detail=False, methods=["post"])
+1 -1
View File
@@ -1,5 +1,4 @@
from cProfile import label from cProfile import label
import imp
from django import forms from django import forms
from django.conf import settings from django.conf import settings
@@ -30,6 +29,7 @@ class DeviceFilterForm(
ContactModelFilterForm, ContactModelFilterForm,
NetBoxModelFilterSetForm NetBoxModelFilterSetForm
): ):
default_renderer = forms.renderers.DjangoTemplates()
model = Device model = Device
fieldsets = ( fieldsets = (
(None, ('q', 'filter_id', 'tag')), (None, ('q', 'filter_id', 'tag')),
+2 -2
View File
@@ -13,7 +13,7 @@ from netbox.models import NetBoxModel
from netbox.models.features import ( from netbox.models.features import (
ChangeLoggingMixin, ChangeLoggingMixin,
ExportTemplatesMixin, ExportTemplatesMixin,
WebhooksMixin, EventRulesMixin,
) )
from netbox_topology_views.utils import ( from netbox_topology_views.utils import (
@@ -26,7 +26,7 @@ from netbox_topology_views.utils import (
) )
class RoleImage(ChangeLoggingMixin, ExportTemplatesMixin, WebhooksMixin): class RoleImage(ChangeLoggingMixin, ExportTemplatesMixin, EventRulesMixin):
class Meta: class Meta:
indexes = [ indexes = [
models.Index(fields=["content_type", "object_id"]), models.Index(fields=["content_type", "object_id"]),
+1 -1
View File
@@ -106,7 +106,7 @@ menu = PluginMenu(
), ),
('PREFERENCES', ('PREFERENCES',
( (
PluginMenuItem(link="plugins:netbox_topology_views:images", link_text="Images", permissions=[ "dcim.view_site","dcim.view_device_role"]), PluginMenuItem(link="plugins:netbox_topology_views:images", link_text="Images", permissions=[ "dcim.view_site","dcim.view_devicerole"]),
PluginMenuItem(link="plugins:netbox_topology_views:individualoptions", link_text="Individual Options", permissions=['netbox_topology_views.change_individualoptions']), PluginMenuItem(link="plugins:netbox_topology_views:individualoptions", link_text="Individual Options", permissions=['netbox_topology_views.change_individualoptions']),
), ),
), ),
@@ -1 +1 @@
#visgraph{height:64vh}html[data-netbox-color-mode=dark] #visgraph{background-color:#212529}.image-dropdown img{width:64px;height:64px}.image-dropdown-content{display:flex;flex-wrap:wrap;gap:.5rem;padding-inline:.5rem;width:50vw;max-width:32rem}.image-dropdown-content>img{cursor:pointer} #visgraph{height:64vh;border:1px solid #ced4da}html[data-netbox-color-mode=dark] #visgraph{background-color:#212529;border:1px solid #495057}.image-dropdown img{width:64px;height:64px}.image-dropdown-content{display:flex;flex-wrap:wrap;gap:.5rem;padding-inline:.5rem;width:50vw;max-width:32rem}.image-dropdown-content>img{cursor:pointer}
File diff suppressed because one or more lines are too long
@@ -1,12 +1,13 @@
#visgraph { #visgraph {
height: 64vh; height: 64vh;
border: 1px solid #ced4da
} }
html[data-netbox-color-mode=dark] #visgraph { html[data-netbox-color-mode=dark] #visgraph {
background-color: #212529; background-color: #212529;
border: 1px solid #495057
} }
.image-dropdown img { .image-dropdown img {
width: 64px; width: 64px;
height: 64px; height: 64px;
+28 -53
View File
@@ -1,16 +1,16 @@
{ {
"name": "netbox_topology_views", "name": "netbox_topology_views",
"version": "3.7.0", "version": "3.9.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "netbox_topology_views", "name": "netbox_topology_views",
"version": "3.7.0", "version": "3.9.0",
"dependencies": { "dependencies": {
"vis-data": "^7.1.6", "vis-data": "^7.1.9",
"vis-network": "^9.1.6", "vis-network": "^9.1.9",
"vis-util": "^5.0.3" "vis-util": "^5.0.7"
}, },
"devDependencies": { "devDependencies": {
"@egjs/hammerjs": "^2.0.0", "@egjs/hammerjs": "^2.0.0",
@@ -102,7 +102,6 @@
"dependencies": { "dependencies": {
"anymatch": "~3.1.2", "anymatch": "~3.1.2",
"braces": "~3.0.2", "braces": "~3.0.2",
"fsevents": "~2.3.2",
"glob-parent": "~5.1.2", "glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0", "is-binary-path": "~2.1.0",
"is-glob": "~4.0.1", "is-glob": "~4.0.1",
@@ -405,29 +404,6 @@
"integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": {
"@esbuild/linux-loong64": "0.14.54",
"esbuild-android-64": "0.14.54",
"esbuild-android-arm64": "0.14.54",
"esbuild-darwin-64": "0.14.54",
"esbuild-darwin-arm64": "0.14.54",
"esbuild-freebsd-64": "0.14.54",
"esbuild-freebsd-arm64": "0.14.54",
"esbuild-linux-32": "0.14.54",
"esbuild-linux-64": "0.14.54",
"esbuild-linux-arm": "0.14.54",
"esbuild-linux-arm64": "0.14.54",
"esbuild-linux-mips64le": "0.14.54",
"esbuild-linux-ppc64le": "0.14.54",
"esbuild-linux-riscv64": "0.14.54",
"esbuild-linux-s390x": "0.14.54",
"esbuild-netbsd-64": "0.14.54",
"esbuild-openbsd-64": "0.14.54",
"esbuild-sunos-64": "0.14.54",
"esbuild-windows-32": "0.14.54",
"esbuild-windows-64": "0.14.54",
"esbuild-windows-arm64": "0.14.54"
},
"bin": { "bin": {
"esbuild": "bin/esbuild" "esbuild": "bin/esbuild"
}, },
@@ -740,7 +716,8 @@
"node_modules/timsort": { "node_modules/timsort": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
"integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==" "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==",
"dev": true
}, },
"node_modules/to-regex-range": { "node_modules/to-regex-range": {
"version": "5.0.1", "version": "5.0.1",
@@ -763,10 +740,9 @@
} }
}, },
"node_modules/vis-data": { "node_modules/vis-data": {
"version": "7.1.6", "version": "7.1.9",
"resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.6.tgz", "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.9.tgz",
"integrity": "sha512-lG7LJdkawlKSXsdcEkxe/zRDyW29a4r7N7PMwxCPxK12/QIdqxJwcMxwjVj9ozdisRhP5TyWDHZwsgjmj0g6Dg==", "integrity": "sha512-COQsxlVrmcRIbZMMTYwD+C2bxYCFDNQ2EHESklPiInbD/Pk3JZ6qNL84Bp9wWjYjAzXfSlsNaFtRk+hO9yBPWA==",
"hasInstallScript": true,
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
"url": "https://opencollective.com/visjs" "url": "https://opencollective.com/visjs"
@@ -777,10 +753,9 @@
} }
}, },
"node_modules/vis-network": { "node_modules/vis-network": {
"version": "9.1.6", "version": "9.1.9",
"resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.6.tgz", "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.9.tgz",
"integrity": "sha512-Eiwx1JleAsUqfy4pzcsFngCVlCEdjAtRPB/OwCV7PHBm+o2jtE4IZPcPITAEGUlxvL4Fdw7/lZsfD32dL+IL6g==", "integrity": "sha512-Ft+hLBVyiLstVYSb69Q1OIQeh3FeUxHJn0WdFcq+BFPqs+Vq1ibMi2sb//cxgq1CP7PH4yOXnHxEH/B2VzpZYA==",
"hasInstallScript": true,
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
"url": "https://opencollective.com/visjs" "url": "https://opencollective.com/visjs"
@@ -789,16 +764,15 @@
"@egjs/hammerjs": "^2.0.0", "@egjs/hammerjs": "^2.0.0",
"component-emitter": "^1.3.0", "component-emitter": "^1.3.0",
"keycharm": "^0.2.0 || ^0.3.0 || ^0.4.0", "keycharm": "^0.2.0 || ^0.3.0 || ^0.4.0",
"timsort": "^0.3.0",
"uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "uuid": "^3.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
"vis-data": "^6.3.0 || ^7.0.0", "vis-data": "^6.3.0 || ^7.0.0",
"vis-util": "^5.0.1" "vis-util": "^5.0.1"
} }
}, },
"node_modules/vis-util": { "node_modules/vis-util": {
"version": "5.0.3", "version": "5.0.7",
"resolved": "https://registry.npmjs.org/vis-util/-/vis-util-5.0.3.tgz", "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-5.0.7.tgz",
"integrity": "sha512-Wf9STUcFrDzK4/Zr7B6epW2Kvm3ORNWF+WiwEz2dpf5RdWkLUXFSbLcuB88n1W6tCdFwVN+v3V4/Xmn9PeL39g==", "integrity": "sha512-E3L03G3+trvc/X4LXvBfih3YIHcKS2WrP0XTdZefr6W6Qi/2nNCqZfe4JFfJU6DcQLm6Gxqj2Pfl+02859oL5A==",
"engines": { "engines": {
"node": ">=8" "node": ">=8"
}, },
@@ -808,7 +782,7 @@
}, },
"peerDependencies": { "peerDependencies": {
"@egjs/hammerjs": "^2.0.0", "@egjs/hammerjs": "^2.0.0",
"component-emitter": "^1.3.0" "component-emitter": "^1.3.0 || ^2.0.0"
} }
} }
}, },
@@ -1222,7 +1196,8 @@
"timsort": { "timsort": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
"integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==" "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==",
"dev": true
}, },
"to-regex-range": { "to-regex-range": {
"version": "5.0.1", "version": "5.0.1",
@@ -1239,21 +1214,21 @@
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
}, },
"vis-data": { "vis-data": {
"version": "7.1.6", "version": "7.1.9",
"resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.6.tgz", "resolved": "https://registry.npmjs.org/vis-data/-/vis-data-7.1.9.tgz",
"integrity": "sha512-lG7LJdkawlKSXsdcEkxe/zRDyW29a4r7N7PMwxCPxK12/QIdqxJwcMxwjVj9ozdisRhP5TyWDHZwsgjmj0g6Dg==", "integrity": "sha512-COQsxlVrmcRIbZMMTYwD+C2bxYCFDNQ2EHESklPiInbD/Pk3JZ6qNL84Bp9wWjYjAzXfSlsNaFtRk+hO9yBPWA==",
"requires": {} "requires": {}
}, },
"vis-network": { "vis-network": {
"version": "9.1.6", "version": "9.1.9",
"resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.6.tgz", "resolved": "https://registry.npmjs.org/vis-network/-/vis-network-9.1.9.tgz",
"integrity": "sha512-Eiwx1JleAsUqfy4pzcsFngCVlCEdjAtRPB/OwCV7PHBm+o2jtE4IZPcPITAEGUlxvL4Fdw7/lZsfD32dL+IL6g==", "integrity": "sha512-Ft+hLBVyiLstVYSb69Q1OIQeh3FeUxHJn0WdFcq+BFPqs+Vq1ibMi2sb//cxgq1CP7PH4yOXnHxEH/B2VzpZYA==",
"requires": {} "requires": {}
}, },
"vis-util": { "vis-util": {
"version": "5.0.3", "version": "5.0.7",
"resolved": "https://registry.npmjs.org/vis-util/-/vis-util-5.0.3.tgz", "resolved": "https://registry.npmjs.org/vis-util/-/vis-util-5.0.7.tgz",
"integrity": "sha512-Wf9STUcFrDzK4/Zr7B6epW2Kvm3ORNWF+WiwEz2dpf5RdWkLUXFSbLcuB88n1W6tCdFwVN+v3V4/Xmn9PeL39g==", "integrity": "sha512-E3L03G3+trvc/X4LXvBfih3YIHcKS2WrP0XTdZefr6W6Qi/2nNCqZfe4JFfJU6DcQLm6Gxqj2Pfl+02859oL5A==",
"requires": {} "requires": {}
} }
} }
@@ -1,16 +1,16 @@
{ {
"private": true, "private": true,
"name": "netbox_topology_views", "name": "netbox_topology_views",
"version": "3.8.0", "version": "3.9.0",
"scripts": { "scripts": {
"bundle": "node bundle.js", "bundle": "node bundle.js",
"bundle:styles": "node bundle.js --styles", "bundle:styles": "node bundle.js --styles",
"bundle:scripts": "node bundle.js --scripts" "bundle:scripts": "node bundle.js --scripts"
}, },
"dependencies": { "dependencies": {
"vis-data": "^7.1.6", "vis-data": "^7.1.9",
"vis-network": "^9.1.6", "vis-network": "^9.1.9",
"vis-util": "^5.0.3" "vis-util": "^5.0.7"
}, },
"devDependencies": { "devDependencies": {
"@egjs/hammerjs": "^2.0.0", "@egjs/hammerjs": "^2.0.0",
@@ -29,7 +29,7 @@
{% endblock controls %} {% endblock controls %}
{% block tabs %} {% block tabs %}
<ul class="nav nav-tabs px-3"> <ul class="nav nav-tabs px-3" id="tabswrapper">
{% block tab_items %} {% block tab_items %}
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button class="nav-link active" id="network-tab" data-bs-toggle="tab" data-bs-target="#networks" type="button" role="tab" aria-controls="filters-form" aria-selected="true"> <button class="nav-link active" id="network-tab" data-bs-toggle="tab" data-bs-target="#networks" type="button" role="tab" aria-controls="filters-form" aria-selected="true">
@@ -50,11 +50,13 @@
{% block content-wrapper %} {% block content-wrapper %}
{% with config=settings.PLUGINS_CONFIG.netbox_topology_views %} {% with config=settings.PLUGINS_CONFIG.netbox_topology_views %}
<div class="tab-content"> <div class="tab-content" id="tabcontentwrapper">
{# Applied filters #} {# Applied filters #}
{% if filter_form %} {% if filter_form %}
{% applied_filters model filter_form request.GET %} <div id="filterwrapper">
{% applied_filters model filter_form request.GET %}
</div>
{% endif %} {% endif %}
<div class="tab-pane show active" id="networks" role="tabpanel" aria-labelledby="network-tab"> <div class="tab-pane show active" id="networks" role="tabpanel" aria-labelledby="network-tab">
@@ -78,6 +80,36 @@
const brokenImage = '{{ broken_image }}'; const brokenImage = '{{ broken_image }}';
const topologyData = {{ topology_data | safe }}; const topologyData = {{ topology_data | safe }};
const basePath = '{{ basepath }}'; const basePath = '{{ basepath }}';
</script>
window.addEventListener("resize", resizeCanvas);
resizeCanvas();
function resizeCanvas() {
heightToSubtract = getElementHeight('.navbar') +
getElementHeight('.title-container') +
getElementHeight('#tabswrapper') +
getElementHeight('#filterwrapper') +
getElementHeight('.footer') +
getElementPadding('#tabcontentwrapper');
document.getElementById("visgraph").style.height = "calc(100vh - " + heightToSubtract + "px)";
}
function getElementPadding(element) {
el = document.querySelector(element);
els = getComputedStyle(el);
padding = parseInt(els.paddingTop) + parseInt(els.paddingBottom);
return padding;
}
function getElementHeight(element) {
el = document.querySelector(element);
els = getComputedStyle(el);
height = el.offsetHeight + parseInt(els.marginTop) + parseInt(els.marginBottom);
return height;
}
</script>
<script src="{% static 'netbox_topology_views/js/app.js' %}" defer></script> <script src="{% static 'netbox_topology_views/js/app.js' %}" defer></script>
{% endblock javascript %} {% endblock javascript %}
+3 -3
View File
@@ -771,9 +771,9 @@ ADDITIONAL_ROLES = (PowerPanel, PowerFeed, Circuit)
class TopologyImagesView(PermissionRequiredMixin, View): class TopologyImagesView(PermissionRequiredMixin, View):
permission_required = ( permission_required = (
"dcim.view_site", "dcim.view_site",
"dcim.view_device_role", "dcim.view_devicerole",
"dcim.add_device_role", "dcim.add_devicerole",
"dcim.change_device_role", "dcim.change_devicerole",
) )
def get(self, request: HttpRequest): def get(self, request: HttpRequest):
+1 -1
View File
@@ -7,7 +7,7 @@ long_description = readme.read_text()
setup( setup(
name="netbox-topology-views", name="netbox-topology-views",
version="3.8.0", version="3.9.0",
description="An NetBox plugin to create Topology maps", description="An NetBox plugin to create Topology maps",
long_description=long_description, long_description=long_description,
long_description_content_type="text/markdown", long_description_content_type="text/markdown",