1919from .choices import OnboardingStatusChoices , OnboardingFailChoices
2020from .release import NETBOX_RELEASE_CURRENT , NETBOX_RELEASE_29
2121
22+ # Support NetBox 2.8
23+ if NETBOX_RELEASE_CURRENT < NETBOX_RELEASE_29 :
24+ from utilities .models import ChangeLoggedModel # pylint: disable=no-name-in-module, import-error
25+ # Support NetBox 2.9
26+ else :
27+ from extras .models import ChangeLoggedModel # pylint: disable=no-name-in-module, import-error
2228
23- class OnboardingTask (models .Model ):
29+
30+ class OnboardingTask (ChangeLoggedModel ):
2431 """The status of each onboarding Task is tracked in the OnboardingTask table."""
2532
2633 created_device = models .ForeignKey (to = "dcim.Device" , on_delete = models .SET_NULL , blank = True , null = True )
@@ -50,11 +57,6 @@ class OnboardingTask(models.Model):
5057 help_text = "Timeout period in sec to wait while connecting to the device" , default = 30
5158 )
5259
53- created_on = models .DateTimeField (auto_now_add = True )
54-
55- class Meta : # noqa: D106 "missing docstring in public nested class"
56- ordering = ["created_on" ]
57-
5860 def __str__ (self ):
5961 """String representation of an OnboardingTask."""
6062 return f"{ self .site } : { self .ip_address } "
@@ -78,40 +80,67 @@ class OnboardingDevice(models.Model):
7880 @property
7981 def last_check_attempt_date (self ):
8082 """Date of last onboarding attempt for a device."""
81- try :
82- return OnboardingTask .objects .filter (created_device = self .device ).latest ("created_on" ).created_on
83- except ValueError :
83+ if self .device .primary_ip4 :
84+ try :
85+ return (
86+ OnboardingTask .objects .filter (
87+ ip_address = self .device .primary_ip4 .address .ip .format () # pylint: disable=no-member
88+ )
89+ .latest ("last_updated" )
90+ .created
91+ )
92+ except OnboardingTask .DoesNotExist :
93+ return "unknown"
94+ else :
8495 return "unknown"
8596
8697 @property
8798 def last_check_successful_date (self ):
8899 """Date of last successful onboarding for a device."""
89- try :
90- return (
91- OnboardingTask .objects .filter (
92- created_device = self .device , status = OnboardingStatusChoices .STATUS_SUCCEEDED
100+ if self .device .primary_ip4 :
101+ try :
102+ return (
103+ OnboardingTask .objects .filter (
104+ ip_address = self .device .primary_ip4 .address .ip .format (), # pylint: disable=no-member
105+ status = OnboardingStatusChoices .STATUS_SUCCEEDED ,
106+ )
107+ .latest ("last_updated" )
108+ .created
93109 )
94- .latest ("created_on" )
95- .created_on
96- )
97- except ValueError :
110+ except OnboardingTask .DoesNotExist :
111+ return "unknown"
112+ else :
98113 return "unknown"
99114
100115 @property
101116 def status (self ):
102117 """Last onboarding status."""
103- try :
104- return OnboardingTask .objects .filter (created_device = self .device ).latest ("created_on" ).status
105- except ValueError :
118+ if self .device .primary_ip4 :
119+ try :
120+ return (
121+ OnboardingTask .objects .filter (
122+ ip_address = self .device .primary_ip4 .address .ip .format () # pylint: disable=no-member
123+ )
124+ .latest ("last_updated" )
125+ .status
126+ )
127+ except OnboardingTask .DoesNotExist :
128+ return "unknown"
129+ else :
106130 return "unknown"
107131
108132 @property
109133 def last_ot (self ):
110134 """Last onboarding task."""
111- try :
112- return OnboardingTask .objects .filter (created_device = self .device ).latest ("created_on" )
113- except ValueError :
114- return None
135+ if self .device .primary_ip4 :
136+ try :
137+ return OnboardingTask .objects .filter (
138+ ip_address = self .device .primary_ip4 .address .ip .format () # pylint: disable=no-member
139+ ).latest ("last_updated" )
140+ except OnboardingTask .DoesNotExist :
141+ return "unknown"
142+ else :
143+ return "unknown"
115144
116145
117146@receiver (post_save , sender = Device )
0 commit comments