}>(
+ { element: null },
+ { persist: false },
+);
diff --git a/netbox/templates/circuits/circuit_terminations_swap.html b/netbox/templates/circuits/circuit_terminations_swap.html
index 27eebb3d8..b2b30d635 100644
--- a/netbox/templates/circuits/circuit_terminations_swap.html
+++ b/netbox/templates/circuits/circuit_terminations_swap.html
@@ -10,7 +10,7 @@
{% if termination_a %}
{{ termination_a.site }} {% if termination_a.interface %}- {{ termination_a.interface.device }} {{ termination_a.interface }}{% endif %}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -18,7 +18,7 @@
{% if termination_z %}
{{ termination_z.site }} {% if termination_z.interface %}- {{ termination_z.interface.device }} {{ termination_z.interface }}{% endif %}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/circuits/inc/circuit_termination.html b/netbox/templates/circuits/inc/circuit_termination.html
index fdb01e803..b673cd4a3 100644
--- a/netbox/templates/circuits/inc/circuit_termination.html
+++ b/netbox/templates/circuits/inc/circuit_termination.html
@@ -94,7 +94,7 @@
{% elif termination.port_speed %}
{{ termination.port_speed|humanize_speed }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/circuits/provider.html b/netbox/templates/circuits/provider.html
index 1bf63f2d5..60bf8cfbc 100644
--- a/netbox/templates/circuits/provider.html
+++ b/netbox/templates/circuits/provider.html
@@ -50,7 +50,7 @@
{% if object.portal_url %}
{{ object.portal_url }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/dcim/cable.html b/netbox/templates/dcim/cable.html
index f1cf986e6..cd171cbb3 100644
--- a/netbox/templates/dcim/cable.html
+++ b/netbox/templates/dcim/cable.html
@@ -40,7 +40,7 @@
{% if object.color %}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -50,7 +50,7 @@
{% if object.length %}
{{ object.length|floatformat }} {{ object.get_length_unit_display }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html
index d075a801d..d3d6f03dc 100644
--- a/netbox/templates/dcim/device.html
+++ b/netbox/templates/dcim/device.html
@@ -23,7 +23,7 @@
{% endfor %}
{{ object.site.region|linkify }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -40,7 +40,7 @@
{% endfor %}
{{ object.location|linkify }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -50,7 +50,7 @@
{% if object.rack %}
{{ object.rack }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -69,7 +69,7 @@
{% elif object.rack and object.device_type.u_height %}
Not racked
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -180,7 +180,7 @@
(NAT: {{ object.primary_ip4.nat_outside.address.ip|linkify }})
{% endif %}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -195,7 +195,7 @@
(NAT: {{ object.primary_ip6.nat_outside.address.ip|linkify }})
{% endif %}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/dcim/devicerole.html b/netbox/templates/dcim/devicerole.html
index 288101c08..610c53071 100644
--- a/netbox/templates/dcim/devicerole.html
+++ b/netbox/templates/dcim/devicerole.html
@@ -54,7 +54,7 @@
{% if object.vm_role %}
{{ virtualmachine_count }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/dcim/devicetype.html b/netbox/templates/dcim/devicetype.html
index e717a48aa..bb3ec9d2e 100644
--- a/netbox/templates/dcim/devicetype.html
+++ b/netbox/templates/dcim/devicetype.html
@@ -55,7 +55,7 @@
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -67,7 +67,7 @@
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html
index 358922730..c4cb8b72f 100644
--- a/netbox/templates/dcim/interface.html
+++ b/netbox/templates/dcim/interface.html
@@ -321,7 +321,7 @@
{% if object.rf_channel_frequency %}
{{ object.rf_channel_frequency|simplify_decimal }} MHz
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
{% if peer %}
@@ -329,7 +329,7 @@
{% if peer.rf_channel_frequency %}
{{ peer.rf_channel_frequency|simplify_decimal }} MHz
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
{% endif %}
@@ -340,7 +340,7 @@
{% if object.rf_channel_width %}
{{ object.rf_channel_width|simplify_decimal }} MHz
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
{% if peer %}
@@ -348,7 +348,7 @@
{% if peer.rf_channel_width %}
{{ peer.rf_channel_width|simplify_decimal }} MHz
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
{% endif %}
diff --git a/netbox/templates/dcim/powerfeed.html b/netbox/templates/dcim/powerfeed.html
index 777af5563..ed1f9a1cd 100644
--- a/netbox/templates/dcim/powerfeed.html
+++ b/netbox/templates/dcim/powerfeed.html
@@ -44,7 +44,7 @@
{% if object.connected_endpoint %}
{{ object.connected_endpoint.device|linkify }} ({{ object.connected_endpoint }})
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/dcim/poweroutlet.html b/netbox/templates/dcim/poweroutlet.html
index 6408bc759..c312bee03 100644
--- a/netbox/templates/dcim/poweroutlet.html
+++ b/netbox/templates/dcim/poweroutlet.html
@@ -44,7 +44,7 @@
Power Port |
- {{ object.power_port }} |
+ {{ object.power_port|linkify|placeholder }} |
Feed Leg |
diff --git a/netbox/templates/dcim/rack.html b/netbox/templates/dcim/rack.html
index 6574e9b74..42f6a8e99 100644
--- a/netbox/templates/dcim/rack.html
+++ b/netbox/templates/dcim/rack.html
@@ -53,7 +53,7 @@
{% endfor %}
{{ object.location|linkify }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -115,7 +115,7 @@
{% if object.type %}
{{ object.get_type_display }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -133,7 +133,7 @@
{% if object.outer_width %}
{{ object.outer_width }} {{ object.get_outer_unit_display }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -143,7 +143,7 @@
{% if object.outer_depth %}
{{ object.outer_depth }} {{ object.get_outer_unit_display }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html
index c15cab468..ab04ea018 100644
--- a/netbox/templates/dcim/site.html
+++ b/netbox/templates/dcim/site.html
@@ -34,7 +34,7 @@
{% endfor %}
{{ object.region|linkify }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -47,7 +47,7 @@
{% endfor %}
{{ object.group|linkify }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -79,7 +79,7 @@
{{ object.time_zone }} (UTC {{ object.time_zone|tzoffset }})
Site time: {% timezone object.time_zone %}{% annotated_now %}{% endtimezone %}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -94,7 +94,7 @@
{{ object.physical_address|linebreaksbr }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -113,7 +113,7 @@
{{ object.latitude }}, {{ object.longitude }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/dcim/virtualchassis_edit.html b/netbox/templates/dcim/virtualchassis_edit.html
index 327f20531..275391c61 100644
--- a/netbox/templates/dcim/virtualchassis_edit.html
+++ b/netbox/templates/dcim/virtualchassis_edit.html
@@ -57,7 +57,7 @@
{% if device.rack %}
{{ device.rack }} / {{ device.position }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
{{ device.serial|placeholder }} |
diff --git a/netbox/templates/extras/customfield.html b/netbox/templates/extras/customfield.html
index aca0b5012..ff4e6e08c 100644
--- a/netbox/templates/extras/customfield.html
+++ b/netbox/templates/extras/customfield.html
@@ -69,7 +69,7 @@
{% if object.choices %}
{{ object.choices|join:", " }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -113,7 +113,7 @@
{% if object.validation_regex %}
{{ object.validation_regex }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/extras/htmx/report_result.html b/netbox/templates/extras/htmx/report_result.html
index 9b3e9db5f..c20bf5fe2 100644
--- a/netbox/templates/extras/htmx/report_result.html
+++ b/netbox/templates/extras/htmx/report_result.html
@@ -57,7 +57,7 @@
{% elif obj %}
{{ obj }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
{{ message|markdown }} |
diff --git a/netbox/templates/generic/bulk_import.html b/netbox/templates/generic/bulk_import.html
index 43e078826..1a85c3a21 100644
--- a/netbox/templates/generic/bulk_import.html
+++ b/netbox/templates/generic/bulk_import.html
@@ -76,14 +76,14 @@ Context:
{% if field.required %}
{% checkmark True true="Required" %}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
{% if field.to_field_name %}
{{ field.to_field_name }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
|
diff --git a/netbox/templates/ipam/ipaddress.html b/netbox/templates/ipam/ipaddress.html
index 7981ea0fe..8b628c2f7 100644
--- a/netbox/templates/ipam/ipaddress.html
+++ b/netbox/templates/ipam/ipaddress.html
@@ -52,7 +52,7 @@
{% if object.role %}
{{ object.get_role_display }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
|
@@ -73,7 +73,7 @@
{% endif %}
{{ object.assigned_object|linkify }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -86,7 +86,7 @@
({{ object.nat_inside.assigned_object.parent_object|linkify }})
{% endif %}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/ipam/prefix.html b/netbox/templates/ipam/prefix.html
index e2ba76a82..a47566ff7 100644
--- a/netbox/templates/ipam/prefix.html
+++ b/netbox/templates/ipam/prefix.html
@@ -39,7 +39,7 @@
{% if aggregate %}
{{ aggregate.prefix }} ({{ aggregate.rir }})
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -52,7 +52,7 @@
{% endif %}
{{ object.site|linkify }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -65,7 +65,7 @@
{% endif %}
{{ object.vlan|linkify }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -138,7 +138,7 @@
{{ first_available_ip }}
{% endif %}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
{% endwith %}
diff --git a/netbox/templates/ipam/role.html b/netbox/templates/ipam/role.html
index 49570099d..a6ef2c6d4 100644
--- a/netbox/templates/ipam/role.html
+++ b/netbox/templates/ipam/role.html
@@ -45,7 +45,7 @@
{% if ipranges_count %}
{{ ipranges_count }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
{% endwith %}
@@ -57,7 +57,7 @@
{% if vlans_count %}
{{ vlans_count }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
{% endwith %}
diff --git a/netbox/templates/ipam/service.html b/netbox/templates/ipam/service.html
index 71ea20fa5..47ae70dc9 100644
--- a/netbox/templates/ipam/service.html
+++ b/netbox/templates/ipam/service.html
@@ -44,7 +44,7 @@
{% for ipaddress in object.ipaddresses.all %}
{{ ipaddress|linkify }}
{% empty %}
- None
+ {{ ''|placeholder }}
{% endfor %}
diff --git a/netbox/templates/ipam/vlan.html b/netbox/templates/ipam/vlan.html
index f74149ad6..fd0ba36a3 100644
--- a/netbox/templates/ipam/vlan.html
+++ b/netbox/templates/ipam/vlan.html
@@ -21,7 +21,7 @@
{% endif %}
{{ object.site|linkify }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -56,7 +56,7 @@
{% if object.role %}
{{ object.role }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/tenancy/contact.html b/netbox/templates/tenancy/contact.html
index f55e87895..8e71628e9 100644
--- a/netbox/templates/tenancy/contact.html
+++ b/netbox/templates/tenancy/contact.html
@@ -35,7 +35,7 @@
{% if object.phone %}
{{ object.phone }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
@@ -45,7 +45,7 @@
{% if object.email %}
{{ object.email }}
{% else %}
- None
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/users/profile.html b/netbox/templates/users/profile.html
index 112603126..913784c94 100644
--- a/netbox/templates/users/profile.html
+++ b/netbox/templates/users/profile.html
@@ -21,7 +21,7 @@
{% if request.user.first_name or request.user.last_name %}
{{ request.user.first_name }} {{ request.user.last_name }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/virtualization/virtualmachine.html b/netbox/templates/virtualization/virtualmachine.html
index 2831a452a..f62da6fed 100644
--- a/netbox/templates/virtualization/virtualmachine.html
+++ b/netbox/templates/virtualization/virtualmachine.html
@@ -49,7 +49,7 @@
(NAT: {{ object.primary_ip4.nat_outside.address.ip }})
{% endif %}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -64,7 +64,7 @@
(NAT: {{ object.primary_ip6.nat_outside.address.ip }})
{% endif %}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -123,7 +123,7 @@
{% if object.memory %}
{{ object.memory|humanize_megabytes }}
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -133,7 +133,7 @@
{% if object.disk %}
{{ object.disk }} GB
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/templates/wireless/inc/wirelesslink_interface.html b/netbox/templates/wireless/inc/wirelesslink_interface.html
index db4f84f0a..7732816a7 100644
--- a/netbox/templates/wireless/inc/wirelesslink_interface.html
+++ b/netbox/templates/wireless/inc/wirelesslink_interface.html
@@ -33,7 +33,7 @@
{% if interface.rf_channel_frequency %}
{{ interface.rf_channel_frequency|simplify_decimal }} MHz
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
@@ -43,7 +43,7 @@
{% if interface.rf_channel_width %}
{{ interface.rf_channel_width|simplify_decimal }} MHz
{% else %}
- —
+ {{ ''|placeholder }}
{% endif %}
diff --git a/netbox/utilities/forms/fields/fields.py b/netbox/utilities/forms/fields/fields.py
index 0d09d2ac7..9168189a1 100644
--- a/netbox/utilities/forms/fields/fields.py
+++ b/netbox/utilities/forms/fields/fields.py
@@ -3,6 +3,7 @@ import json
from django import forms
from django.db.models import Count
from django.forms.fields import JSONField as _JSONField, InvalidJSONInput
+from django.templatetags.static import static
from netaddr import AddrFormatError, EUI
from utilities.forms import widgets
@@ -26,10 +27,9 @@ class CommentField(forms.CharField):
A textarea with support for Markdown rendering. Exists mostly just to add a standard `help_text`.
"""
widget = forms.Textarea
- # TODO: Port Markdown cheat sheet to internal documentation
- help_text = """
+ help_text = f"""
-
+
Markdown syntax is supported
"""
diff --git a/netbox/utilities/templatetags/builtins/filters.py b/netbox/utilities/templatetags/builtins/filters.py
index 44ad5ac47..738dc0e00 100644
--- a/netbox/utilities/templatetags/builtins/filters.py
+++ b/netbox/utilities/templatetags/builtins/filters.py
@@ -11,7 +11,7 @@ from markdown import markdown
from netbox.config import get_config
from utilities.markdown import StrikethroughExtension
-from utilities.utils import foreground_color
+from utilities.utils import clean_html, foreground_color
register = template.Library()
@@ -144,18 +144,6 @@ def render_markdown(value):
{{ md_source_text|markdown }}
"""
- schemes = '|'.join(get_config().ALLOWED_URL_SCHEMES)
-
- # Strip HTML tags
- value = strip_tags(value)
-
- # Sanitize Markdown links
- pattern = fr'\[([^\]]+)\]\(\s*(?!({schemes})).*:(.+)\)'
- value = re.sub(pattern, '[\\1](\\3)', value, flags=re.IGNORECASE)
-
- # Sanitize Markdown reference links
- pattern = fr'\[([^\]]+)\]:\s*(?!({schemes}))\w*:(.+)'
- value = re.sub(pattern, '[\\1]: \\3', value, flags=re.IGNORECASE)
# Render Markdown
html = markdown(value, extensions=['def_list', 'fenced_code', 'tables', StrikethroughExtension()])
@@ -164,6 +152,11 @@ def render_markdown(value):
if html:
html = f'{html}
'
+ schemes = get_config().ALLOWED_URL_SCHEMES
+
+ # Sanitize HTML
+ html = clean_html(html, schemes)
+
return mark_safe(html)
diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py
index 7b37c0b70..2b939471c 100644
--- a/netbox/utilities/utils.py
+++ b/netbox/utilities/utils.py
@@ -4,6 +4,7 @@ from collections import OrderedDict
from decimal import Decimal
from itertools import count, groupby
+import bleach
from django.core.serializers import serialize
from django.db.models import Count, OuterRef, Subquery
from django.db.models.functions import Coalesce
@@ -14,6 +15,7 @@ from mptt.models import MPTTModel
from dcim.choices import CableLengthUnitChoices
from extras.plugins import PluginConfig
from extras.utils import is_taggable
+from netbox.config import get_config
from utilities.constants import HTTP_REQUEST_META_SAFE_COPY
@@ -257,7 +259,9 @@ def render_jinja2(template_code, context):
"""
Render a Jinja2 template with the provided context. Return the rendered content.
"""
- return SandboxedEnvironment().from_string(source=template_code).render(**context)
+ environment = SandboxedEnvironment()
+ environment.filters.update(get_config().JINJA2_FILTERS)
+ return environment.from_string(source=template_code).render(**context)
def prepare_cloned_fields(instance):
@@ -382,3 +386,33 @@ def copy_safe_request(request):
'path': request.path,
'id': getattr(request, 'id', None), # UUID assigned by middleware
})
+
+
+def clean_html(html, schemes):
+ """
+ Sanitizes HTML based on a whitelist of allowed tags and attributes.
+ Also takes a list of allowed URI schemes.
+ """
+
+ ALLOWED_TAGS = [
+ "div", "pre", "code", "blockquote", "del",
+ "hr", "h1", "h2", "h3", "h4", "h5", "h6",
+ "ul", "ol", "li", "p", "br",
+ "strong", "em", "a", "b", "i", "img",
+ "table", "thead", "tbody", "tr", "th", "td",
+ "dl", "dt", "dd",
+ ]
+
+ ALLOWED_ATTRIBUTES = {
+ "div": ['class'],
+ "h1": ["id"], "h2": ["id"], "h3": ["id"], "h4": ["id"], "h5": ["id"], "h6": ["id"],
+ "a": ["href", "title"],
+ "img": ["src", "title", "alt"],
+ }
+
+ return bleach.clean(
+ html,
+ tags=ALLOWED_TAGS,
+ attributes=ALLOWED_ATTRIBUTES,
+ protocols=schemes
+ )
diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py
index 88dee3978..b2429744b 100644
--- a/netbox/virtualization/forms/bulk_edit.py
+++ b/netbox/virtualization/forms/bulk_edit.py
@@ -3,7 +3,7 @@ from django import forms
from dcim.choices import InterfaceModeChoices
from dcim.constants import INTERFACE_MTU_MAX, INTERFACE_MTU_MIN
from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup
-from ipam.models import VLAN, VRF
+from ipam.models import VLAN, VLANGroup, VRF
from netbox.forms import NetBoxModelBulkEditForm
from tenancy.models import Tenant
from utilities.forms import (
@@ -202,13 +202,26 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm):
required=False,
widget=StaticSelect()
)
+ vlan_group = DynamicModelChoiceField(
+ queryset=VLANGroup.objects.all(),
+ required=False,
+ label='VLAN group'
+ )
untagged_vlan = DynamicModelChoiceField(
queryset=VLAN.objects.all(),
- required=False
+ required=False,
+ query_params={
+ 'group_id': '$vlan_group',
+ },
+ label='Untagged VLAN'
)
tagged_vlans = DynamicModelMultipleChoiceField(
queryset=VLAN.objects.all(),
- required=False
+ required=False,
+ query_params={
+ 'group_id': '$vlan_group',
+ },
+ label='Tagged VLANs'
)
vrf = DynamicModelChoiceField(
queryset=VRF.objects.all(),
@@ -220,7 +233,7 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm):
fieldsets = (
(None, ('mtu', 'enabled', 'vrf', 'description')),
('Related Interfaces', ('parent', 'bridge')),
- ('802.1Q Switching', ('mode', 'untagged_vlan', 'tagged_vlans')),
+ ('802.1Q Switching', ('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans')),
)
nullable_fields = (
'parent', 'bridge', 'mtu', 'vrf', 'description',
diff --git a/netbox/virtualization/forms/models.py b/netbox/virtualization/forms/models.py
index cfafd7e39..018b50c99 100644
--- a/netbox/virtualization/forms/models.py
+++ b/netbox/virtualization/forms/models.py
@@ -323,7 +323,7 @@ class VMInterfaceForm(InterfaceCommonForm, NetBoxModelForm):
model = VMInterface
fields = [
'virtual_machine', 'name', 'parent', 'bridge', 'enabled', 'mac_address', 'mtu', 'description', 'mode',
- 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags',
+ 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags',
]
widgets = {
'virtual_machine': forms.HiddenInput(),
diff --git a/requirements.txt b/requirements.txt
index 1def8e23e..d5b86eafa 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,8 @@
-Django==4.0.4
-django-cors-headers==3.12.0
-django-debug-toolbar==3.2.4
-django-filter==21.1
+bleach==5.0.0
+Django==4.0.5
+django-cors-headers==3.13.0
+django-debug-toolbar==3.4.0
+django-filter==22.1
django-graphiql-debug-toolbar==0.2.0
django-mptt==0.13.4
django-pglocks==1.0.4
@@ -19,7 +20,7 @@ gunicorn==20.1.0
Jinja2==3.1.2
Markdown==3.3.7
markdown-include==0.6.0
-mkdocs-material==8.2.16
+mkdocs-material==8.3.6
mkdocstrings[python-legacy]==0.19.0
netaddr==0.8.0
Pillow==9.1.1
@@ -27,7 +28,7 @@ psycopg2-binary==2.9.3
PyYAML==6.0
sentry-sdk==1.5.12
social-auth-app-django==5.0.0
-social-auth-core==4.2.0
+social-auth-core==4.3.0
svgwrite==1.4.2
tablib==3.2.1
tzdata==2022.1