@@ -122,13 +122,14 @@ def test_simple_fields(self):
122
122
123
123
def test_select_field (self ):
124
124
obj_type = ContentType .objects .get_for_model (Site )
125
+ choices = ['Option A' , 'Option B' , 'Option C' ]
125
126
126
127
# Create a custom field
127
128
cf = CustomField (
128
129
type = CustomFieldTypeChoices .TYPE_SELECT ,
129
130
name = 'my_field' ,
130
131
required = False ,
131
- choices = [ 'Option A' , 'Option B' , 'Option C' ]
132
+ choices = choices
132
133
)
133
134
cf .save ()
134
135
cf .content_types .set ([obj_type ])
@@ -138,12 +139,47 @@ def test_select_field(self):
138
139
self .assertIsNone (site .custom_field_data [cf .name ])
139
140
140
141
# Assign a value to the first Site
141
- site .custom_field_data [cf .name ] = 'Option A'
142
+ site .custom_field_data [cf .name ] = choices [ 0 ]
142
143
site .save ()
143
144
144
145
# Retrieve the stored value
145
146
site .refresh_from_db ()
146
- self .assertEqual (site .custom_field_data [cf .name ], 'Option A' )
147
+ self .assertEqual (site .custom_field_data [cf .name ], choices [0 ])
148
+
149
+ # Delete the stored value
150
+ site .custom_field_data .pop (cf .name )
151
+ site .save ()
152
+ site .refresh_from_db ()
153
+ self .assertIsNone (site .custom_field_data .get (cf .name ))
154
+
155
+ # Delete the custom field
156
+ cf .delete ()
157
+
158
+ def test_multiselect_field (self ):
159
+ obj_type = ContentType .objects .get_for_model (Site )
160
+ choices = ['Option A' , 'Option B' , 'Option C' ]
161
+
162
+ # Create a custom field
163
+ cf = CustomField (
164
+ type = CustomFieldTypeChoices .TYPE_MULTISELECT ,
165
+ name = 'my_field' ,
166
+ required = False ,
167
+ choices = choices
168
+ )
169
+ cf .save ()
170
+ cf .content_types .set ([obj_type ])
171
+
172
+ # Check that the field has a null initial value
173
+ site = Site .objects .first ()
174
+ self .assertIsNone (site .custom_field_data [cf .name ])
175
+
176
+ # Assign a value to the first Site
177
+ site .custom_field_data [cf .name ] = [choices [0 ], choices [1 ]]
178
+ site .save ()
179
+
180
+ # Retrieve the stored value
181
+ site .refresh_from_db ()
182
+ self .assertEqual (site .custom_field_data [cf .name ], [choices [0 ], choices [1 ]])
147
183
148
184
# Delete the stored value
149
185
site .custom_field_data .pop (cf .name )
@@ -597,6 +633,9 @@ def setUpTestData(cls):
597
633
CustomField (name = 'select' , type = CustomFieldTypeChoices .TYPE_SELECT , choices = [
598
634
'Choice A' , 'Choice B' , 'Choice C' ,
599
635
]),
636
+ CustomField (name = 'multiselect' , type = CustomFieldTypeChoices .TYPE_MULTISELECT , choices = [
637
+ 'Choice A' , 'Choice B' , 'Choice C' ,
638
+ ]),
600
639
)
601
640
for cf in custom_fields :
602
641
cf .save ()
@@ -607,19 +646,20 @@ def test_import(self):
607
646
Import a Site in CSV format, including a value for each CustomField.
608
647
"""
609
648
data = (
610
- ('name' , 'slug' , 'status' , 'cf_text' , 'cf_longtext' , 'cf_integer' , 'cf_boolean' , 'cf_date' , 'cf_url' , 'cf_json' , 'cf_select' ),
611
- ('Site 1' , 'site-1' , 'active' , 'ABC' , 'Foo' , '123' , 'True' , '2020-01-01' , 'http://example.com/1' , '{"foo": 123}' , 'Choice A' ),
612
- ('Site 2' , 'site-2' , 'active' , 'DEF' , 'Bar' , '456' , 'False' , '2020-01-02' , 'http://example.com/2' , '{"bar": 456}' , 'Choice B' ),
613
- ('Site 3' , 'site-3' , 'active' , '' , '' , '' , '' , '' , '' , '' , '' ),
649
+ ('name' , 'slug' , 'status' , 'cf_text' , 'cf_longtext' , 'cf_integer' , 'cf_boolean' , 'cf_date' , 'cf_url' , 'cf_json' , 'cf_select' , 'cf_multiselect' ),
650
+ ('Site 1' , 'site-1' , 'active' , 'ABC' , 'Foo' , '123' , 'True' , '2020-01-01' , 'http://example.com/1' , '{"foo": 123}' , 'Choice A' , '"Choice A,Choice B"' ),
651
+ ('Site 2' , 'site-2' , 'active' , 'DEF' , 'Bar' , '456' , 'False' , '2020-01-02' , 'http://example.com/2' , '{"bar": 456}' , 'Choice B' , '"Choice B,Choice C"' ),
652
+ ('Site 3' , 'site-3' , 'active' , '' , '' , '' , '' , '' , '' , '' , '' , '' ),
614
653
)
615
654
csv_data = '\n ' .join (',' .join (row ) for row in data )
616
655
617
656
response = self .client .post (reverse ('dcim:site_import' ), {'csv' : csv_data })
618
657
self .assertEqual (response .status_code , 200 )
658
+ self .assertEqual (Site .objects .count (), 3 )
619
659
620
660
# Validate data for site 1
621
661
site1 = Site .objects .get (name = 'Site 1' )
622
- self .assertEqual (len (site1 .custom_field_data ), 8 )
662
+ self .assertEqual (len (site1 .custom_field_data ), 9 )
623
663
self .assertEqual (site1 .custom_field_data ['text' ], 'ABC' )
624
664
self .assertEqual (site1 .custom_field_data ['longtext' ], 'Foo' )
625
665
self .assertEqual (site1 .custom_field_data ['integer' ], 123 )
@@ -628,10 +668,11 @@ def test_import(self):
628
668
self .assertEqual (site1 .custom_field_data ['url' ], 'http://example.com/1' )
629
669
self .assertEqual (site1 .custom_field_data ['json' ], {"foo" : 123 })
630
670
self .assertEqual (site1 .custom_field_data ['select' ], 'Choice A' )
671
+ self .assertEqual (site1 .custom_field_data ['multiselect' ], ['Choice A' , 'Choice B' ])
631
672
632
673
# Validate data for site 2
633
674
site2 = Site .objects .get (name = 'Site 2' )
634
- self .assertEqual (len (site2 .custom_field_data ), 8 )
675
+ self .assertEqual (len (site2 .custom_field_data ), 9 )
635
676
self .assertEqual (site2 .custom_field_data ['text' ], 'DEF' )
636
677
self .assertEqual (site2 .custom_field_data ['longtext' ], 'Bar' )
637
678
self .assertEqual (site2 .custom_field_data ['integer' ], 456 )
@@ -640,6 +681,7 @@ def test_import(self):
640
681
self .assertEqual (site2 .custom_field_data ['url' ], 'http://example.com/2' )
641
682
self .assertEqual (site2 .custom_field_data ['json' ], {"bar" : 456 })
642
683
self .assertEqual (site2 .custom_field_data ['select' ], 'Choice B' )
684
+ self .assertEqual (site2 .custom_field_data ['multiselect' ], ['Choice B' , 'Choice C' ])
643
685
644
686
# No custom field data should be set for site 3
645
687
site3 = Site .objects .get (name = 'Site 3' )
0 commit comments