15
15
from core .models import ObjectType
16
16
from dcim .models import Device , Interface , ModuleBay , Site
17
17
from extras .models import CustomField
18
- from extras .models .customfields import CustomFieldTypeChoices
18
+ from extras .models .customfields import CustomFieldChoiceSet , CustomFieldChoiceSetBaseChoices , CustomFieldTypeChoices
19
19
from ipam .models import IPAddress , VLANGroup
20
20
from rest_framework import status
21
21
from utilities .testing import APITestCase
@@ -98,6 +98,59 @@ def setUp(self):
98
98
self .decimal_field .object_types .set ([self .object_type ])
99
99
self .decimal_field .save ()
100
100
101
+ self .long_text_field = CustomField .objects .create (
102
+ name = 'my_long_text' ,
103
+ type = CustomFieldTypeChoices .TYPE_LONGTEXT ,
104
+ required = False ,
105
+ unique = False ,
106
+ )
107
+ self .long_text_field .object_types .set ([self .object_type ])
108
+ self .long_text_field .save ()
109
+
110
+ choices = CustomFieldChoiceSet .objects .create (
111
+ name = 'my_choices' ,
112
+ base_choices = CustomFieldChoiceSetBaseChoices .IATA ,
113
+ )
114
+ self .selection_field = CustomField .objects .create (
115
+ name = 'my_selection' ,
116
+ type = CustomFieldTypeChoices .TYPE_SELECT ,
117
+ required = False ,
118
+ unique = False ,
119
+ choice_set = choices ,
120
+ )
121
+ self .selection_field .object_types .set ([self .object_type ])
122
+ self .selection_field .save ()
123
+
124
+ self .multiple_selection_field = CustomField .objects .create (
125
+ name = 'my_multiple_selection' ,
126
+ type = CustomFieldTypeChoices .TYPE_MULTISELECT ,
127
+ required = False ,
128
+ unique = False ,
129
+ choice_set = choices ,
130
+ )
131
+ self .multiple_selection_field .object_types .set ([self .object_type ])
132
+ self .multiple_selection_field .save ()
133
+
134
+ self .object_field = CustomField .objects .create (
135
+ name = 'my_object' ,
136
+ type = CustomFieldTypeChoices .TYPE_OBJECT ,
137
+ required = False ,
138
+ unique = False ,
139
+ related_object_type = self .object_type ,
140
+ )
141
+ self .object_field .object_types .set ([self .object_type ])
142
+ self .object_field .save ()
143
+
144
+ self .multiple_objects_field = CustomField .objects .create (
145
+ name = 'my_multiple_objects' ,
146
+ type = CustomFieldTypeChoices .TYPE_MULTIOBJECT ,
147
+ required = False ,
148
+ unique = False ,
149
+ related_object_type = self .object_type ,
150
+ )
151
+ self .multiple_objects_field .object_types .set ([self .object_type ])
152
+ self .multiple_objects_field .save ()
153
+
101
154
def tearDown (self ):
102
155
"""Clean up after tests."""
103
156
self .introspect_patcher .stop ()
@@ -539,6 +592,36 @@ def test_generate_diff_and_apply_create_and_update_site_with_custom_field(self):
539
592
"some_json" : {
540
593
"json" : '{"some_key": 9876543210}' ,
541
594
},
595
+ "my_long_text" : {
596
+ "long_text" : "This is a long text" ,
597
+ },
598
+ "my_selection" : {
599
+ "selection" : "LAX" ,
600
+ },
601
+ "my_multiple_selection" : {
602
+ "multiple_selection" : ["JFK" , "LAX" ],
603
+ },
604
+ "my_object" : {
605
+ "object" : {
606
+ "site" : {
607
+ "name" : "Custom Object Site Ref 1" ,
608
+ }
609
+ },
610
+ },
611
+ "my_multiple_objects" : {
612
+ "multiple_objects" : [
613
+ {
614
+ "site" : {
615
+ "name" : "Custom Object Site Ref 2" ,
616
+ }
617
+ },
618
+ {
619
+ "site" : {
620
+ "name" : "Custom Object Site Ref 3" ,
621
+ }
622
+ },
623
+ ],
624
+ },
542
625
},
543
626
},
544
627
}
@@ -549,6 +632,19 @@ def test_generate_diff_and_apply_create_and_update_site_with_custom_field(self):
549
632
self .assertEqual (new_site .custom_field_data [self .uuid_field .name ], site_uuid )
550
633
self .assertEqual (new_site .custom_field_data [self .json_field .name ], {"some_key" : 9876543210 })
551
634
self .assertEqual (new_site .custom_field_data [self .decimal_field .name ], 1234.567 )
635
+ self .assertEqual (new_site .custom_field_data [self .long_text_field .name ], "This is a long text" )
636
+ self .assertEqual (new_site .custom_field_data [self .selection_field .name ], "LAX" )
637
+ self .assertEqual (new_site .custom_field_data [self .multiple_selection_field .name ], ["JFK" , "LAX" ])
638
+
639
+ siteRef1 = Site .objects .get (name = "Custom Object Site Ref 1" )
640
+ self .assertIsNotNone (siteRef1 )
641
+ self .assertEqual (new_site .custom_field_data [self .object_field .name ], siteRef1 .pk )
642
+ siteRef2 = Site .objects .get (name = "Custom Object Site Ref 2" )
643
+ self .assertIsNotNone (siteRef2 )
644
+ self .assertEqual (new_site .custom_field_data [self .multiple_objects_field .name ][0 ], siteRef2 .pk )
645
+ siteRef3 = Site .objects .get (name = "Custom Object Site Ref 3" )
646
+ self .assertIsNotNone (siteRef3 )
647
+ self .assertEqual (new_site .custom_field_data [self .multiple_objects_field .name ][1 ], siteRef3 .pk )
552
648
553
649
payload = {
554
650
"timestamp" : 1 ,
@@ -596,6 +692,21 @@ def test_generate_diff_and_apply_create_and_update_site_with_custom_field(self):
596
692
"mydate" : {
597
693
"date" : "2026-01-02T00:00:00Z" ,
598
694
},
695
+ "my_multiple_objects" : {
696
+ "multiple_objects" : [
697
+ {
698
+ "site" : {
699
+ "name" : "Custom Object Site Ref 2" ,
700
+ }
701
+ },
702
+ {
703
+ "site" : {
704
+ "name" : "Custom Object Site Ref 4" ,
705
+ }
706
+ },
707
+ ],
708
+ },
709
+
599
710
},
600
711
},
601
712
}
@@ -608,6 +719,15 @@ def test_generate_diff_and_apply_create_and_update_site_with_custom_field(self):
608
719
self .assertEqual (new_site .cf [self .datetime_field .name ], datetime .datetime (2026 , 1 , 1 , 10 , 0 , 0 , tzinfo = datetime .timezone .utc ))
609
720
self .assertEqual (new_site .cf [self .date_field .name ], datetime .date (2026 , 1 , 2 ))
610
721
722
+ self .assertEqual (len (new_site .custom_field_data [self .multiple_objects_field .name ]), 2 )
723
+ siteRef2 = Site .objects .get (name = "Custom Object Site Ref 2" )
724
+ self .assertIsNotNone (siteRef2 )
725
+ self .assertEqual (new_site .custom_field_data [self .multiple_objects_field .name ][0 ], siteRef2 .pk )
726
+ siteRef4 = Site .objects .get (name = "Custom Object Site Ref 4" )
727
+ self .assertIsNotNone (siteRef3 )
728
+ self .assertEqual (new_site .custom_field_data [self .multiple_objects_field .name ][1 ], siteRef4 .pk )
729
+
730
+
611
731
payload = {
612
732
"timestamp" : 1 ,
613
733
"object_type" : "dcim.site" ,
0 commit comments