diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 38c641e05..f93f297e0 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -635,16 +635,14 @@ class IPAddressBulkImportView(PermissionRequiredMixin, BulkImportView): def save_obj(self, obj): obj.save() - # Update primary IP for device if needed + + # Update primary IP for device if needed. The Device must be updated directly in the database; otherwise we risk + # overwriting a previous IP assignment from the same import (see #861). try: if obj.family == 4 and obj.primary_ip4_for: - device = obj.primary_ip4_for - device.primary_ip4 = obj - device.save() + Device.objects.filter(pk=obj.primary_ip4_for.pk).update(primary_ip4=obj) elif obj.family == 6 and obj.primary_ip6_for: - device = obj.primary_ip6_for - device.primary_ip6 = obj - device.save() + Device.objects.filter(pk=obj.primary_ip6_for.pk).update(primary_ip6=obj) except Device.DoesNotExist: pass diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index d5909a960..7eb8e04a2 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -12,7 +12,7 @@ except ImportError: "the documentation.") -VERSION = '1.8.3' +VERSION = '1.8.4' # Import local configuration for setting in ['ALLOWED_HOSTS', 'DATABASE', 'SECRET_KEY']: @@ -189,11 +189,6 @@ REST_FRAMEWORK = { if LOGIN_REQUIRED: REST_FRAMEWORK['DEFAULT_PERMISSION_CLASSES'] = ('rest_framework.permissions.IsAuthenticated',) -# Swagger settings (API docs) -SWAGGER_SETTINGS = { - 'base_path': '{}/{}api/docs'.format(ALLOWED_HOSTS[0], BASE_PATH), -} - # Django debug toolbar INTERNAL_IPS = ( '127.0.0.1', diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 0ce898e01..4507e2141 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -548,9 +548,10 @@ {% block javascript %}