Просмотр исходного кода

Fixes #4221: Fix exception when deleting a device with interface connections when an interfaces webhook is defined

Jeremy Stretch 6 лет назад
Родитель
Сommit
909971f237
2 измененных файлов с 31 добавлено и 6 удалено
  1. 1 0
      docs/release-notes/version-2.7.md
  2. 30 6
      netbox/dcim/models/device_components.py

+ 1 - 0
docs/release-notes/version-2.7.md

@@ -6,6 +6,7 @@
 
 ## Bug Fixes
 
+* [#4221](https://github.com/netbox-community/netbox/issues/4221) - Fix exception when deleting a device with interface connections when an interfaces webhook is defined
 * [#4224](https://github.com/netbox-community/netbox/issues/4224) - Fix display of rear device image if front image is not defined 
 * [#4228](https://github.com/netbox-community/netbox/issues/4228) - Improve fit of device images in rack elevations
 * [#4230](https://github.com/netbox-community/netbox/issues/4230) - Fix rack units filtering on elevation endpoint

+ 30 - 6
netbox/dcim/models/device_components.py

@@ -360,9 +360,21 @@ class PowerPort(CableTermination, ComponentModel):
 
     @property
     def connected_endpoint(self):
-        if self._connected_poweroutlet:
-            return self._connected_poweroutlet
-        return self._connected_powerfeed
+        """
+        Return the connected PowerOutlet, if it exists, or the connected PowerFeed, if it exists. We have to check for
+        ObjectDoesNotExist in case the referenced object has been deleted from the database.
+        """
+        try:
+            if self._connected_poweroutlet:
+                return self._connected_poweroutlet
+        except ObjectDoesNotExist:
+            pass
+        try:
+            if self._connected_powerfeed:
+                return self._connected_powerfeed
+        except ObjectDoesNotExist:
+            pass
+        return None
 
     @connected_endpoint.setter
     def connected_endpoint(self, value):
@@ -717,9 +729,21 @@ class Interface(CableTermination, ComponentModel):
 
     @property
     def connected_endpoint(self):
-        if self._connected_interface:
-            return self._connected_interface
-        return self._connected_circuittermination
+        """
+        Return the connected Interface, if it exists, or the connected CircuitTermination, if it exists. We have to
+        check for ObjectDoesNotExist in case the referenced object has been deleted from the database.
+        """
+        try:
+            if self._connected_interface:
+                return self._connected_interface
+        except ObjectDoesNotExist:
+            pass
+        try:
+            if self._connected_circuittermination:
+                return self._connected_circuittermination
+        except ObjectDoesNotExist:
+            pass
+        return None
 
     @connected_endpoint.setter
     def connected_endpoint(self, value):