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

Merge pull request #3067 from digitalocean/2920-interface-type

Rename Interface.form_factor to Interface.type
Jeremy Stretch 6 лет назад
Родитель
Сommit
b1c160f9d4

+ 6 - 0
CHANGELOG.md

@@ -56,8 +56,14 @@ to now use "Extras | Tag."
 * [#2324](https://github.com/digitalocean/netbox/issues/2324) - Add `color` option for tags
 * [#2643](https://github.com/digitalocean/netbox/issues/2643) - Add `description` field to console/power components and device bays
 * [#2791](https://github.com/digitalocean/netbox/issues/2791) - Add a `comment` field for tags
+* [#2920](https://github.com/digitalocean/netbox/issues/2920) - Rename Interface `form_factor` to `type`
 * [#2926](https://github.com/digitalocean/netbox/issues/2926) - Add changelog to the Tag model
 
+## API Changes
+
+* dcim.Interface: `form_factor` has been renamed to `type`. Backward-compatibile support for `form_factor` will be maintained until NetBox v2.7.
+* dcim.Interface: The `type` filter has been renamed to `kind`.
+
 ## Bug Fixes
 
 * [#2968](https://github.com/digitalocean/netbox/issues/2968) - Correct API documentation for SerializerMethodFields

+ 1 - 1
docs/core-functionality/devices.md

@@ -81,7 +81,7 @@ Power ports connect only to power outlets. Power connections can be marked as ei
 
 Interfaces connect to one another in a symmetric manner: If interface A connects to interface B, interface B therefore connects to interface A. Each type of connection can be classified as either *planned* or *connected*.
 
-Each interface is a assigned a form factor denoting its physical properties. Two special form factors exist: the "virtual" form factor can be used to designate logical interfaces (such as SVIs), and the "LAG" form factor can be used to desinate link aggregation groups to which physical interfaces can be assigned.
+Each interface is a assigned a type denoting its physical properties. Two special types exist: the "virtual" type can be used to designate logical interfaces (such as SVIs), and the "LAG" type can be used to desinate link aggregation groups to which physical interfaces can be assigned.
 
 Each interface can also be enabled or disabled, and optionally designated as management-only (for out-of-band management). Fields are also provided to store an interface's MTU and MAC address.
 

+ 10 - 6
netbox/dcim/api/serializers.py

@@ -231,11 +231,13 @@ class PowerOutletTemplateSerializer(ValidatedModelSerializer):
 
 class InterfaceTemplateSerializer(ValidatedModelSerializer):
     device_type = NestedDeviceTypeSerializer()
-    form_factor = ChoiceField(choices=IFACE_FF_CHOICES, required=False)
+    type = ChoiceField(choices=IFACE_TYPE_CHOICES, required=False)
+    # TODO: Remove in v2.7 (backward-compatibility for form_factor)
+    form_factor = ChoiceField(choices=IFACE_TYPE_CHOICES, required=False)
 
     class Meta:
         model = InterfaceTemplate
-        fields = ['id', 'device_type', 'name', 'form_factor', 'mgmt_only']
+        fields = ['id', 'device_type', 'name', 'type', 'form_factor', 'mgmt_only']
 
 
 class RearPortTemplateSerializer(ValidatedModelSerializer):
@@ -418,7 +420,9 @@ class PowerPortSerializer(TaggitSerializer, ConnectedEndpointSerializer):
 
 class InterfaceSerializer(TaggitSerializer, ConnectedEndpointSerializer):
     device = NestedDeviceSerializer()
-    form_factor = ChoiceField(choices=IFACE_FF_CHOICES, required=False)
+    type = ChoiceField(choices=IFACE_TYPE_CHOICES, required=False)
+    # TODO: Remove in v2.7 (backward-compatibility for form_factor)
+    form_factor = ChoiceField(choices=IFACE_TYPE_CHOICES, required=False)
     lag = NestedInterfaceSerializer(required=False, allow_null=True)
     mode = ChoiceField(choices=IFACE_MODE_CHOICES, required=False, allow_null=True)
     untagged_vlan = NestedVLANSerializer(required=False, allow_null=True)
@@ -434,9 +438,9 @@ class InterfaceSerializer(TaggitSerializer, ConnectedEndpointSerializer):
     class Meta:
         model = Interface
         fields = [
-            'id', 'device', 'name', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', 'mgmt_only', 'description',
-            'connected_endpoint_type', 'connected_endpoint', 'connection_status', 'cable', 'mode', 'untagged_vlan',
-            'tagged_vlans', 'tags', 'count_ipaddresses',
+            'id', 'device', 'name', 'type', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', 'mgmt_only',
+            'description', 'connected_endpoint_type', 'connected_endpoint', 'connection_status', 'cable', 'mode',
+            'untagged_vlan', 'tagged_vlans', 'tags', 'count_ipaddresses',
         ]
 
     # TODO: This validation should be handled by Interface.clean()

+ 2 - 2
netbox/dcim/api/views.py

@@ -42,8 +42,8 @@ class DCIMFieldChoicesViewSet(FieldChoicesViewSet):
         (DeviceType, ['subdevice_role']),
         (FrontPort, ['type']),
         (FrontPortTemplate, ['type']),
-        (Interface, ['form_factor', 'mode']),
-        (InterfaceTemplate, ['form_factor']),
+        (Interface, ['type', 'mode']),
+        (InterfaceTemplate, ['type']),
         (PowerOutlet, ['feed_leg']),
         (PowerOutletTemplate, ['feed_leg']),
         (PowerPort, ['connection_status']),

+ 127 - 127
netbox/dcim/constants.py

@@ -66,200 +66,200 @@ IFACE_ORDERING_CHOICES = [
     [IFACE_ORDERING_NAME, 'Name (alphabetically)']
 ]
 
-# Interface form factors
+# Interface types
 # Virtual
-IFACE_FF_VIRTUAL = 0
-IFACE_FF_LAG = 200
+IFACE_TYPE_VIRTUAL = 0
+IFACE_TYPE_LAG = 200
 # Ethernet
-IFACE_FF_100ME_FIXED = 800
-IFACE_FF_1GE_FIXED = 1000
-IFACE_FF_1GE_GBIC = 1050
-IFACE_FF_1GE_SFP = 1100
-IFACE_FF_10GE_FIXED = 1150
-IFACE_FF_10GE_CX4 = 1170
-IFACE_FF_10GE_SFP_PLUS = 1200
-IFACE_FF_10GE_XFP = 1300
-IFACE_FF_10GE_XENPAK = 1310
-IFACE_FF_10GE_X2 = 1320
-IFACE_FF_25GE_SFP28 = 1350
-IFACE_FF_40GE_QSFP_PLUS = 1400
-IFACE_FF_50GE_QSFP28 = 1420
-IFACE_FF_100GE_CFP = 1500
-IFACE_FF_100GE_CFP2 = 1510
-IFACE_FF_100GE_CFP4 = 1520
-IFACE_FF_100GE_CPAK = 1550
-IFACE_FF_100GE_QSFP28 = 1600
-IFACE_FF_200GE_CFP2 = 1650
-IFACE_FF_200GE_QSFP56 = 1700
-IFACE_FF_400GE_QSFP_DD = 1750
+IFACE_TYPE_100ME_FIXED = 800
+IFACE_TYPE_1GE_FIXED = 1000
+IFACE_TYPE_1GE_GBIC = 1050
+IFACE_TYPE_1GE_SFP = 1100
+IFACE_TYPE_10GE_FIXED = 1150
+IFACE_TYPE_10GE_CX4 = 1170
+IFACE_TYPE_10GE_SFP_PLUS = 1200
+IFACE_TYPE_10GE_XFP = 1300
+IFACE_TYPE_10GE_XENPAK = 1310
+IFACE_TYPE_10GE_X2 = 1320
+IFACE_TYPE_25GE_SFP28 = 1350
+IFACE_TYPE_40GE_QSFP_PLUS = 1400
+IFACE_TYPE_50GE_QSFP28 = 1420
+IFACE_TYPE_100GE_CFP = 1500
+IFACE_TYPE_100GE_CFP2 = 1510
+IFACE_TYPE_100GE_CFP4 = 1520
+IFACE_TYPE_100GE_CPAK = 1550
+IFACE_TYPE_100GE_QSFP28 = 1600
+IFACE_TYPE_200GE_CFP2 = 1650
+IFACE_TYPE_200GE_QSFP56 = 1700
+IFACE_TYPE_400GE_QSFP_DD = 1750
 # Wireless
-IFACE_FF_80211A = 2600
-IFACE_FF_80211G = 2610
-IFACE_FF_80211N = 2620
-IFACE_FF_80211AC = 2630
-IFACE_FF_80211AD = 2640
+IFACE_TYPE_80211A = 2600
+IFACE_TYPE_80211G = 2610
+IFACE_TYPE_80211N = 2620
+IFACE_TYPE_80211AC = 2630
+IFACE_TYPE_80211AD = 2640
 # Cellular
-IFACE_FF_GSM = 2810
-IFACE_FF_CDMA = 2820
-IFACE_FF_LTE = 2830
+IFACE_TYPE_GSM = 2810
+IFACE_TYPE_CDMA = 2820
+IFACE_TYPE_LTE = 2830
 # SONET
-IFACE_FF_SONET_OC3 = 6100
-IFACE_FF_SONET_OC12 = 6200
-IFACE_FF_SONET_OC48 = 6300
-IFACE_FF_SONET_OC192 = 6400
-IFACE_FF_SONET_OC768 = 6500
-IFACE_FF_SONET_OC1920 = 6600
-IFACE_FF_SONET_OC3840 = 6700
+IFACE_TYPE_SONET_OC3 = 6100
+IFACE_TYPE_SONET_OC12 = 6200
+IFACE_TYPE_SONET_OC48 = 6300
+IFACE_TYPE_SONET_OC192 = 6400
+IFACE_TYPE_SONET_OC768 = 6500
+IFACE_TYPE_SONET_OC1920 = 6600
+IFACE_TYPE_SONET_OC3840 = 6700
 # Fibrechannel
-IFACE_FF_1GFC_SFP = 3010
-IFACE_FF_2GFC_SFP = 3020
-IFACE_FF_4GFC_SFP = 3040
-IFACE_FF_8GFC_SFP_PLUS = 3080
-IFACE_FF_16GFC_SFP_PLUS = 3160
-IFACE_FF_32GFC_SFP28 = 3320
-IFACE_FF_128GFC_QSFP28 = 3400
+IFACE_TYPE_1GFC_SFP = 3010
+IFACE_TYPE_2GFC_SFP = 3020
+IFACE_TYPE_4GFC_SFP = 3040
+IFACE_TYPE_8GFC_SFP_PLUS = 3080
+IFACE_TYPE_16GFC_SFP_PLUS = 3160
+IFACE_TYPE_32GFC_SFP28 = 3320
+IFACE_TYPE_128GFC_QSFP28 = 3400
 # Serial
-IFACE_FF_T1 = 4000
-IFACE_FF_E1 = 4010
-IFACE_FF_T3 = 4040
-IFACE_FF_E3 = 4050
+IFACE_TYPE_T1 = 4000
+IFACE_TYPE_E1 = 4010
+IFACE_TYPE_T3 = 4040
+IFACE_TYPE_E3 = 4050
 # Stacking
-IFACE_FF_STACKWISE = 5000
-IFACE_FF_STACKWISE_PLUS = 5050
-IFACE_FF_FLEXSTACK = 5100
-IFACE_FF_FLEXSTACK_PLUS = 5150
-IFACE_FF_JUNIPER_VCP = 5200
-IFACE_FF_SUMMITSTACK = 5300
-IFACE_FF_SUMMITSTACK128 = 5310
-IFACE_FF_SUMMITSTACK256 = 5320
-IFACE_FF_SUMMITSTACK512 = 5330
+IFACE_TYPE_STACKWISE = 5000
+IFACE_TYPE_STACKWISE_PLUS = 5050
+IFACE_TYPE_FLEXSTACK = 5100
+IFACE_TYPE_FLEXSTACK_PLUS = 5150
+IFACE_TYPE_JUNIPER_VCP = 5200
+IFACE_TYPE_SUMMITSTACK = 5300
+IFACE_TYPE_SUMMITSTACK128 = 5310
+IFACE_TYPE_SUMMITSTACK256 = 5320
+IFACE_TYPE_SUMMITSTACK512 = 5330
 
 # Other
-IFACE_FF_OTHER = 32767
+IFACE_TYPE_OTHER = 32767
 
-IFACE_FF_CHOICES = [
+IFACE_TYPE_CHOICES = [
     [
         'Virtual interfaces',
         [
-            [IFACE_FF_VIRTUAL, 'Virtual'],
-            [IFACE_FF_LAG, 'Link Aggregation Group (LAG)'],
+            [IFACE_TYPE_VIRTUAL, 'Virtual'],
+            [IFACE_TYPE_LAG, 'Link Aggregation Group (LAG)'],
         ],
     ],
     [
         'Ethernet (fixed)',
         [
-            [IFACE_FF_100ME_FIXED, '100BASE-TX (10/100ME)'],
-            [IFACE_FF_1GE_FIXED, '1000BASE-T (1GE)'],
-            [IFACE_FF_10GE_FIXED, '10GBASE-T (10GE)'],
-            [IFACE_FF_10GE_CX4, '10GBASE-CX4 (10GE)'],
+            [IFACE_TYPE_100ME_FIXED, '100BASE-TX (10/100ME)'],
+            [IFACE_TYPE_1GE_FIXED, '1000BASE-T (1GE)'],
+            [IFACE_TYPE_10GE_FIXED, '10GBASE-T (10GE)'],
+            [IFACE_TYPE_10GE_CX4, '10GBASE-CX4 (10GE)'],
         ]
     ],
     [
         'Ethernet (modular)',
         [
-            [IFACE_FF_1GE_GBIC, 'GBIC (1GE)'],
-            [IFACE_FF_1GE_SFP, 'SFP (1GE)'],
-            [IFACE_FF_10GE_SFP_PLUS, 'SFP+ (10GE)'],
-            [IFACE_FF_10GE_XFP, 'XFP (10GE)'],
-            [IFACE_FF_10GE_XENPAK, 'XENPAK (10GE)'],
-            [IFACE_FF_10GE_X2, 'X2 (10GE)'],
-            [IFACE_FF_25GE_SFP28, 'SFP28 (25GE)'],
-            [IFACE_FF_40GE_QSFP_PLUS, 'QSFP+ (40GE)'],
-            [IFACE_FF_50GE_QSFP28, 'QSFP28 (50GE)'],
-            [IFACE_FF_100GE_CFP, 'CFP (100GE)'],
-            [IFACE_FF_100GE_CFP2, 'CFP2 (100GE)'],
-            [IFACE_FF_200GE_CFP2, 'CFP2 (200GE)'],
-            [IFACE_FF_100GE_CFP4, 'CFP4 (100GE)'],
-            [IFACE_FF_100GE_CPAK, 'Cisco CPAK (100GE)'],
-            [IFACE_FF_100GE_QSFP28, 'QSFP28 (100GE)'],
-            [IFACE_FF_200GE_QSFP56, 'QSFP56 (200GE)'],
-            [IFACE_FF_400GE_QSFP_DD, 'QSFP-DD (400GE)'],
+            [IFACE_TYPE_1GE_GBIC, 'GBIC (1GE)'],
+            [IFACE_TYPE_1GE_SFP, 'SFP (1GE)'],
+            [IFACE_TYPE_10GE_SFP_PLUS, 'SFP+ (10GE)'],
+            [IFACE_TYPE_10GE_XFP, 'XFP (10GE)'],
+            [IFACE_TYPE_10GE_XENPAK, 'XENPAK (10GE)'],
+            [IFACE_TYPE_10GE_X2, 'X2 (10GE)'],
+            [IFACE_TYPE_25GE_SFP28, 'SFP28 (25GE)'],
+            [IFACE_TYPE_40GE_QSFP_PLUS, 'QSFP+ (40GE)'],
+            [IFACE_TYPE_50GE_QSFP28, 'QSFP28 (50GE)'],
+            [IFACE_TYPE_100GE_CFP, 'CFP (100GE)'],
+            [IFACE_TYPE_100GE_CFP2, 'CFP2 (100GE)'],
+            [IFACE_TYPE_200GE_CFP2, 'CFP2 (200GE)'],
+            [IFACE_TYPE_100GE_CFP4, 'CFP4 (100GE)'],
+            [IFACE_TYPE_100GE_CPAK, 'Cisco CPAK (100GE)'],
+            [IFACE_TYPE_100GE_QSFP28, 'QSFP28 (100GE)'],
+            [IFACE_TYPE_200GE_QSFP56, 'QSFP56 (200GE)'],
+            [IFACE_TYPE_400GE_QSFP_DD, 'QSFP-DD (400GE)'],
         ]
     ],
     [
         'Wireless',
         [
-            [IFACE_FF_80211A, 'IEEE 802.11a'],
-            [IFACE_FF_80211G, 'IEEE 802.11b/g'],
-            [IFACE_FF_80211N, 'IEEE 802.11n'],
-            [IFACE_FF_80211AC, 'IEEE 802.11ac'],
-            [IFACE_FF_80211AD, 'IEEE 802.11ad'],
+            [IFACE_TYPE_80211A, 'IEEE 802.11a'],
+            [IFACE_TYPE_80211G, 'IEEE 802.11b/g'],
+            [IFACE_TYPE_80211N, 'IEEE 802.11n'],
+            [IFACE_TYPE_80211AC, 'IEEE 802.11ac'],
+            [IFACE_TYPE_80211AD, 'IEEE 802.11ad'],
         ]
     ],
     [
         'Cellular',
         [
-            [IFACE_FF_GSM, 'GSM'],
-            [IFACE_FF_CDMA, 'CDMA'],
-            [IFACE_FF_LTE, 'LTE'],
+            [IFACE_TYPE_GSM, 'GSM'],
+            [IFACE_TYPE_CDMA, 'CDMA'],
+            [IFACE_TYPE_LTE, 'LTE'],
         ]
     ],
     [
         'SONET',
         [
-            [IFACE_FF_SONET_OC3, 'OC-3/STM-1'],
-            [IFACE_FF_SONET_OC12, 'OC-12/STM-4'],
-            [IFACE_FF_SONET_OC48, 'OC-48/STM-16'],
-            [IFACE_FF_SONET_OC192, 'OC-192/STM-64'],
-            [IFACE_FF_SONET_OC768, 'OC-768/STM-256'],
-            [IFACE_FF_SONET_OC1920, 'OC-1920/STM-640'],
-            [IFACE_FF_SONET_OC3840, 'OC-3840/STM-1234'],
+            [IFACE_TYPE_SONET_OC3, 'OC-3/STM-1'],
+            [IFACE_TYPE_SONET_OC12, 'OC-12/STM-4'],
+            [IFACE_TYPE_SONET_OC48, 'OC-48/STM-16'],
+            [IFACE_TYPE_SONET_OC192, 'OC-192/STM-64'],
+            [IFACE_TYPE_SONET_OC768, 'OC-768/STM-256'],
+            [IFACE_TYPE_SONET_OC1920, 'OC-1920/STM-640'],
+            [IFACE_TYPE_SONET_OC3840, 'OC-3840/STM-1234'],
         ]
     ],
     [
         'FibreChannel',
         [
-            [IFACE_FF_1GFC_SFP, 'SFP (1GFC)'],
-            [IFACE_FF_2GFC_SFP, 'SFP (2GFC)'],
-            [IFACE_FF_4GFC_SFP, 'SFP (4GFC)'],
-            [IFACE_FF_8GFC_SFP_PLUS, 'SFP+ (8GFC)'],
-            [IFACE_FF_16GFC_SFP_PLUS, 'SFP+ (16GFC)'],
-            [IFACE_FF_32GFC_SFP28, 'SFP28 (32GFC)'],
-            [IFACE_FF_128GFC_QSFP28, 'QSFP28 (128GFC)'],
+            [IFACE_TYPE_1GFC_SFP, 'SFP (1GFC)'],
+            [IFACE_TYPE_2GFC_SFP, 'SFP (2GFC)'],
+            [IFACE_TYPE_4GFC_SFP, 'SFP (4GFC)'],
+            [IFACE_TYPE_8GFC_SFP_PLUS, 'SFP+ (8GFC)'],
+            [IFACE_TYPE_16GFC_SFP_PLUS, 'SFP+ (16GFC)'],
+            [IFACE_TYPE_32GFC_SFP28, 'SFP28 (32GFC)'],
+            [IFACE_TYPE_128GFC_QSFP28, 'QSFP28 (128GFC)'],
         ]
     ],
     [
         'Serial',
         [
-            [IFACE_FF_T1, 'T1 (1.544 Mbps)'],
-            [IFACE_FF_E1, 'E1 (2.048 Mbps)'],
-            [IFACE_FF_T3, 'T3 (45 Mbps)'],
-            [IFACE_FF_E3, 'E3 (34 Mbps)'],
+            [IFACE_TYPE_T1, 'T1 (1.544 Mbps)'],
+            [IFACE_TYPE_E1, 'E1 (2.048 Mbps)'],
+            [IFACE_TYPE_T3, 'T3 (45 Mbps)'],
+            [IFACE_TYPE_E3, 'E3 (34 Mbps)'],
         ]
     ],
     [
         'Stacking',
         [
-            [IFACE_FF_STACKWISE, 'Cisco StackWise'],
-            [IFACE_FF_STACKWISE_PLUS, 'Cisco StackWise Plus'],
-            [IFACE_FF_FLEXSTACK, 'Cisco FlexStack'],
-            [IFACE_FF_FLEXSTACK_PLUS, 'Cisco FlexStack Plus'],
-            [IFACE_FF_JUNIPER_VCP, 'Juniper VCP'],
-            [IFACE_FF_SUMMITSTACK, 'Extreme SummitStack'],
-            [IFACE_FF_SUMMITSTACK128, 'Extreme SummitStack-128'],
-            [IFACE_FF_SUMMITSTACK256, 'Extreme SummitStack-256'],
-            [IFACE_FF_SUMMITSTACK512, 'Extreme SummitStack-512'],
+            [IFACE_TYPE_STACKWISE, 'Cisco StackWise'],
+            [IFACE_TYPE_STACKWISE_PLUS, 'Cisco StackWise Plus'],
+            [IFACE_TYPE_FLEXSTACK, 'Cisco FlexStack'],
+            [IFACE_TYPE_FLEXSTACK_PLUS, 'Cisco FlexStack Plus'],
+            [IFACE_TYPE_JUNIPER_VCP, 'Juniper VCP'],
+            [IFACE_TYPE_SUMMITSTACK, 'Extreme SummitStack'],
+            [IFACE_TYPE_SUMMITSTACK128, 'Extreme SummitStack-128'],
+            [IFACE_TYPE_SUMMITSTACK256, 'Extreme SummitStack-256'],
+            [IFACE_TYPE_SUMMITSTACK512, 'Extreme SummitStack-512'],
         ]
     ],
     [
         'Other',
         [
-            [IFACE_FF_OTHER, 'Other'],
+            [IFACE_TYPE_OTHER, 'Other'],
         ]
     ],
 ]
 
 VIRTUAL_IFACE_TYPES = [
-    IFACE_FF_VIRTUAL,
-    IFACE_FF_LAG,
+    IFACE_TYPE_VIRTUAL,
+    IFACE_TYPE_LAG,
 ]
 
 WIRELESS_IFACE_TYPES = [
-    IFACE_FF_80211A,
-    IFACE_FF_80211G,
-    IFACE_FF_80211N,
-    IFACE_FF_80211AC,
-    IFACE_FF_80211AD,
+    IFACE_TYPE_80211A,
+    IFACE_TYPE_80211G,
+    IFACE_TYPE_80211N,
+    IFACE_TYPE_80211AC,
+    IFACE_TYPE_80211AD,
 ]
 
 NONCONNECTABLE_IFACE_TYPES = VIRTUAL_IFACE_TYPES + WIRELESS_IFACE_TYPES

+ 11 - 12
netbox/dcim/filters.py

@@ -400,7 +400,7 @@ class InterfaceTemplateFilter(DeviceTypeComponentFilterSet):
 
     class Meta:
         model = InterfaceTemplate
-        fields = ['name', 'form_factor', 'mgmt_only']
+        fields = ['name', 'type', 'mgmt_only']
 
 
 class FrontPortTemplateFilter(DeviceTypeComponentFilterSet):
@@ -753,9 +753,9 @@ class InterfaceFilter(django_filters.FilterSet):
         lookup_expr='isnull',
         exclude=True
     )
-    type = django_filters.CharFilter(
-        method='filter_type',
-        label='Interface type',
+    kind = django_filters.CharFilter(
+        method='filter_kind',
+        label='Kind of interface',
     )
     lag_id = django_filters.ModelMultipleChoiceFilter(
         field_name='lag',
@@ -775,14 +775,14 @@ class InterfaceFilter(django_filters.FilterSet):
         method='filter_vlan',
         label='Assigned VID'
     )
-    form_factor = django_filters.MultipleChoiceFilter(
-        choices=IFACE_FF_CHOICES,
+    type = django_filters.MultipleChoiceFilter(
+        choices=IFACE_TYPE_CHOICES,
         null_value=None
     )
 
     class Meta:
         model = Interface
-        fields = ['name', 'connection_status', 'form_factor', 'enabled', 'mtu', 'mgmt_only', 'description']
+        fields = ['name', 'connection_status', 'type', 'enabled', 'mtu', 'mgmt_only', 'description']
 
     def search(self, queryset, name, value):
         if not value.strip():
@@ -818,13 +818,12 @@ class InterfaceFilter(django_filters.FilterSet):
             Q(tagged_vlans__vid=value)
         )
 
-    def filter_type(self, queryset, name, value):
+    def filter_kind(self, queryset, name, value):
         value = value.strip().lower()
         return {
-            'physical': queryset.exclude(form_factor__in=NONCONNECTABLE_IFACE_TYPES),
-            'virtual': queryset.filter(form_factor__in=VIRTUAL_IFACE_TYPES),
-            'wireless': queryset.filter(form_factor__in=WIRELESS_IFACE_TYPES),
-            'lag': queryset.filter(form_factor=IFACE_FF_LAG),
+            'physical': queryset.exclude(type__in=NONCONNECTABLE_IFACE_TYPES),
+            'virtual': queryset.filter(type__in=VIRTUAL_IFACE_TYPES),
+            'wireless': queryset.filter(type__in=WIRELESS_IFACE_TYPES),
         }.get(value, queryset.none())
 
     def _mac_address(self, queryset, name, value):

Разница между файлами не показана из-за своего большого размера
+ 112 - 112
netbox/dcim/fixtures/dcim.json


+ 18 - 18
netbox/dcim/forms.py

@@ -1012,11 +1012,11 @@ class InterfaceTemplateForm(BootstrapMixin, forms.ModelForm):
     class Meta:
         model = InterfaceTemplate
         fields = [
-            'device_type', 'name', 'form_factor', 'mgmt_only',
+            'device_type', 'name', 'type', 'mgmt_only',
         ]
         widgets = {
             'device_type': forms.HiddenInput(),
-            'form_factor': StaticSelect2(),
+            'type': StaticSelect2(),
         }
 
 
@@ -1024,8 +1024,8 @@ class InterfaceTemplateCreateForm(ComponentForm):
     name_pattern = ExpandableNameField(
         label='Name'
     )
-    form_factor = forms.ChoiceField(
-        choices=IFACE_FF_CHOICES,
+    type = forms.ChoiceField(
+        choices=IFACE_TYPE_CHOICES,
         widget=StaticSelect2()
     )
     mgmt_only = forms.BooleanField(
@@ -1039,8 +1039,8 @@ class InterfaceTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
         queryset=InterfaceTemplate.objects.all(),
         widget=forms.MultipleHiddenInput()
     )
-    form_factor = forms.ChoiceField(
-        choices=add_blank_choice(IFACE_FF_CHOICES),
+    type = forms.ChoiceField(
+        choices=add_blank_choice(IFACE_TYPE_CHOICES),
         required=False,
         widget=StaticSelect2()
     )
@@ -1830,8 +1830,8 @@ class DeviceBulkAddComponentForm(BootstrapMixin, forms.Form):
 
 
 class DeviceBulkAddInterfaceForm(DeviceBulkAddComponentForm):
-    form_factor = forms.ChoiceField(
-        choices=IFACE_FF_CHOICES,
+    type = forms.ChoiceField(
+        choices=IFACE_TYPE_CHOICES,
         widget=StaticSelect2()
     )
     enabled = forms.BooleanField(
@@ -2070,12 +2070,12 @@ class InterfaceForm(BootstrapMixin, forms.ModelForm):
     class Meta:
         model = Interface
         fields = [
-            'device', 'name', 'form_factor', 'enabled', 'lag', 'mac_address', 'mtu', 'mgmt_only', 'description',
+            'device', 'name', 'type', 'enabled', 'lag', 'mac_address', 'mtu', 'mgmt_only', 'description',
             'mode', 'untagged_vlan', 'tagged_vlans', 'tags',
         ]
         widgets = {
             'device': forms.HiddenInput(),
-            'form_factor': StaticSelect2(),
+            'type': StaticSelect2(),
             'lag': StaticSelect2(),
             'mode': StaticSelect2(),
         }
@@ -2093,12 +2093,12 @@ class InterfaceForm(BootstrapMixin, forms.ModelForm):
         if self.is_bound:
             device = Device.objects.get(pk=self.data['device'])
             self.fields['lag'].queryset = Interface.objects.filter(
-                device__in=[device, device.get_vc_master()], form_factor=IFACE_FF_LAG
+                device__in=[device, device.get_vc_master()], type=IFACE_TYPE_LAG
             )
         else:
             device = self.instance.device
             self.fields['lag'].queryset = Interface.objects.filter(
-                device__in=[self.instance.device, self.instance.device.get_vc_master()], form_factor=IFACE_FF_LAG
+                device__in=[self.instance.device, self.instance.device.get_vc_master()], type=IFACE_TYPE_LAG
             )
 
     def clean(self):
@@ -2210,8 +2210,8 @@ class InterfaceCreateForm(ComponentForm, forms.Form):
     name_pattern = ExpandableNameField(
         label='Name'
     )
-    form_factor = forms.ChoiceField(
-        choices=IFACE_FF_CHOICES,
+    type = forms.ChoiceField(
+        choices=IFACE_TYPE_CHOICES,
         widget=StaticSelect2(),
     )
     enabled = forms.BooleanField(
@@ -2262,7 +2262,7 @@ class InterfaceCreateForm(ComponentForm, forms.Form):
         # Limit LAG choices to interfaces belonging to this device (or its VC master)
         if self.parent is not None:
             self.fields['lag'].queryset = Interface.objects.filter(
-                device__in=[self.parent, self.parent.get_vc_master()], form_factor=IFACE_FF_LAG
+                device__in=[self.parent, self.parent.get_vc_master()], type=IFACE_TYPE_LAG
             )
         else:
             self.fields['lag'].queryset = Interface.objects.none()
@@ -2273,8 +2273,8 @@ class InterfaceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
         queryset=Interface.objects.all(),
         widget=forms.MultipleHiddenInput()
     )
-    form_factor = forms.ChoiceField(
-        choices=add_blank_choice(IFACE_FF_CHOICES),
+    type = forms.ChoiceField(
+        choices=add_blank_choice(IFACE_TYPE_CHOICES),
         required=False,
         widget=StaticSelect2()
     )
@@ -2326,7 +2326,7 @@ class InterfaceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, BulkEditForm):
         if device is not None:
             self.fields['lag'].queryset = Interface.objects.filter(
                 device__in=[device, device.get_vc_master()],
-                form_factor=IFACE_FF_LAG
+                type=IFACE_TYPE_LAG
             )
         else:
             self.fields['lag'].choices = []

+ 1 - 1
netbox/dcim/managers.py

@@ -37,7 +37,7 @@ class InterfaceQuerySet(QuerySet):
         Return only physical interfaces which are capable of being connected to other interfaces (i.e. not virtual or
         wireless).
         """
-        return self.exclude(form_factor__in=NONCONNECTABLE_IFACE_TYPES)
+        return self.exclude(type__in=NONCONNECTABLE_IFACE_TYPES)
 
 
 class InterfaceManager(Manager):

+ 23 - 0
netbox/dcim/migrations/0073_interface_form_factor_to_type.py

@@ -0,0 +1,23 @@
+# Generated by Django 2.1.7 on 2019-04-12 17:27
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dcim', '0072_powerfeeds'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='interface',
+            old_name='form_factor',
+            new_name='type',
+        ),
+        migrations.RenameField(
+            model_name='interfacetemplate',
+            old_name='form_factor',
+            new_name='type',
+        ),
+    ]

+ 56 - 24
netbox/dcim/models.py

@@ -1132,9 +1132,9 @@ class InterfaceTemplate(ComponentTemplateModel):
     name = models.CharField(
         max_length=64
     )
-    form_factor = models.PositiveSmallIntegerField(
-        choices=IFACE_FF_CHOICES,
-        default=IFACE_FF_10GE_SFP_PLUS
+    type = models.PositiveSmallIntegerField(
+        choices=IFACE_TYPE_CHOICES,
+        default=IFACE_TYPE_10GE_SFP_PLUS
     )
     mgmt_only = models.BooleanField(
         default=False,
@@ -1150,6 +1150,22 @@ class InterfaceTemplate(ComponentTemplateModel):
     def __str__(self):
         return self.name
 
+    # TODO: Remove in v2.7
+    @property
+    def form_factor(self):
+        """
+        Backward-compatibility for form_factor
+        """
+        return self.type
+
+    # TODO: Remove in v2.7
+    @form_factor.setter
+    def form_factor(self, value):
+        """
+        Backward-compatibility for form_factor
+        """
+        self.type = value
+
 
 class FrontPortTemplate(ComponentTemplateModel):
     """
@@ -1647,7 +1663,7 @@ class Device(ChangeLoggedModel, ConfigContextModel, CustomFieldModel):
                  self.device_type.poweroutlet_templates.all()]
             )
             Interface.objects.bulk_create(
-                [Interface(device=self, name=template.name, form_factor=template.form_factor,
+                [Interface(device=self, name=template.name, type=template.type,
                            mgmt_only=template.mgmt_only) for template in self.device_type.interface_templates.all()]
             )
             RearPort.objects.bulk_create([
@@ -2092,9 +2108,9 @@ class Interface(CableTermination, ComponentModel):
         blank=True,
         verbose_name='Parent LAG'
     )
-    form_factor = models.PositiveSmallIntegerField(
-        choices=IFACE_FF_CHOICES,
-        default=IFACE_FF_10GE_SFP_PLUS
+    type = models.PositiveSmallIntegerField(
+        choices=IFACE_TYPE_CHOICES,
+        default=IFACE_TYPE_10GE_SFP_PLUS
     )
     enabled = models.BooleanField(
         default=True
@@ -2139,7 +2155,7 @@ class Interface(CableTermination, ComponentModel):
     tags = TaggableManager(through=TaggedItem)
 
     csv_headers = [
-        'device', 'virtual_machine', 'name', 'lag', 'form_factor', 'enabled', 'mac_address', 'mtu', 'mgmt_only',
+        'device', 'virtual_machine', 'name', 'lag', 'type', 'enabled', 'mac_address', 'mtu', 'mgmt_only',
         'description', 'mode',
     ]
 
@@ -2159,7 +2175,7 @@ class Interface(CableTermination, ComponentModel):
             self.virtual_machine.name if self.virtual_machine else None,
             self.name,
             self.lag.name if self.lag else None,
-            self.get_form_factor_display(),
+            self.get_type_display(),
             self.enabled,
             self.mac_address,
             self.mtu,
@@ -2177,18 +2193,18 @@ class Interface(CableTermination, ComponentModel):
             raise ValidationError("An interface must belong to either a device or a virtual machine.")
 
         # VM interfaces must be virtual
-        if self.virtual_machine and self.form_factor is not IFACE_FF_VIRTUAL:
+        if self.virtual_machine and self.type is not IFACE_TYPE_VIRTUAL:
             raise ValidationError({
-                'form_factor': "Virtual machines can only have virtual interfaces."
+                'type': "Virtual machines can only have virtual interfaces."
             })
 
         # Virtual interfaces cannot be connected
-        if self.form_factor in NONCONNECTABLE_IFACE_TYPES and (
+        if self.type in NONCONNECTABLE_IFACE_TYPES and (
                 self.cable or getattr(self, 'circuit_termination', False)
         ):
             raise ValidationError({
-                'form_factor': "Virtual and wireless interfaces cannot be connected to another interface or circuit. "
-                               "Disconnect the interface or choose a suitable form factor."
+                'type': "Virtual and wireless interfaces cannot be connected to another interface or circuit. "
+                        "Disconnect the interface or choose a suitable type."
             })
 
         # An interface's LAG must belong to the same device (or VC master)
@@ -2200,15 +2216,15 @@ class Interface(CableTermination, ComponentModel):
             })
 
         # A virtual interface cannot have a parent LAG
-        if self.form_factor in NONCONNECTABLE_IFACE_TYPES and self.lag is not None:
+        if self.type in NONCONNECTABLE_IFACE_TYPES and self.lag is not None:
             raise ValidationError({
-                'lag': "{} interfaces cannot have a parent LAG interface.".format(self.get_form_factor_display())
+                'lag': "{} interfaces cannot have a parent LAG interface.".format(self.get_type_display())
             })
 
         # Only a LAG can have LAG members
-        if self.form_factor != IFACE_FF_LAG and self.member_interfaces.exists():
+        if self.type != IFACE_TYPE_LAG and self.member_interfaces.exists():
             raise ValidationError({
-                'form_factor': "Cannot change interface form factor; it has LAG members ({}).".format(
+                'type': "Cannot change interface type; it has LAG members ({}).".format(
                     ", ".join([iface.name for iface in self.member_interfaces.all()])
                 )
             })
@@ -2254,6 +2270,22 @@ class Interface(CableTermination, ComponentModel):
             object_data=serialize_object(self)
         ).save()
 
+    # TODO: Remove in v2.7
+    @property
+    def form_factor(self):
+        """
+        Backward-compatibility for form_factor
+        """
+        return self.type
+
+    # TODO: Remove in v2.7
+    @form_factor.setter
+    def form_factor(self, value):
+        """
+        Backward-compatibility for form_factor
+        """
+        self.type = value
+
     @property
     def connected_endpoint(self):
         if self._connected_interface:
@@ -2284,19 +2316,19 @@ class Interface(CableTermination, ComponentModel):
 
     @property
     def is_connectable(self):
-        return self.form_factor not in NONCONNECTABLE_IFACE_TYPES
+        return self.type not in NONCONNECTABLE_IFACE_TYPES
 
     @property
     def is_virtual(self):
-        return self.form_factor in VIRTUAL_IFACE_TYPES
+        return self.type in VIRTUAL_IFACE_TYPES
 
     @property
     def is_wireless(self):
-        return self.form_factor in WIRELESS_IFACE_TYPES
+        return self.type in WIRELESS_IFACE_TYPES
 
     @property
     def is_lag(self):
-        return self.form_factor == IFACE_FF_LAG
+        return self.type == IFACE_TYPE_LAG
 
     @property
     def count_ipaddresses(self):
@@ -2740,11 +2772,11 @@ class Cable(ChangeLoggedModel):
             if (
                 (
                     isinstance(endpoint_a, Interface) and
-                    endpoint_a.form_factor == IFACE_FF_VIRTUAL
+                    endpoint_a.type == IFACE_TYPE_VIRTUAL
                 ) or
                 (
                     isinstance(endpoint_b, Interface) and
-                    endpoint_b.form_factor == IFACE_FF_VIRTUAL
+                    endpoint_b.type == IFACE_TYPE_VIRTUAL
                 )
             ):
                 raise ValidationError("Cannot connect to a virtual interface")

+ 2 - 2
netbox/dcim/tables.py

@@ -415,7 +415,7 @@ class InterfaceTemplateTable(BaseTable):
 
     class Meta(BaseTable.Meta):
         model = InterfaceTemplate
-        fields = ('pk', 'name', 'mgmt_only', 'form_factor')
+        fields = ('pk', 'name', 'mgmt_only', 'type')
         empty_text = "None"
 
 
@@ -593,7 +593,7 @@ class InterfaceTable(BaseTable):
 
     class Meta(BaseTable.Meta):
         model = Interface
-        fields = ('name', 'form_factor', 'lag', 'enabled', 'mgmt_only', 'description')
+        fields = ('name', 'type', 'lag', 'enabled', 'mgmt_only', 'description')
 
 
 class FrontPortTable(BaseTable):

+ 11 - 11
netbox/dcim/tests/test_api.py

@@ -2553,7 +2553,7 @@ class InterfaceTest(APITestCase):
     def test_update_interface(self):
 
         lag_interface = Interface.objects.create(
-            device=self.device, name='Test LAG Interface', form_factor=IFACE_FF_LAG
+            device=self.device, name='Test LAG Interface', type=IFACE_TYPE_LAG
         )
 
         data = {
@@ -2841,7 +2841,7 @@ class CableTest(APITestCase):
         )
         for device in [self.device1, self.device2]:
             for i in range(0, 10):
-                Interface(device=device, form_factor=IFACE_FF_1GE_FIXED, name='eth{}'.format(i)).save()
+                Interface(device=device, type=IFACE_TYPE_1GE_FIXED, name='eth{}'.format(i)).save()
 
         self.cable1 = Cable(
             termination_a=self.device1.interfaces.get(name='eth0'),
@@ -3410,23 +3410,23 @@ class VirtualChassisTest(APITestCase):
             device_type=device_type, device_role=device_role, name='StackSwitch9', site=site
         )
         for i in range(0, 13):
-            Interface.objects.create(device=self.device1, name='1/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
+            Interface.objects.create(device=self.device1, name='1/{}'.format(i), type=IFACE_TYPE_1GE_FIXED)
         for i in range(0, 13):
-            Interface.objects.create(device=self.device2, name='2/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
+            Interface.objects.create(device=self.device2, name='2/{}'.format(i), type=IFACE_TYPE_1GE_FIXED)
         for i in range(0, 13):
-            Interface.objects.create(device=self.device3, name='3/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
+            Interface.objects.create(device=self.device3, name='3/{}'.format(i), type=IFACE_TYPE_1GE_FIXED)
         for i in range(0, 13):
-            Interface.objects.create(device=self.device4, name='1/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
+            Interface.objects.create(device=self.device4, name='1/{}'.format(i), type=IFACE_TYPE_1GE_FIXED)
         for i in range(0, 13):
-            Interface.objects.create(device=self.device5, name='2/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
+            Interface.objects.create(device=self.device5, name='2/{}'.format(i), type=IFACE_TYPE_1GE_FIXED)
         for i in range(0, 13):
-            Interface.objects.create(device=self.device6, name='3/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
+            Interface.objects.create(device=self.device6, name='3/{}'.format(i), type=IFACE_TYPE_1GE_FIXED)
         for i in range(0, 13):
-            Interface.objects.create(device=self.device7, name='1/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
+            Interface.objects.create(device=self.device7, name='1/{}'.format(i), type=IFACE_TYPE_1GE_FIXED)
         for i in range(0, 13):
-            Interface.objects.create(device=self.device8, name='2/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
+            Interface.objects.create(device=self.device8, name='2/{}'.format(i), type=IFACE_TYPE_1GE_FIXED)
         for i in range(0, 13):
-            Interface.objects.create(device=self.device9, name='3/{}'.format(i), form_factor=IFACE_FF_1GE_FIXED)
+            Interface.objects.create(device=self.device9, name='3/{}'.format(i), type=IFACE_TYPE_1GE_FIXED)
 
         # Create two VirtualChassis with three members each
         self.vc1 = VirtualChassis.objects.create(master=self.device1, domain='test-domain-1')

+ 1 - 1
netbox/dcim/tests/test_models.py

@@ -249,7 +249,7 @@ class CableTestCase(TestCase):
         """
         A cable connection cannot include a virtual interface
         """
-        virtual_interface = Interface(device=self.device1, name="V1", form_factor=0)
+        virtual_interface = Interface(device=self.device1, name="V1", type=0)
         cable = Cable(termination_a=self.interface2, termination_b=virtual_interface)
         with self.assertRaises(ValidationError):
             cable.clean()

+ 7 - 7
netbox/dcim/tests/test_views.py

@@ -3,7 +3,7 @@ import urllib.parse
 from django.test import Client, TestCase
 from django.urls import reverse
 
-from dcim.constants import CABLE_TYPE_CAT6, IFACE_FF_1GE_FIXED
+from dcim.constants import CABLE_TYPE_CAT6, IFACE_TYPE_1GE_FIXED
 from dcim.models import (
     Cable, Device, DeviceRole, DeviceType, Interface, InventoryItem, Manufacturer, Platform, Rack, RackGroup,
     RackReservation, RackRole, Site, Region, VirtualChassis,
@@ -370,17 +370,17 @@ class CableTestCase(TestCase):
         device2 = Device(name='Device 2', site=site, device_type=devicetype, device_role=devicerole)
         device2.save()
 
-        iface1 = Interface(device=device1, name='Interface 1', form_factor=IFACE_FF_1GE_FIXED)
+        iface1 = Interface(device=device1, name='Interface 1', type=IFACE_TYPE_1GE_FIXED)
         iface1.save()
-        iface2 = Interface(device=device1, name='Interface 2', form_factor=IFACE_FF_1GE_FIXED)
+        iface2 = Interface(device=device1, name='Interface 2', type=IFACE_TYPE_1GE_FIXED)
         iface2.save()
-        iface3 = Interface(device=device1, name='Interface 3', form_factor=IFACE_FF_1GE_FIXED)
+        iface3 = Interface(device=device1, name='Interface 3', type=IFACE_TYPE_1GE_FIXED)
         iface3.save()
-        iface4 = Interface(device=device2, name='Interface 1', form_factor=IFACE_FF_1GE_FIXED)
+        iface4 = Interface(device=device2, name='Interface 1', type=IFACE_TYPE_1GE_FIXED)
         iface4.save()
-        iface5 = Interface(device=device2, name='Interface 2', form_factor=IFACE_FF_1GE_FIXED)
+        iface5 = Interface(device=device2, name='Interface 2', type=IFACE_TYPE_1GE_FIXED)
         iface5.save()
-        iface6 = Interface(device=device2, name='Interface 3', form_factor=IFACE_FF_1GE_FIXED)
+        iface6 = Interface(device=device2, name='Interface 3', type=IFACE_TYPE_1GE_FIXED)
         iface6.save()
 
         Cable(termination_a=iface1, termination_b=iface4, type=CABLE_TYPE_CAT6).save()

+ 1 - 1
netbox/templates/dcim/device_lldp_neighbors.html

@@ -27,7 +27,7 @@
                                 <a href="{% url 'dcim:device' pk=iface.connected_endpoint.device.pk %}">{{ iface.connected_endpoint.device }}</a>
                             </td>
                             <td class="configured_interface" data="{{ iface.connected_endpoint }}">
-                                <span title="{{ iface.connected_endpoint.get_form_factor_display }}">{{ iface.connected_endpoint }}</span>
+                                <span title="{{ iface.connected_endpoint.get_type_display }}">{{ iface.connected_endpoint }}</span>
                             </td>
                         {% elif iface.connected_endpoint.circuit %}
                             {% with circuit=iface.connected_endpoint.circuit %}

+ 1 - 1
netbox/templates/dcim/inc/cable_trace_end.html

@@ -20,7 +20,7 @@
             {% with model=end|model_name %}
                 <strong>{{ model|bettertitle }} {{ end }}</strong><br />
                 {% if model == 'interface' %}
-                    {{ end.get_form_factor_display }}
+                    {{ end.get_type_display }}
                 {% elif model == 'front port' or model == 'rear port' %}
                     {{ end.get_type_display }}
                 {% endif %}

+ 2 - 2
netbox/templates/dcim/inc/interface.html

@@ -10,7 +10,7 @@
 
     {# Icon and name #}
     <td class="text-nowrap">
-        <span title="{{ iface.get_form_factor_display }}">
+        <span title="{{ iface.get_type_display }}">
             <i class="fa fa-fw fa-{% if iface.mgmt_only %}wrench{% elif iface.is_lag %}align-justify{% elif iface.is_virtual %}circle{% elif iface.is_wireless %}wifi{% else %}exchange{% endif %}"></i>
             <a href="{{ iface.get_absolute_url }}">{{ iface }}</a>
         </span>
@@ -81,7 +81,7 @@
         </td>
         <td>
             <a href="{% url 'dcim:interface' pk=iface.connected_endpoint.pk %}">
-                <span title="{{ iface.connected_endpoint.get_form_factor_display }}">
+                <span title="{{ iface.connected_endpoint.get_type_display }}">
                     {{ iface.connected_endpoint }}
                 </span>
             </a>

+ 3 - 3
netbox/templates/dcim/interface.html

@@ -60,7 +60,7 @@
                 </tr>
                 <tr>
                     <td>Type</td>
-                    <td>{{ interface.get_form_factor_display }}</td>
+                    <td>{{ interface.get_type_display }}</td>
                 </tr>
                 <tr>
                     <td>Enabled</td>
@@ -125,7 +125,7 @@
                             </tr>
                             <tr>
                                 <td>Type</td>
-                                <td>{{ connected_interface.get_form_factor_display }}</td>
+                                <td>{{ connected_interface.get_type_display }}</td>
                             </tr>
                             <tr>
                                 <td>Enabled</td>
@@ -227,7 +227,7 @@
                                     <a href="{{ member.get_absolute_url }}">{{ member }}</a>
                                 </td>
                                 <td>
-                                    {{ member.get_form_factor_display }}
+                                    {{ member.get_type_display }}
                                 </td>
                             </tr>
                         {% empty %}

+ 1 - 1
netbox/templates/dcim/interface_edit.html

@@ -6,7 +6,7 @@
         <div class="panel-heading"><strong>Interface</strong></div>
         <div class="panel-body">
             {% render_field form.name %}
-            {% render_field form.form_factor %}
+            {% render_field form.type %}
             {% render_field form.enabled %}
             {% render_field form.lag %}
             {% render_field form.mac_address %}

+ 3 - 3
netbox/virtualization/api/serializers.py

@@ -3,7 +3,7 @@ from rest_framework import serializers
 from taggit_serializer.serializers import TaggitSerializer, TagListSerializerField
 
 from dcim.api.nested_serializers import NestedDeviceRoleSerializer, NestedPlatformSerializer, NestedSiteSerializer
-from dcim.constants import IFACE_FF_CHOICES, IFACE_FF_VIRTUAL, IFACE_MODE_CHOICES
+from dcim.constants import IFACE_TYPE_CHOICES, IFACE_TYPE_VIRTUAL, IFACE_MODE_CHOICES
 from dcim.models import Interface
 from extras.api.customfields import CustomFieldModelSerializer
 from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSerializer
@@ -92,7 +92,7 @@ class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer):
 
 class InterfaceSerializer(TaggitSerializer, ValidatedModelSerializer):
     virtual_machine = NestedVirtualMachineSerializer()
-    form_factor = ChoiceField(choices=IFACE_FF_CHOICES, default=IFACE_FF_VIRTUAL, required=False)
+    type = ChoiceField(choices=IFACE_TYPE_CHOICES, default=IFACE_TYPE_VIRTUAL, required=False)
     mode = ChoiceField(choices=IFACE_MODE_CHOICES, required=False, allow_null=True)
     untagged_vlan = NestedVLANSerializer(required=False, allow_null=True)
     tagged_vlans = SerializedPKRelatedField(
@@ -106,6 +106,6 @@ class InterfaceSerializer(TaggitSerializer, ValidatedModelSerializer):
     class Meta:
         model = Interface
         fields = [
-            'id', 'virtual_machine', 'name', 'form_factor', 'enabled', 'mtu', 'mac_address', 'description', 'mode',
+            'id', 'virtual_machine', 'name', 'type', 'enabled', 'mtu', 'mac_address', 'description', 'mode',
             'untagged_vlan', 'tagged_vlans', 'tags',
         ]

+ 11 - 11
netbox/virtualization/forms.py

@@ -2,7 +2,7 @@ from django import forms
 from django.core.exceptions import ValidationError
 from taggit.forms import TagField
 
-from dcim.constants import IFACE_FF_VIRTUAL, IFACE_MODE_ACCESS, IFACE_MODE_TAGGED_ALL
+from dcim.constants import IFACE_TYPE_VIRTUAL, IFACE_MODE_ACCESS, IFACE_MODE_TAGGED_ALL
 from dcim.forms import INTERFACE_MODE_HELP_TEXT
 from dcim.models import Device, DeviceRole, Interface, Platform, Rack, Region, Site
 from extras.forms import AddRemoveTagsForm, CustomFieldBulkEditForm, CustomFieldForm, CustomFieldFilterForm
@@ -18,8 +18,8 @@ from utilities.forms import (
 from .constants import VM_STATUS_CHOICES
 from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
 
-VIFACE_FF_CHOICES = (
-    (IFACE_FF_VIRTUAL, 'Virtual'),
+VIFACE_TYPE_CHOICES = (
+    (IFACE_TYPE_VIRTUAL, 'Virtual'),
 )
 
 
@@ -625,12 +625,12 @@ class InterfaceForm(BootstrapMixin, forms.ModelForm):
     class Meta:
         model = Interface
         fields = [
-            'virtual_machine', 'name', 'form_factor', 'enabled', 'mac_address', 'mtu', 'description', 'mode', 'tags',
+            'virtual_machine', 'name', 'type', 'enabled', 'mac_address', 'mtu', 'description', 'mode', 'tags',
             'untagged_vlan', 'tagged_vlans',
         ]
         widgets = {
             'virtual_machine': forms.HiddenInput(),
-            'form_factor': forms.HiddenInput(),
+            'type': forms.HiddenInput(),
             'mode': StaticSelect2()
         }
         labels = {
@@ -661,9 +661,9 @@ class InterfaceCreateForm(ComponentForm):
     name_pattern = ExpandableNameField(
         label='Name'
     )
-    form_factor = forms.ChoiceField(
-        choices=VIFACE_FF_CHOICES,
-        initial=IFACE_FF_VIRTUAL,
+    type = forms.ChoiceField(
+        choices=VIFACE_TYPE_CHOICES,
+        initial=IFACE_TYPE_VIRTUAL,
         widget=forms.HiddenInput()
     )
     enabled = forms.BooleanField(
@@ -737,9 +737,9 @@ class VirtualMachineBulkAddComponentForm(BootstrapMixin, forms.Form):
 
 
 class VirtualMachineBulkAddInterfaceForm(VirtualMachineBulkAddComponentForm):
-    form_factor = forms.ChoiceField(
-        choices=VIFACE_FF_CHOICES,
-        initial=IFACE_FF_VIRTUAL,
+    type = forms.ChoiceField(
+        choices=VIFACE_TYPE_CHOICES,
+        initial=IFACE_TYPE_VIRTUAL,
         widget=forms.HiddenInput()
     )
     enabled = forms.BooleanField(

+ 4 - 4
netbox/virtualization/tests/test_api.py

@@ -2,7 +2,7 @@ from django.urls import reverse
 from netaddr import IPNetwork
 from rest_framework import status
 
-from dcim.constants import IFACE_FF_VIRTUAL, IFACE_MODE_TAGGED
+from dcim.constants import IFACE_TYPE_VIRTUAL, IFACE_MODE_TAGGED
 from dcim.models import Interface
 from ipam.models import IPAddress, VLAN
 from utilities.testing import APITestCase
@@ -489,17 +489,17 @@ class InterfaceTest(APITestCase):
         self.interface1 = Interface.objects.create(
             virtual_machine=self.virtualmachine,
             name='Test Interface 1',
-            form_factor=IFACE_FF_VIRTUAL
+            type=IFACE_TYPE_VIRTUAL
         )
         self.interface2 = Interface.objects.create(
             virtual_machine=self.virtualmachine,
             name='Test Interface 2',
-            form_factor=IFACE_FF_VIRTUAL
+            type=IFACE_TYPE_VIRTUAL
         )
         self.interface3 = Interface.objects.create(
             virtual_machine=self.virtualmachine,
             name='Test Interface 3',
-            form_factor=IFACE_FF_VIRTUAL
+            type=IFACE_TYPE_VIRTUAL
         )
 
         self.vlan1 = VLAN.objects.create(name="Test VLAN 1", vid=1)

Некоторые файлы не были показаны из-за большого количества измененных файлов