-
Cancel
{% if '_preview' in request.POST and not form.errors %}
{% endif %}
+
Cancel
diff --git a/netbox/templates/generic/confirmation_form.html b/netbox/templates/generic/confirmation_form.html
index c4c15f7e7..e9d3d01aa 100644
--- a/netbox/templates/generic/confirmation_form.html
+++ b/netbox/templates/generic/confirmation_form.html
@@ -2,33 +2,24 @@
{% load form_helpers %}
{% block content %}
-
-
-
-
-
-
+
{% endblock %}
diff --git a/netbox/templates/generic/object_edit.html b/netbox/templates/generic/object_edit.html
index 06308e9ef..892c7d2b1 100644
--- a/netbox/templates/generic/object_edit.html
+++ b/netbox/templates/generic/object_edit.html
@@ -94,19 +94,19 @@ Context:
{% block buttons %}
-
Cancel
{% if object.pk %}
{% else %}
-
+
{% endif %}
+
Cancel
{% endblock buttons %}
diff --git a/netbox/templates/generic/object_import.html b/netbox/templates/generic/object_import.html
index ffa16b4c2..4d54fde61 100644
--- a/netbox/templates/generic/object_import.html
+++ b/netbox/templates/generic/object_import.html
@@ -5,19 +5,19 @@
{% block title %}{{ obj_type|bettertitle }} Import{% endblock %}
{% block content %}
-
+
{% endblock content %}
diff --git a/netbox/templates/virtualization/vminterface_edit.html b/netbox/templates/virtualization/vminterface_edit.html
index 496960a64..316900865 100644
--- a/netbox/templates/virtualization/vminterface_edit.html
+++ b/netbox/templates/virtualization/vminterface_edit.html
@@ -55,14 +55,3 @@
{% endif %}
{% endblock %}
-
-{% block buttons %}
-
Cancel
- {% if object.pk %}
-
-
- {% else %}
-
-
- {% endif %}
-{% endblock %}
diff --git a/netbox/tenancy/api/serializers.py b/netbox/tenancy/api/serializers.py
index b5cce741a..f217fdaf8 100644
--- a/netbox/tenancy/api/serializers.py
+++ b/netbox/tenancy/api/serializers.py
@@ -4,6 +4,7 @@ from rest_framework import serializers
from netbox.api.fields import ChoiceField, ContentTypeField
from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer
+from netbox.constants import NESTED_SERIALIZER_PREFIX
from tenancy.choices import ContactPriorityChoices
from tenancy.models import *
from utilities.api import get_serializer_for_model
@@ -108,6 +109,6 @@ class ContactAssignmentSerializer(NetBoxModelSerializer):
@swagger_serializer_method(serializer_or_field=serializers.DictField)
def get_object(self, instance):
- serializer = get_serializer_for_model(instance.content_type.model_class(), prefix='Nested')
+ serializer = get_serializer_for_model(instance.content_type.model_class(), prefix=NESTED_SERIALIZER_PREFIX)
context = {'request': self.context['request']}
return serializer(instance.object, context=context).data
diff --git a/netbox/users/views.py b/netbox/users/views.py
index aabdd6774..1fb2baa62 100644
--- a/netbox/users/views.py
+++ b/netbox/users/views.py
@@ -20,7 +20,7 @@ from netbox.authentication import get_auth_backend_display
from netbox.config import get_config
from utilities.forms import ConfirmationForm
from .forms import LoginForm, PasswordChangeForm, TokenForm, UserConfigForm
-from .models import Token
+from .models import Token, UserConfig
from .tables import TokenTable
@@ -70,7 +70,13 @@ class LoginView(View):
# Authenticate user
auth_login(request, form.get_user())
logger.info(f"User {request.user} successfully authenticated")
- messages.info(request, "Logged in as {}.".format(request.user))
+ messages.info(request, f"Logged in as {request.user}.")
+
+ # Ensure the user has a UserConfig defined. (This should normally be handled by
+ # create_userconfig() on user creation.)
+ if not hasattr(request.user, 'config'):
+ config = get_config()
+ UserConfig(user=request.user, data=config.DEFAULT_USER_PREFERENCES).save()
return self.redirect_to_next(request, logger)
diff --git a/netbox/utilities/templatetags/builtins/filters.py b/netbox/utilities/templatetags/builtins/filters.py
index 738dc0e00..5a6841286 100644
--- a/netbox/utilities/templatetags/builtins/filters.py
+++ b/netbox/utilities/templatetags/builtins/filters.py
@@ -144,6 +144,8 @@ def render_markdown(value):
{{ md_source_text|markdown }}
"""
+ if not value:
+ return ''
# Render Markdown
html = markdown(value, extensions=['def_list', 'fenced_code', 'tables', StrikethroughExtension()])
diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py
index 0b593289b..4cd7da30d 100644
--- a/netbox/virtualization/views.py
+++ b/netbox/virtualization/views.py
@@ -471,6 +471,7 @@ class VMInterfaceBulkImportView(generic.BulkImportView):
class VMInterfaceBulkEditView(generic.BulkEditView):
queryset = VMInterface.objects.all()
+ filterset = filtersets.VMInterfaceFilterSet
table = tables.VMInterfaceTable
form = forms.VMInterfaceBulkEditForm
@@ -482,6 +483,7 @@ class VMInterfaceBulkRenameView(generic.BulkRenameView):
class VMInterfaceBulkDeleteView(generic.BulkDeleteView):
queryset = VMInterface.objects.all()
+ filterset = filtersets.VMInterfaceFilterSet
table = tables.VMInterfaceTable