소스 검색

Replaces device_role with role on device model (#13342)

* replaces device_role with role on device model #6391

* fixes lint issue #6391

* revert the database user

* revert test_runner comment

* changes as per review

* Update references to device_role column in UserConfigs

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
Abhimanyu Saharan 2 년 전
부모
커밋
0bb86f1e7d
37개의 변경된 파일422개의 추가작업 그리고 331개의 파일을 삭제
  1. 1 1
      docs/customization/custom-scripts.md
  2. 11 6
      netbox/dcim/api/serializers.py
  3. 2 2
      netbox/dcim/api/views.py
  4. 18 6
      netbox/dcim/filtersets.py
  5. 2 2
      netbox/dcim/forms/bulk_edit.py
  6. 2 2
      netbox/dcim/forms/bulk_import.py
  7. 12 12
      netbox/dcim/forms/filtersets.py
  8. 2 2
      netbox/dcim/forms/model_forms.py
  9. 35 0
      netbox/dcim/migrations/0181_rename_device_role_device_role.py
  10. 18 4
      netbox/dcim/models/devices.py
  11. 1 1
      netbox/dcim/models/racks.py
  12. 2 2
      netbox/dcim/svg/cables.py
  13. 3 3
      netbox/dcim/svg/racks.py
  14. 9 9
      netbox/dcim/tables/devices.py
  15. 60 60
      netbox/dcim/tests/test_api.py
  16. 2 2
      netbox/dcim/tests/test_cablepaths.py
  17. 95 95
      netbox/dcim/tests/test_filtersets.py
  18. 7 7
      netbox/dcim/tests/test_forms.py
  19. 50 24
      netbox/dcim/tests/test_models.py
  20. 2 2
      netbox/dcim/tests/test_natural_ordering.py
  21. 33 33
      netbox/dcim/tests/test_views.py
  22. 6 6
      netbox/dcim/views.py
  23. 2 3
      netbox/extras/querysets.py
  24. 2 2
      netbox/extras/tests/test_api.py
  25. 5 5
      netbox/extras/tests/test_models.py
  26. 3 3
      netbox/ipam/tests/test_api.py
  27. 12 12
      netbox/ipam/tests/test_filtersets.py
  28. 2 2
      netbox/ipam/tests/test_models.py
  29. 2 2
      netbox/ipam/tests/test_views.py
  30. 1 1
      netbox/templates/dcim/device.html
  31. 1 1
      netbox/templates/dcim/device_edit.html
  32. 1 1
      netbox/templates/dcim/devicerole.html
  33. 1 1
      netbox/templates/dcim/inc/nonracked_devices.html
  34. 1 1
      netbox/templates/dcim/platform.html
  35. 1 1
      netbox/utilities/testing/utils.py
  36. 5 5
      netbox/utilities/tests/test_filters.py
  37. 10 10
      netbox/virtualization/tests/test_views.py

+ 1 - 1
docs/customization/custom-scripts.md

@@ -390,7 +390,7 @@ class NewBranchScript(Script):
                 name=f'{site.slug}-switch{i}',
                 site=site,
                 status=DeviceStatusChoices.STATUS_PLANNED,
-                device_role=switch_role
+                role=switch_role
             )
             switch.full_clean()
             switch.save()

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

@@ -665,7 +665,8 @@ class PlatformSerializer(NetBoxModelSerializer):
 class DeviceSerializer(NetBoxModelSerializer):
     url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail')
     device_type = NestedDeviceTypeSerializer()
-    device_role = NestedDeviceRoleSerializer()
+    role = NestedDeviceRoleSerializer()
+    device_role = NestedDeviceRoleSerializer(read_only=True, help_text='Deprecated in v3.6 in favor of `role`.')
     tenant = NestedTenantSerializer(required=False, allow_null=True, default=None)
     platform = NestedPlatformSerializer(required=False, allow_null=True)
     site = NestedSiteSerializer()
@@ -707,9 +708,9 @@ class DeviceSerializer(NetBoxModelSerializer):
     class Meta:
         model = Device
         fields = [
-            'id', 'url', 'display', 'name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag',
-            'site', 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device', 'status',
-            'airflow', 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis',
+            'id', 'url', 'display', 'name', 'device_type', 'role', 'device_role', 'tenant', 'platform', 'serial',
+            'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent_device',
+            'status', 'airflow', 'primary_ip', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis',
             'vc_position', 'vc_priority', 'description', 'comments', 'config_template', 'local_context_data', 'tags',
             'custom_fields', 'created', 'last_updated', 'console_port_count', 'console_server_port_count',
             'power_port_count', 'power_outlet_count', 'interface_count', 'front_port_count', 'rear_port_count',
@@ -727,13 +728,16 @@ class DeviceSerializer(NetBoxModelSerializer):
         data['device_bay'] = NestedDeviceBaySerializer(instance=device_bay, context=context).data
         return data
 
+    def get_device_role(self, obj):
+        return obj.role
+
 
 class DeviceWithConfigContextSerializer(DeviceSerializer):
     config_context = serializers.SerializerMethodField(read_only=True)
 
     class Meta(DeviceSerializer.Meta):
         fields = [
-            'id', 'url', 'display', 'name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag',
+            'id', 'url', 'display', 'name', 'device_type', 'role', 'tenant', 'platform', 'serial', 'asset_tag',
             'site', 'location', 'rack', 'position', 'face', 'parent_device', 'status', 'airflow', 'primary_ip',
             'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority',
             'description', 'comments', 'local_context_data', 'tags', 'custom_fields', 'config_context',
@@ -1035,7 +1039,8 @@ class ModuleBaySerializer(NetBoxModelSerializer):
     class Meta:
         model = ModuleBay
         fields = [
-            'id', 'url', 'display', 'device', 'name', 'installed_module', 'label', 'position', 'description', 'tags', 'custom_fields',
+            'id', 'url', 'display', 'device', 'name', 'installed_module', 'label', 'position', 'description', 'tags',
+            'custom_fields',
             'created', 'last_updated',
         ]
 

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

@@ -362,7 +362,7 @@ class InventoryItemTemplateViewSet(NetBoxModelViewSet):
 
 class DeviceRoleViewSet(NetBoxModelViewSet):
     queryset = DeviceRole.objects.prefetch_related('config_template', 'tags').annotate(
-        device_count=count_related(Device, 'device_role'),
+        device_count=count_related(Device, 'role'),
         virtualmachine_count=count_related(VirtualMachine, 'role')
     )
     serializer_class = serializers.DeviceRoleSerializer
@@ -393,7 +393,7 @@ class DeviceViewSet(
     NetBoxModelViewSet
 ):
     queryset = Device.objects.prefetch_related(
-        'device_type__manufacturer', 'device_role', 'tenant', 'platform', 'site', 'location', 'rack', 'parent_bay',
+        'device_type__manufacturer', 'role', 'tenant', 'platform', 'site', 'location', 'rack', 'parent_bay',
         'virtual_chassis__master', 'primary_ip4__nat_outside', 'primary_ip6__nat_outside', 'config_template', 'tags',
     )
     filterset_class = filtersets.DeviceFilterSet

+ 18 - 6
netbox/dcim/filtersets.py

@@ -840,12 +840,12 @@ class DeviceFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilter
         label=_('Device type (ID)'),
     )
     role_id = django_filters.ModelMultipleChoiceFilter(
-        field_name='device_role_id',
+        field_name='role_id',
         queryset=DeviceRole.objects.all(),
         label=_('Role (ID)'),
     )
     role = django_filters.ModelMultipleChoiceFilter(
-        field_name='device_role__slug',
+        field_name='role__slug',
         queryset=DeviceRole.objects.all(),
         to_field_name='slug',
         label=_('Role (slug)'),
@@ -1251,13 +1251,13 @@ class DeviceComponentFilterSet(django_filters.FilterSet):
         to_field_name='model',
         label=_('Device type (model)'),
     )
-    device_role_id = django_filters.ModelMultipleChoiceFilter(
-        field_name='device__device_role',
+    role_id = django_filters.ModelMultipleChoiceFilter(
+        field_name='device__role',
         queryset=DeviceRole.objects.all(),
         label=_('Device role (ID)'),
     )
-    device_role = django_filters.ModelMultipleChoiceFilter(
-        field_name='device__device_role__slug',
+    role = django_filters.ModelMultipleChoiceFilter(
+        field_name='device__role__slug',
         queryset=DeviceRole.objects.all(),
         to_field_name='slug',
         label=_('Device role (slug)'),
@@ -1273,6 +1273,18 @@ class DeviceComponentFilterSet(django_filters.FilterSet):
         to_field_name='name',
         label=_('Virtual Chassis'),
     )
+    # TODO: Remove in v4.0
+    device_role_id = django_filters.ModelMultipleChoiceFilter(
+        field_name='device__role',
+        queryset=DeviceRole.objects.all(),
+        label=_('Device role (ID)'),
+    )
+    device_role = django_filters.ModelMultipleChoiceFilter(
+        field_name='device__role__slug',
+        queryset=DeviceRole.objects.all(),
+        to_field_name='slug',
+        label=_('Device role (slug)'),
+    )
 
     def search(self, queryset, name, value):
         if not value.strip():

+ 2 - 2
netbox/dcim/forms/bulk_edit.py

@@ -553,7 +553,7 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm):
             'manufacturer_id': '$manufacturer'
         }
     )
-    device_role = DynamicModelChoiceField(
+    role = DynamicModelChoiceField(
         label=_('Device role'),
         queryset=DeviceRole.objects.all(),
         required=False
@@ -610,7 +610,7 @@ class DeviceBulkEditForm(NetBoxModelBulkEditForm):
 
     model = Device
     fieldsets = (
-        (_('Device'), ('device_role', 'status', 'tenant', 'platform', 'description')),
+        (_('Device'), ('role', 'status', 'tenant', 'platform', 'description')),
         (_('Location'), ('site', 'location')),
         (_('Hardware'), ('manufacturer', 'device_type', 'airflow', 'serial')),
         (_('Configuration'), ('config_template',)),

+ 2 - 2
netbox/dcim/forms/bulk_import.py

@@ -404,7 +404,7 @@ class PlatformImportForm(NetBoxModelImportForm):
 
 
 class BaseDeviceImportForm(NetBoxModelImportForm):
-    device_role = CSVModelChoiceField(
+    role = CSVModelChoiceField(
         label=_('Device role'),
         queryset=DeviceRole.objects.all(),
         to_field_name='name',
@@ -527,7 +527,7 @@ class DeviceImportForm(BaseDeviceImportForm):
 
     class Meta(BaseDeviceImportForm.Meta):
         fields = [
-            'name', 'device_role', 'tenant', 'manufacturer', 'device_type', 'platform', 'serial', 'asset_tag', 'status',
+            'name', 'role', 'tenant', 'manufacturer', 'device_type', 'platform', 'serial', 'asset_tag', 'status',
             'site', 'location', 'rack', 'position', 'face', 'latitude', 'longitude', 'parent', 'device_bay', 'airflow',
             'virtual_chassis', 'vc_position', 'vc_priority', 'cluster', 'description', 'config_template', 'comments',
             'tags',

+ 12 - 12
netbox/dcim/forms/filtersets.py

@@ -109,7 +109,7 @@ class DeviceComponentFilterForm(NetBoxModelFilterSetForm):
         required=False,
         label=_('Device type')
     )
-    device_role_id = DynamicModelMultipleChoiceField(
+    role_id = DynamicModelMultipleChoiceField(
         queryset=DeviceRole.objects.all(),
         required=False,
         label=_('Device role')
@@ -122,7 +122,7 @@ class DeviceComponentFilterForm(NetBoxModelFilterSetForm):
             'location_id': '$location_id',
             'virtual_chassis_id': '$virtual_chassis_id',
             'device_type_id': '$device_type_id',
-            'role_id': '$device_role_id'
+            'role_id': '$role_id'
         },
         label=_('Device')
     )
@@ -1136,7 +1136,7 @@ class ConsolePortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm):
         (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('name', 'label', 'type', 'speed')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')),
         (_('Connection'), ('cabled', 'connected', 'occupied')),
     )
     type = forms.MultipleChoiceField(
@@ -1158,7 +1158,7 @@ class ConsoleServerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterF
         (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('name', 'label', 'type', 'speed')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')),
         (_('Connection'), ('cabled', 'connected', 'occupied')),
     )
     type = forms.MultipleChoiceField(
@@ -1180,7 +1180,7 @@ class PowerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm):
         (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('name', 'label', 'type')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')),
         (_('Connection'), ('cabled', 'connected', 'occupied')),
     )
     type = forms.MultipleChoiceField(
@@ -1197,7 +1197,7 @@ class PowerOutletFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm):
         (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('name', 'label', 'type')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')),
         (_('Connection'), ('cabled', 'connected', 'occupied')),
     )
     type = forms.MultipleChoiceField(
@@ -1217,7 +1217,7 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm):
         (_('PoE'), ('poe_mode', 'poe_type')),
         (_('Wireless'), ('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id', 'vdc_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id', 'vdc_id')),
         (_('Connection'), ('cabled', 'connected', 'occupied')),
     )
     vdc_id = DynamicModelMultipleChoiceField(
@@ -1324,7 +1324,7 @@ class FrontPortFilterForm(CabledFilterForm, DeviceComponentFilterForm):
         (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('name', 'label', 'type', 'color')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')),
         (_('Cable'), ('cabled', 'occupied')),
     )
     model = FrontPort
@@ -1346,7 +1346,7 @@ class RearPortFilterForm(CabledFilterForm, DeviceComponentFilterForm):
         (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('name', 'label', 'type', 'color')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')),
         (_('Cable'), ('cabled', 'occupied')),
     )
     type = forms.MultipleChoiceField(
@@ -1367,7 +1367,7 @@ class ModuleBayFilterForm(DeviceComponentFilterForm):
         (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('name', 'label', 'position')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')),
     )
     tag = TagFilterField(model)
     position = forms.CharField(
@@ -1382,7 +1382,7 @@ class DeviceBayFilterForm(DeviceComponentFilterForm):
         (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('name', 'label')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')),
     )
     tag = TagFilterField(model)
 
@@ -1393,7 +1393,7 @@ class InventoryItemFilterForm(DeviceComponentFilterForm):
         (None, ('q', 'filter_id', 'tag')),
         (_('Attributes'), ('name', 'label', 'role_id', 'manufacturer_id', 'serial', 'asset_tag', 'discovered')),
         (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')),
-        (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')),
+        (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')),
     )
     role_id = DynamicModelMultipleChoiceField(
         queryset=InventoryItemRole.objects.all(),

+ 2 - 2
netbox/dcim/forms/model_forms.py

@@ -434,7 +434,7 @@ class DeviceForm(TenancyForm, NetBoxModelForm):
         queryset=DeviceType.objects.all(),
         selector=True
     )
-    device_role = DynamicModelChoiceField(
+    role = DynamicModelChoiceField(
         label=_('Device role'),
         queryset=DeviceRole.objects.all()
     )
@@ -479,7 +479,7 @@ class DeviceForm(TenancyForm, NetBoxModelForm):
     class Meta:
         model = Device
         fields = [
-            'name', 'device_role', 'device_type', 'serial', 'asset_tag', 'site', 'rack', 'location', 'position', 'face',
+            'name', 'role', 'device_type', 'serial', 'asset_tag', 'site', 'rack', 'location', 'position', 'face',
             'latitude', 'longitude', 'status', 'airflow', 'platform', 'primary_ip4', 'primary_ip6', 'oob_ip', 'cluster',
             'tenant_group', 'tenant', 'virtual_chassis', 'vc_position', 'vc_priority', 'description', 'config_template',
             'comments', 'tags', 'local_context_data',

+ 35 - 0
netbox/dcim/migrations/0181_rename_device_role_device_role.py

@@ -0,0 +1,35 @@
+from django.db import migrations
+
+
+def update_table_configs(apps, schema_editor):
+    """
+    Replace the `device_role` column in DeviceTable configs with `role`.
+    """
+    UserConfig = apps.get_model('users', 'UserConfig')
+
+    for table in ('DeviceTable', 'DeviceBayTable'):
+        for config in UserConfig.objects.filter(**{f'data__tables__{table}__columns__contains': 'device_role'}):
+            config.data['tables'][table]['columns'] = [
+                'role' if x == 'device_role' else x
+                for x in config.data['tables'][table]['columns']
+            ]
+            config.save()
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('dcim', '0180_powerfeed_tenant'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='device',
+            old_name='device_role',
+            new_name='role',
+        ),
+        migrations.RunPython(
+            code=update_table_configs,
+            reverse_code=migrations.RunPython.noop
+        ),
+    ]

+ 18 - 4
netbox/dcim/models/devices.py

@@ -537,7 +537,7 @@ class Device(PrimaryModel, ConfigContextModel, TrackingModelMixin):
         on_delete=models.PROTECT,
         related_name='instances'
     )
-    device_role = models.ForeignKey(
+    role = models.ForeignKey(
         to='dcim.DeviceRole',
         on_delete=models.PROTECT,
         related_name='devices',
@@ -758,7 +758,7 @@ class Device(PrimaryModel, ConfigContextModel, TrackingModelMixin):
     objects = ConfigContextModelQuerySet.as_manager()
 
     clone_fields = (
-        'device_type', 'device_role', 'tenant', 'platform', 'site', 'location', 'rack', 'face', 'status', 'airflow',
+        'device_type', 'role', 'tenant', 'platform', 'site', 'location', 'rack', 'face', 'status', 'airflow',
         'cluster', 'virtual_chassis',
     )
     prerequisite_models = (
@@ -808,6 +808,20 @@ class Device(PrimaryModel, ConfigContextModel, TrackingModelMixin):
     def get_absolute_url(self):
         return reverse('dcim:device', args=[self.pk])
 
+    @property
+    def device_role(self):
+        """
+        For backwards compatibility with pre-v3.6 code expecting a device_role to be present on Device.
+        """
+        return self.role
+
+    @device_role.setter
+    def device_role(self, value):
+        """
+        For backwards compatibility with pre-v3.6 code expecting a device_role to be present on Device.
+        """
+        self.role = value
+
     def clean(self):
         super().clean()
 
@@ -1063,8 +1077,8 @@ class Device(PrimaryModel, ConfigContextModel, TrackingModelMixin):
         """
         if self.config_template:
             return self.config_template
-        if self.device_role.config_template:
-            return self.device_role.config_template
+        if self.role.config_template:
+            return self.role.config_template
         if self.platform and self.platform.config_template:
             return self.platform.config_template
 

+ 1 - 1
netbox/dcim/models/racks.py

@@ -323,7 +323,7 @@ class Rack(PrimaryModel, WeightMixin):
             devices = Device.objects.prefetch_related(
                 'device_type',
                 'device_type__manufacturer',
-                'device_role'
+                'role'
             ).annotate(
                 devicebay_count=Count('devicebays')
             ).exclude(

+ 2 - 2
netbox/dcim/svg/cables.py

@@ -167,9 +167,9 @@ class CableTraceSVG:
         if hasattr(instance, 'parent_object'):
             # Termination
             return getattr(instance, 'color', 'f0f0f0') or 'f0f0f0'
-        if hasattr(instance, 'device_role'):
+        if hasattr(instance, 'role'):
             # Device
-            return instance.device_role.color
+            return instance.role.color
         else:
             # Other parent object
             return 'e0e0e0'

+ 3 - 3
netbox/dcim/svg/racks.py

@@ -46,14 +46,14 @@ def get_device_description(device):
     Return a description for a device to be rendered in the rack elevation in the following format
 
     Name: <name>
-    Role: <device_role>
+    Role: <role>
     Device Type: <manufacturer> <model> (<u_height>)
     Asset tag: <asset_tag> (if defined)
     Serial: <serial> (if defined)
     Description: <description> (if defined)
     """
     description = f'Name: {device.name}'
-    description += f'\nRole: {device.device_role}'
+    description += f'\nRole: {device.role}'
     u_height = f'{floatformat(device.device_type.u_height)}U'
     description += f'\nDevice Type: {device.device_type.manufacturer.name} {device.device_type.model} ({u_height})'
     if device.asset_tag:
@@ -205,7 +205,7 @@ class RackElevationSVG:
         """
         Draw the front (mounted) face of a device.
         """
-        color = device.device_role.color
+        color = device.role.color
         image = device.device_type.front_image
         self._draw_device(device, coords, size, color=color, image=image)
 

+ 9 - 9
netbox/dcim/tables/devices.py

@@ -190,7 +190,7 @@ class DeviceTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
         verbose_name=_('Position'),
         template_code='{{ value|floatformat }}'
     )
-    device_role = columns.ColoredLabelColumn(
+    role = columns.ColoredLabelColumn(
         verbose_name=_('Role')
     )
     manufacturer = tables.Column(
@@ -285,14 +285,14 @@ class DeviceTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
     class Meta(NetBoxTable.Meta):
         model = models.Device
         fields = (
-            'pk', 'id', 'name', 'status', 'tenant', 'tenant_group', 'device_role', 'manufacturer', 'device_type',
+            'pk', 'id', 'name', 'status', 'tenant', 'tenant_group', 'role', 'manufacturer', 'device_type',
             'platform', 'serial', 'asset_tag', 'region', 'site_group', 'site', 'location', 'rack', 'parent_device',
             'device_bay_position', 'position', 'face', 'latitude', 'longitude', 'airflow', 'primary_ip', 'primary_ip4',
             'primary_ip6', 'oob_ip', 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'description',
             'config_template', 'comments', 'contacts', 'tags', 'created', 'last_updated',
         )
         default_columns = (
-            'pk', 'name', 'status', 'tenant', 'site', 'location', 'rack', 'device_role', 'manufacturer', 'device_type',
+            'pk', 'name', 'status', 'tenant', 'site', 'location', 'rack', 'role', 'manufacturer', 'device_type',
             'primary_ip',
         )
 
@@ -314,7 +314,7 @@ class DeviceImportTable(TenancyColumnsMixin, NetBoxTable):
         verbose_name=_('Rack'),
         linkify=True
     )
-    device_role = tables.Column(
+    role = tables.Column(
         verbose_name=_('Role')
     )
     device_type = tables.Column(
@@ -323,7 +323,7 @@ class DeviceImportTable(TenancyColumnsMixin, NetBoxTable):
 
     class Meta(NetBoxTable.Meta):
         model = models.Device
-        fields = ('id', 'name', 'status', 'tenant', 'tenant_group', 'site', 'rack', 'position', 'device_role', 'device_type')
+        fields = ('id', 'name', 'status', 'tenant', 'tenant_group', 'site', 'rack', 'position', 'role', 'device_type')
         empty_text = False
 
 
@@ -822,8 +822,8 @@ class DeviceBayTable(DeviceComponentTable):
             'args': [Accessor('device_id')],
         }
     )
-    device_role = columns.ColoredLabelColumn(
-        accessor=Accessor('installed_device__device_role'),
+    role = columns.ColoredLabelColumn(
+        accessor=Accessor('installed_device__role'),
         verbose_name=_('Role')
     )
     device_type = tables.Column(
@@ -847,8 +847,8 @@ class DeviceBayTable(DeviceComponentTable):
     class Meta(DeviceComponentTable.Meta):
         model = models.DeviceBay
         fields = (
-            'pk', 'id', 'name', 'device', 'label', 'status', 'device_role', 'device_type', 'installed_device', 'description', 'tags',
-            'created', 'last_updated',
+            'pk', 'id', 'name', 'device', 'label', 'status', 'role', 'device_type', 'installed_device', 'description',
+            'tags', 'created', 'last_updated',
         )
 
         default_columns = ('pk', 'name', 'device', 'label', 'status', 'installed_device', 'description')

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

@@ -40,7 +40,7 @@ class Mixins:
             peer_device = Device.objects.create(
                 site=Site.objects.first(),
                 device_type=DeviceType.objects.first(),
-                device_role=DeviceRole.objects.first(),
+                role=DeviceRole.objects.first(),
                 name='Peer Device'
             )
             if self.peer_termination_type is None:
@@ -1052,12 +1052,12 @@ class DeviceRoleTest(APIViewTestCases.APIViewTestCase):
     @classmethod
     def setUpTestData(cls):
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1', color='ff0000'),
             DeviceRole(name='Device Role 2', slug='device-role-2', color='00ff00'),
             DeviceRole(name='Device Role 3', slug='device-role-3', color='0000ff'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
 
 class PlatformTest(APIViewTestCases.APIViewTestCase):
@@ -1122,11 +1122,11 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
         )
         DeviceType.objects.bulk_create(device_types)
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1', color='ff0000'),
             DeviceRole(name='Device Role 2', slug='device-role-2', color='00ff00'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
 
@@ -1139,7 +1139,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
         devices = (
             Device(
                 device_type=device_types[0],
-                device_role=device_roles[0],
+                role=roles[0],
                 name='Device 1',
                 site=sites[0],
                 rack=racks[0],
@@ -1148,7 +1148,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
             ),
             Device(
                 device_type=device_types[0],
-                device_role=device_roles[0],
+                role=roles[0],
                 name='Device 2',
                 site=sites[0],
                 rack=racks[0],
@@ -1157,7 +1157,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
             ),
             Device(
                 device_type=device_types[0],
-                device_role=device_roles[0],
+                role=roles[0],
                 name='Device 3',
                 site=sites[0],
                 rack=racks[0],
@@ -1170,7 +1170,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
         cls.create_data = [
             {
                 'device_type': device_types[1].pk,
-                'device_role': device_roles[1].pk,
+                'role': roles[1].pk,
                 'name': 'Test Device 4',
                 'site': sites[1].pk,
                 'rack': racks[1].pk,
@@ -1178,7 +1178,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
             },
             {
                 'device_type': device_types[1].pk,
-                'device_role': device_roles[1].pk,
+                'role': roles[1].pk,
                 'name': 'Test Device 5',
                 'site': sites[1].pk,
                 'rack': racks[1].pk,
@@ -1186,7 +1186,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
             },
             {
                 'device_type': device_types[1].pk,
-                'device_role': device_roles[1].pk,
+                'role': roles[1].pk,
                 'name': 'Test Device 6',
                 'site': sites[1].pk,
                 'rack': racks[1].pk,
@@ -1221,7 +1221,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
         device = Device.objects.first()
         data = {
             'device_type': device.device_type.pk,
-            'device_role': device.device_role.pk,
+            'role': device.role.pk,
             'site': device.site.pk,
             'name': device.name,
         }
@@ -1241,7 +1241,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
         data = [
             {
                 'device_type': device_type.pk,
-                'device_role': device.device_role.pk,
+                'role': device.role.pk,
                 'site': device.site.pk,
                 'name': 'Test Device 7',
                 'rack': device.rack.pk,
@@ -1250,7 +1250,7 @@ class DeviceTest(APIViewTestCases.APIViewTestCase):
             },
             {
                 'device_type': device_type.pk,
-                'device_role': device.device_role.pk,
+                'role': device.role.pk,
                 'site': device.site.pk,
                 'name': 'Test Device 8',
                 'rack': device.rack.pk,
@@ -1343,8 +1343,8 @@ class ConsolePortTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCa
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
-        device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site)
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site)
 
         console_ports = (
             ConsolePort(device=device, name='Console Port 1'),
@@ -1385,8 +1385,8 @@ class ConsoleServerPortTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIView
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
-        device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site)
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site)
 
         console_server_ports = (
             ConsoleServerPort(device=device, name='Console Server Port 1'),
@@ -1427,8 +1427,8 @@ class PowerPortTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
-        device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site)
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site)
 
         power_ports = (
             PowerPort(device=device, name='Power Port 1'),
@@ -1466,8 +1466,8 @@ class PowerOutletTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCa
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
-        device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site)
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site)
 
         power_ports = (
             PowerPort(device=device, name='Power Port 1'),
@@ -1514,8 +1514,8 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
-        device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site)
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site)
 
         interfaces = (
             Interface(device=device, name='Interface 1', type='1000base-t'),
@@ -1621,8 +1621,8 @@ class FrontPortTest(APIViewTestCases.APIViewTestCase):
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
-        device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site)
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site)
 
         rear_ports = (
             RearPort(device=device, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C),
@@ -1679,8 +1679,8 @@ class RearPortTest(APIViewTestCases.APIViewTestCase):
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
-        device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site)
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site)
 
         rear_ports = (
             RearPort(device=device, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C),
@@ -1719,10 +1719,10 @@ class ModuleBayTest(APIViewTestCases.APIViewTestCase):
     def setUpTestData(cls):
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
 
         device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
-        device = Device.objects.create(device_type=device_type, device_role=devicerole, name='Device 1', site=site)
+        device = Device.objects.create(device_type=device_type, role=role, name='Device 1', site=site)
 
         device_bays = (
             ModuleBay(device=device, name='Device Bay 1'),
@@ -1758,7 +1758,7 @@ class DeviceBayTest(APIViewTestCases.APIViewTestCase):
     def setUpTestData(cls):
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
 
         device_types = (
             DeviceType(
@@ -1777,10 +1777,10 @@ class DeviceBayTest(APIViewTestCases.APIViewTestCase):
         DeviceType.objects.bulk_create(device_types)
 
         devices = (
-            Device(device_type=device_types[0], device_role=devicerole, name='Device 1', site=site),
-            Device(device_type=device_types[1], device_role=devicerole, name='Device 2', site=site),
-            Device(device_type=device_types[1], device_role=devicerole, name='Device 3', site=site),
-            Device(device_type=device_types[1], device_role=devicerole, name='Device 4', site=site),
+            Device(device_type=device_types[0], role=role, name='Device 1', site=site),
+            Device(device_type=device_types[1], role=role, name='Device 2', site=site),
+            Device(device_type=device_types[1], role=role, name='Device 3', site=site),
+            Device(device_type=device_types[1], role=role, name='Device 4', site=site),
         )
         Device.objects.bulk_create(devices)
 
@@ -1822,8 +1822,8 @@ class InventoryItemTest(APIViewTestCases.APIViewTestCase):
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
-        device = Device.objects.create(device_type=devicetype, device_role=devicerole, name='Device 1', site=site)
+        role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
+        device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site)
 
         roles = (
             InventoryItemRole(name='Inventory Item Role 1', slug='inventory-item-role-1'),
@@ -1932,11 +1932,11 @@ class CableTest(APIViewTestCases.APIViewTestCase):
         site = Site.objects.create(name='Site 1', slug='site-1')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
-        devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1', color='ff0000')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1', color='ff0000')
 
         devices = (
-            Device(device_type=devicetype, device_role=devicerole, name='Device 1', site=site),
-            Device(device_type=devicetype, device_role=devicerole, name='Device 2', site=site),
+            Device(device_type=devicetype, role=role, name='Device 1', site=site),
+            Device(device_type=devicetype, role=role, name='Device 2', site=site),
         )
         Device.objects.bulk_create(devices)
 
@@ -1998,10 +1998,10 @@ class ConnectedDeviceTest(APITestCase):
         site = Site.objects.create(name='Site 1', slug='site-1')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
-        devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1', color='ff0000')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1', color='ff0000')
         devices = (
-            Device(device_type=devicetype, device_role=devicerole, name='TestDevice1', site=site),
-            Device(device_type=devicetype, device_role=devicerole, name='TestDevice2', site=site),
+            Device(device_type=devicetype, role=role, name='TestDevice1', site=site),
+            Device(device_type=devicetype, role=role, name='TestDevice2', site=site),
         )
         Device.objects.bulk_create(devices)
         interfaces = (
@@ -2037,21 +2037,21 @@ class VirtualChassisTest(APIViewTestCases.APIViewTestCase):
         site = Site.objects.create(name='Test Site', slug='test-site')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type', slug='device-type')
-        devicerole = DeviceRole.objects.create(name='Device Role', slug='device-role', color='ff0000')
+        role = DeviceRole.objects.create(name='Device Role', slug='device-role', color='ff0000')
 
         devices = (
-            Device(name='Device 1', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 2', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 3', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 4', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 5', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 6', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 7', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 8', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 9', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 10', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 11', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 12', device_type=devicetype, device_role=devicerole, site=site),
+            Device(name='Device 1', device_type=devicetype, role=role, site=site),
+            Device(name='Device 2', device_type=devicetype, role=role, site=site),
+            Device(name='Device 3', device_type=devicetype, role=role, site=site),
+            Device(name='Device 4', device_type=devicetype, role=role, site=site),
+            Device(name='Device 5', device_type=devicetype, role=role, site=site),
+            Device(name='Device 6', device_type=devicetype, role=role, site=site),
+            Device(name='Device 7', device_type=devicetype, role=role, site=site),
+            Device(name='Device 8', device_type=devicetype, role=role, site=site),
+            Device(name='Device 9', device_type=devicetype, role=role, site=site),
+            Device(name='Device 10', device_type=devicetype, role=role, site=site),
+            Device(name='Device 11', device_type=devicetype, role=role, site=site),
+            Device(name='Device 12', device_type=devicetype, role=role, site=site),
         )
         Device.objects.bulk_create(devices)
 
@@ -2225,12 +2225,12 @@ class VirtualDeviceContextTest(APIViewTestCases.APIViewTestCase):
         site = Site.objects.create(name='Test Site', slug='test-site')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type', slug='device-type')
-        devicerole = DeviceRole.objects.create(name='Device Role', slug='device-role', color='ff0000')
+        role = DeviceRole.objects.create(name='Device Role', slug='device-role', color='ff0000')
 
         devices = (
-            Device(name='Device 1', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 2', device_type=devicetype, device_role=devicerole, site=site),
-            Device(name='Device 3', device_type=devicetype, device_role=devicerole, site=site),
+            Device(name='Device 1', device_type=devicetype, role=role, site=site),
+            Device(name='Device 2', device_type=devicetype, role=role, site=site),
+            Device(name='Device 3', device_type=devicetype, role=role, site=site),
         )
         Device.objects.bulk_create(devices)
 

+ 2 - 2
netbox/dcim/tests/test_cablepaths.py

@@ -24,8 +24,8 @@ class CablePathTestCase(TestCase):
 
         manufacturer = Manufacturer.objects.create(name='Generic', slug='generic')
         device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Test Device')
-        device_role = DeviceRole.objects.create(name='Device Role', slug='device-role')
-        cls.device = Device.objects.create(site=cls.site, device_type=device_type, device_role=device_role, name='Test Device')
+        role = DeviceRole.objects.create(name='Device Role', slug='device-role')
+        cls.device = Device.objects.create(site=cls.site, device_type=device_type, role=role, name='Test Device')
 
         cls.powerpanel = PowerPanel.objects.create(site=cls.site, name='Power Panel')
 

+ 95 - 95
netbox/dcim/tests/test_filtersets.py

@@ -24,11 +24,11 @@ class DeviceComponentFilterSetTests:
         params = {'device_type': [device_types[0].model, device_types[1].model]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
-    def test_device_role(self):
-        device_role = DeviceRole.objects.all()[:2]
-        params = {'device_role_id': [device_role[0].pk, device_role[1].pk]}
+    def test_role(self):
+        role = DeviceRole.objects.all()[:2]
+        params = {'role_id': [role[0].pk, role[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
-        params = {'device_role': [device_role[0].slug, device_role[1].slug]}
+        params = {'role': [role[0].slug, role[1].slug]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
 
@@ -1473,12 +1473,12 @@ class DeviceRoleTestCase(TestCase, ChangeLoggedFilterSetTests):
     @classmethod
     def setUpTestData(cls):
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1', color='ff0000', vm_role=True, description='foobar1'),
             DeviceRole(name='Device Role 2', slug='device-role-2', color='00ff00', vm_role=True, description='foobar2'),
             DeviceRole(name='Device Role 3', slug='device-role-3', color='0000ff', vm_role=False),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
     def test_name(self):
         params = {'name': ['Device Role 1', 'Device Role 2']}
@@ -1565,12 +1565,12 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests):
         )
         DeviceType.objects.bulk_create(device_types)
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         platforms = (
             Platform(name='Platform 1', slug='platform-1'),
@@ -1641,9 +1641,9 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests):
         Tenant.objects.bulk_create(tenants)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], platform=platforms[0], tenant=tenants[0], serial='ABC', asset_tag='1001', site=sites[0], location=locations[0], rack=racks[0], position=1, face=DeviceFaceChoices.FACE_FRONT, latitude=10, longitude=10, status=DeviceStatusChoices.STATUS_ACTIVE, cluster=clusters[0], local_context_data={"foo": 123}),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], platform=platforms[1], tenant=tenants[1], serial='DEF', asset_tag='1002', site=sites[1], location=locations[1], rack=racks[1], position=2, face=DeviceFaceChoices.FACE_FRONT, latitude=20, longitude=20, status=DeviceStatusChoices.STATUS_STAGED, airflow=DeviceAirflowChoices.AIRFLOW_FRONT_TO_REAR, cluster=clusters[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], platform=platforms[2], tenant=tenants[2], serial='GHI', asset_tag='1003', site=sites[2], location=locations[2], rack=racks[2], position=3, face=DeviceFaceChoices.FACE_REAR, latitude=30, longitude=30, status=DeviceStatusChoices.STATUS_FAILED, airflow=DeviceAirflowChoices.AIRFLOW_REAR_TO_FRONT, cluster=clusters[2]),
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], platform=platforms[0], tenant=tenants[0], serial='ABC', asset_tag='1001', site=sites[0], location=locations[0], rack=racks[0], position=1, face=DeviceFaceChoices.FACE_FRONT, latitude=10, longitude=10, status=DeviceStatusChoices.STATUS_ACTIVE, cluster=clusters[0], local_context_data={"foo": 123}),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], platform=platforms[1], tenant=tenants[1], serial='DEF', asset_tag='1002', site=sites[1], location=locations[1], rack=racks[1], position=2, face=DeviceFaceChoices.FACE_FRONT, latitude=20, longitude=20, status=DeviceStatusChoices.STATUS_STAGED, airflow=DeviceAirflowChoices.AIRFLOW_FRONT_TO_REAR, cluster=clusters[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], platform=platforms[2], tenant=tenants[2], serial='GHI', asset_tag='1003', site=sites[2], location=locations[2], rack=racks[2], position=3, face=DeviceFaceChoices.FACE_REAR, latitude=30, longitude=30, status=DeviceStatusChoices.STATUS_FAILED, airflow=DeviceAirflowChoices.AIRFLOW_REAR_TO_FRONT, cluster=clusters[2]),
         )
         Device.objects.bulk_create(devices)
 
@@ -1755,10 +1755,10 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests):
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
     def test_devicerole(self):
-        device_roles = DeviceRole.objects.all()[:2]
-        params = {'role_id': [device_roles[0].pk, device_roles[1].pk]}
+        roles = DeviceRole.objects.all()[:2]
+        params = {'role_id': [roles[0].pk, roles[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
-        params = {'role': [device_roles[0].slug, device_roles[1].slug]}
+        params = {'role': [roles[0].slug, roles[1].slug]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
 
     def test_platform(self):
@@ -2062,12 +2062,12 @@ class ConsolePortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedF
 
         module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Module Type 1')
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         locations = (
             Location(name='Location 1', slug='location-1', site=sites[0]),
@@ -2085,10 +2085,10 @@ class ConsolePortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedF
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
-            Device(name=None, device_type=device_types[0], device_role=device_roles[0], site=sites[3]),  # For cable connections
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name=None, device_type=device_types[0], role=roles[0], site=sites[3]),  # For cable connections
         )
         Device.objects.bulk_create(devices)
 
@@ -2242,12 +2242,12 @@ class ConsoleServerPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeL
 
         module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Module Type 1')
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         locations = (
             Location(name='Location 1', slug='location-1', site=sites[0]),
@@ -2265,10 +2265,10 @@ class ConsoleServerPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeL
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
-            Device(name=None, device_type=device_types[2], device_role=device_roles[2], site=sites[3]),  # For cable connections
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]),  # For cable connections
         )
         Device.objects.bulk_create(devices)
 
@@ -2422,12 +2422,12 @@ class PowerPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
 
         module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Module Type 1')
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         locations = (
             Location(name='Location 1', slug='location-1', site=sites[0]),
@@ -2445,10 +2445,10 @@ class PowerPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
-            Device(name=None, device_type=device_types[2], device_role=device_roles[2], site=sites[3]),  # For cable connections
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]),  # For cable connections
         )
         Device.objects.bulk_create(devices)
 
@@ -2610,12 +2610,12 @@ class PowerOutletTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedF
 
         module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Module Type 1')
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         locations = (
             Location(name='Location 1', slug='location-1', site=sites[0]),
@@ -2633,10 +2633,10 @@ class PowerOutletTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedF
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
-            Device(name=None, device_type=device_types[2], device_role=device_roles[2], site=sites[3]),  # For cable connections
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]),  # For cable connections
         )
         Device.objects.bulk_create(devices)
 
@@ -2794,12 +2794,12 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
 
         module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Module Type 1')
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         locations = (
             Location(name='Location 1', slug='location-1', site=sites[0]),
@@ -2817,10 +2817,10 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
-            Device(name=None, device_type=device_types[2], device_role=device_roles[2], site=sites[3]),  # For cable connections
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]),  # For cable connections
         )
         Device.objects.bulk_create(devices)
 
@@ -3230,12 +3230,12 @@ class FrontPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
 
         module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Module Type 1')
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         locations = (
             Location(name='Location 1', slug='location-1', site=sites[0]),
@@ -3253,10 +3253,10 @@ class FrontPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
-            Device(name=None, device_type=device_types[2], device_role=device_roles[2], site=sites[3]),  # For cable connections
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]),  # For cable connections
         )
         Device.objects.bulk_create(devices)
 
@@ -3419,12 +3419,12 @@ class RearPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFilt
 
         module_type = ModuleType.objects.create(manufacturer=manufacturer, model='Module Type 1')
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         locations = (
             Location(name='Location 1', slug='location-1', site=sites[0]),
@@ -3442,10 +3442,10 @@ class RearPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFilt
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
-            Device(name=None, device_type=device_types[2], device_role=device_roles[2], site=sites[3]),  # For cable connections
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]),  # For cable connections
         )
         Device.objects.bulk_create(devices)
 
@@ -3600,12 +3600,12 @@ class ModuleBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
         )
         DeviceType.objects.bulk_create(device_types)
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         locations = (
             Location(name='Location 1', slug='location-1', site=sites[0]),
@@ -3623,9 +3623,9 @@ class ModuleBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
         )
         Device.objects.bulk_create(devices)
 
@@ -3729,12 +3729,12 @@ class DeviceBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
         )
         DeviceType.objects.bulk_create(device_types)
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         locations = (
             Location(name='Location 1', slug='location-1', site=sites[0]),
@@ -3752,9 +3752,9 @@ class DeviceBayTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
         )
         Device.objects.bulk_create(devices)
 
@@ -3840,12 +3840,12 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests):
         )
         DeviceType.objects.bulk_create(device_types)
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         regions = (
             Region(name='Region 1', slug='region-1'),
@@ -3886,9 +3886,9 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests):
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], site=sites[0], location=locations[0], rack=racks[0]),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], site=sites[1], location=locations[1], rack=racks[1]),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], site=sites[2], location=locations[2], rack=racks[2]),
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]),
         )
         Device.objects.bulk_create(devices)
 
@@ -3986,11 +3986,11 @@ class InventoryItemTestCase(TestCase, ChangeLoggedFilterSetTests):
         params = {'device_type': [device_types[0].model, device_types[1].model]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
 
-    def test_device_role(self):
-        device_role = DeviceRole.objects.all()[:2]
-        params = {'device_role_id': [device_role[0].pk, device_role[1].pk]}
+    def test_role(self):
+        role = DeviceRole.objects.all()[:2]
+        params = {'role_id': [role[0].pk, role[1].pk]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
-        params = {'device_role': [device_role[0].slug, device_role[1].slug]}
+        params = {'role': [role[0].slug, role[1].slug]}
         self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
 
     def test_device(self):
@@ -4066,7 +4066,7 @@ class VirtualChassisTestCase(TestCase, ChangeLoggedFilterSetTests):
 
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
-        device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
 
         regions = (
             Region(name='Region 1', slug='region-1'),
@@ -4092,12 +4092,12 @@ class VirtualChassisTestCase(TestCase, ChangeLoggedFilterSetTests):
         Site.objects.bulk_create(sites)
 
         devices = (
-            Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], vc_position=1),
-            Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[0], vc_position=2),
-            Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[1], vc_position=1),
-            Device(name='Device 4', device_type=device_type, device_role=device_role, site=sites[1], vc_position=2),
-            Device(name='Device 5', device_type=device_type, device_role=device_role, site=sites[2], vc_position=1),
-            Device(name='Device 6', device_type=device_type, device_role=device_role, site=sites[2], vc_position=2),
+            Device(name='Device 1', device_type=device_type, role=role, site=sites[0], vc_position=1),
+            Device(name='Device 2', device_type=device_type, role=role, site=sites[0], vc_position=2),
+            Device(name='Device 3', device_type=device_type, role=role, site=sites[1], vc_position=1),
+            Device(name='Device 4', device_type=device_type, role=role, site=sites[1], vc_position=2),
+            Device(name='Device 5', device_type=device_type, role=role, site=sites[2], vc_position=1),
+            Device(name='Device 6', device_type=device_type, role=role, site=sites[2], vc_position=2),
         )
         Device.objects.bulk_create(devices)
 
@@ -4187,15 +4187,15 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests):
 
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
-        device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
 
         devices = (
-            Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0], rack=racks[0], location=locations[0], position=1),
-            Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[0], rack=racks[0], location=locations[0], position=2),
-            Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[1], rack=racks[1], location=locations[1], position=1),
-            Device(name='Device 4', device_type=device_type, device_role=device_role, site=sites[1], rack=racks[1], location=locations[1], position=2),
-            Device(name='Device 5', device_type=device_type, device_role=device_role, site=sites[2], rack=racks[2], location=locations[2], position=1),
-            Device(name='Device 6', device_type=device_type, device_role=device_role, site=sites[2], rack=racks[2], location=locations[2], position=2),
+            Device(name='Device 1', device_type=device_type, role=role, site=sites[0], rack=racks[0], location=locations[0], position=1),
+            Device(name='Device 2', device_type=device_type, role=role, site=sites[0], rack=racks[0], location=locations[0], position=2),
+            Device(name='Device 3', device_type=device_type, role=role, site=sites[1], rack=racks[1], location=locations[1], position=1),
+            Device(name='Device 4', device_type=device_type, role=role, site=sites[1], rack=racks[1], location=locations[1], position=2),
+            Device(name='Device 5', device_type=device_type, role=role, site=sites[2], rack=racks[2], location=locations[2], position=1),
+            Device(name='Device 6', device_type=device_type, role=role, site=sites[2], rack=racks[2], location=locations[2], position=2),
         )
         Device.objects.bulk_create(devices)
 
@@ -4485,8 +4485,8 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTests):
 
         manufacturer = Manufacturer.objects.create(name='Manufacturer', slug='manufacturer')
         device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model', slug='model')
-        device_role = DeviceRole.objects.create(name='Device Role', slug='device-role')
-        device = Device.objects.create(name='Device', device_type=device_type, device_role=device_role, site=sites[0])
+        role = DeviceRole.objects.create(name='Device Role', slug='device-role')
+        device = Device.objects.create(name='Device', device_type=device_type, role=role, site=sites[0])
         power_ports = [
             PowerPort(device=device, name='Power Port 1'),
             PowerPort(device=device, name='Power Port 2'),
@@ -4608,12 +4608,12 @@ class VirtualDeviceContextTestCase(TestCase, ChangeLoggedFilterSetTests):
 
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Model 1', slug='model-1')
-        device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
 
         devices = (
-            Device(name='Device 1', device_type=device_type, device_role=device_role, site=sites[0]),
-            Device(name='Device 2', device_type=device_type, device_role=device_role, site=sites[1]),
-            Device(name='Device 3', device_type=device_type, device_role=device_role, site=sites[2]),
+            Device(name='Device 1', device_type=device_type, role=role, site=sites[0]),
+            Device(name='Device 2', device_type=device_type, role=role, site=sites[1]),
+            Device(name='Device 3', device_type=device_type, role=role, site=sites[2]),
         )
         Device.objects.bulk_create(devices)
 

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

@@ -22,12 +22,12 @@ class DeviceTestCase(TestCase):
         device_type = DeviceType.objects.create(
             manufacturer=manufacturer, model='Device Type 1', slug='device-type-1', u_height=1
         )
-        device_role = DeviceRole.objects.create(
+        role = DeviceRole.objects.create(
             name='Device Role 1', slug='device-role-1', color='ff0000'
         )
         Platform.objects.create(name='Platform 1', slug='platform-1')
         Device.objects.create(
-            name='Device 1', device_type=device_type, device_role=device_role, site=site, rack=rack, position=1
+            name='Device 1', device_type=device_type, role=role, site=site, rack=rack, position=1
         )
         cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
         cluster_group = ClusterGroup.objects.create(name='Cluster Group 1', slug='cluster-group-1')
@@ -36,7 +36,7 @@ class DeviceTestCase(TestCase):
     def test_racked_device(self):
         form = DeviceForm(data={
             'name': 'New Device',
-            'device_role': DeviceRole.objects.first().pk,
+            'role': DeviceRole.objects.first().pk,
             'tenant': None,
             'manufacturer': Manufacturer.objects.first().pk,
             'device_type': DeviceType.objects.first().pk,
@@ -53,7 +53,7 @@ class DeviceTestCase(TestCase):
     def test_racked_device_occupied(self):
         form = DeviceForm(data={
             'name': 'test',
-            'device_role': DeviceRole.objects.first().pk,
+            'role': DeviceRole.objects.first().pk,
             'tenant': None,
             'manufacturer': Manufacturer.objects.first().pk,
             'device_type': DeviceType.objects.first().pk,
@@ -70,7 +70,7 @@ class DeviceTestCase(TestCase):
     def test_non_racked_device(self):
         form = DeviceForm(data={
             'name': 'New Device',
-            'device_role': DeviceRole.objects.first().pk,
+            'role': DeviceRole.objects.first().pk,
             'tenant': None,
             'manufacturer': Manufacturer.objects.first().pk,
             'device_type': DeviceType.objects.first().pk,
@@ -87,7 +87,7 @@ class DeviceTestCase(TestCase):
     def test_non_racked_device_with_face(self):
         form = DeviceForm(data={
             'name': 'New Device',
-            'device_role': DeviceRole.objects.first().pk,
+            'role': DeviceRole.objects.first().pk,
             'tenant': None,
             'manufacturer': Manufacturer.objects.first().pk,
             'device_type': DeviceType.objects.first().pk,
@@ -103,7 +103,7 @@ class DeviceTestCase(TestCase):
     def test_non_racked_device_with_position(self):
         form = DeviceForm(data={
             'name': 'New Device',
-            'device_role': DeviceRole.objects.first().pk,
+            'role': DeviceRole.objects.first().pk,
             'tenant': None,
             'manufacturer': Manufacturer.objects.first().pk,
             'device_type': DeviceType.objects.first().pk,

+ 50 - 24
netbox/dcim/tests/test_models.py

@@ -25,7 +25,7 @@ class LocationTestCase(TestCase):
         device_type = DeviceType.objects.create(
             manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'
         )
-        device_role = DeviceRole.objects.create(
+        role = DeviceRole.objects.create(
             name='Device Role 1', slug='device-role-1', color='ff0000'
         )
 
@@ -45,14 +45,14 @@ class LocationTestCase(TestCase):
             location=location_a1,
             name='Device 1',
             device_type=device_type,
-            device_role=device_role
+            role=role
         )
         device2 = Device.objects.create(
             site=site_a,
             location=location_a2,
             name='Device 2',
             device_type=device_type,
-            device_role=device_role
+            role=role
         )
 
         powerpanel1 = PowerPanel.objects.create(site=site_a, location=location_a1, name='Power Panel 1')
@@ -114,7 +114,7 @@ class RackTestCase(TestCase):
         device1 = Device(
             name='Device 1',
             device_type=DeviceType.objects.first(),
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             site=site,
             rack=rack,
             position=43,
@@ -147,7 +147,7 @@ class RackTestCase(TestCase):
         device1 = Device(
             name='TestSwitch1',
             device_type=DeviceType.objects.first(),
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             site=site,
             rack=rack,
             position=10.0,
@@ -189,7 +189,7 @@ class RackTestCase(TestCase):
 
         Device(
             name='Device 1',
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             device_type=DeviceType.objects.first(),
             site=site,
             rack=rack
@@ -202,7 +202,7 @@ class RackTestCase(TestCase):
         rack = Rack.objects.first()
         attrs = {
             'device_type': DeviceType.objects.get(u_height=0.5),
-            'device_role': DeviceRole.objects.first(),
+            'role': DeviceRole.objects.first(),
             'site': Site.objects.first(),
             'rack': rack,
             'face': DeviceFaceChoices.FACE_FRONT,
@@ -228,7 +228,7 @@ class RackTestCase(TestCase):
             site=site_a,
             rack=rack1,
             device_type=DeviceType.objects.first(),
-            device_role=DeviceRole.objects.first()
+            role=DeviceRole.objects.first()
         )
 
         # Move Rack1 to Site B
@@ -244,14 +244,16 @@ class DeviceTestCase(TestCase):
     @classmethod
     def setUpTestData(cls):
 
-        site = Site.objects.create(name='Test Site 1', slug='test-site-1')
+        Site.objects.create(name='Test Site 1', slug='test-site-1')
         manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
         device_type = DeviceType.objects.create(
             manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
         )
-        device_role = DeviceRole.objects.create(
-            name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
+        roles = (
+            DeviceRole(name='Test Role 1', slug='test-role-1'),
+            DeviceRole(name='Test Role 2', slug='test-role-2'),
         )
+        DeviceRole.objects.bulk_create(roles)
 
         # Create DeviceType components
         ConsolePortTemplate(
@@ -319,7 +321,7 @@ class DeviceTestCase(TestCase):
         d = Device(
             site=Site.objects.first(),
             device_type=DeviceType.objects.first(),
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             name='Test Device 1'
         )
         d.save()
@@ -385,7 +387,7 @@ class DeviceTestCase(TestCase):
         device1 = Device(
             site=Site.objects.first(),
             device_type=DeviceType.objects.first(),
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             name=None
         )
         device1.save()
@@ -393,7 +395,7 @@ class DeviceTestCase(TestCase):
         device2 = Device(
             site=device1.site,
             device_type=device1.device_type,
-            device_role=device1.device_role,
+            role=device1.role,
             name=None
         )
         device2.full_clean()
@@ -406,7 +408,7 @@ class DeviceTestCase(TestCase):
         device1 = Device(
             site=Site.objects.first(),
             device_type=DeviceType.objects.first(),
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             name='device 1'
         )
         device1.save()
@@ -414,7 +416,7 @@ class DeviceTestCase(TestCase):
         device2 = Device(
             site=device1.site,
             device_type=device1.device_type,
-            device_role=device1.device_role,
+            role=device1.role,
             name='DEVICE 1'
         )
 
@@ -427,7 +429,7 @@ class DeviceTestCase(TestCase):
         device1 = Device(
             site=Site.objects.first(),
             device_type=DeviceType.objects.first(),
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             name='Test Device 1'
         )
         device1.save()
@@ -435,7 +437,7 @@ class DeviceTestCase(TestCase):
         device2 = Device(
             site=device1.site,
             device_type=device1.device_type,
-            device_role=device1.device_role,
+            role=device1.role,
             name=device1.name
         )
 
@@ -458,6 +460,30 @@ class DeviceTestCase(TestCase):
         device2.full_clean()
         device2.save()
 
+    def test_old_device_role_field(self):
+        """
+        Ensure that the old device role field sets the value in the new role field.
+        """
+
+        # Test getter method
+        device = Device(
+            site=Site.objects.first(),
+            device_type=DeviceType.objects.first(),
+            role=DeviceRole.objects.first(),
+            name='Test Device 1',
+            device_role=DeviceRole.objects.first()
+        )
+        device.full_clean()
+        device.save()
+
+        self.assertEqual(device.role, device.device_role)
+
+        # Test setter method
+        device.device_role = DeviceRole.objects.last()
+        device.full_clean()
+        device.save()
+        self.assertEqual(device.role, device.device_role)
+
 
 class CableTestCase(TestCase):
 
@@ -469,14 +495,14 @@ class CableTestCase(TestCase):
         devicetype = DeviceType.objects.create(
             manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
         )
-        devicerole = DeviceRole.objects.create(
+        role = DeviceRole.objects.create(
             name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
         )
         device1 = Device.objects.create(
-            device_type=devicetype, device_role=devicerole, name='TestDevice1', site=site
+            device_type=devicetype, role=role, name='TestDevice1', site=site
         )
         device2 = Device.objects.create(
-            device_type=devicetype, device_role=devicerole, name='TestDevice2', site=site
+            device_type=devicetype, role=role, name='TestDevice2', site=site
         )
         interface1 = Interface.objects.create(device=device1, name='eth0')
         interface2 = Interface.objects.create(device=device2, name='eth0')
@@ -485,7 +511,7 @@ class CableTestCase(TestCase):
 
         power_port1 = PowerPort.objects.create(device=device2, name='psu1')
         patch_pannel = Device.objects.create(
-            device_type=devicetype, device_role=devicerole, name='TestPatchPanel', site=site
+            device_type=devicetype, role=role, name='TestPatchPanel', site=site
         )
         rear_port1 = RearPort.objects.create(device=patch_pannel, name='RP1', type='8p8c')
         front_port1 = FrontPort.objects.create(
@@ -626,11 +652,11 @@ class VirtualDeviceContextTestCase(TestCase):
         devicetype = DeviceType.objects.create(
             manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
         )
-        devicerole = DeviceRole.objects.create(
+        role = DeviceRole.objects.create(
             name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
         )
         Device.objects.create(
-            device_type=devicetype, device_role=devicerole, name='TestDevice1', site=site
+            device_type=devicetype, role=role, name='TestDevice1', site=site
         )
 
     def test_vdc_and_interface_creation(self):

+ 2 - 2
netbox/dcim/tests/test_natural_ordering.py

@@ -13,11 +13,11 @@ class NaturalOrderingTestCase(TestCase):
         devicetype = DeviceType.objects.create(
             manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
         )
-        devicerole = DeviceRole.objects.create(
+        role = DeviceRole.objects.create(
             name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
         )
         Device.objects.create(
-            device_type=devicetype, device_role=devicerole, name='Test Device 1', site=site
+            device_type=devicetype, role=role, name='Test Device 1', site=site
         )
 
     def test_interface_ordering_numeric(self):

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

@@ -1554,12 +1554,12 @@ class DeviceRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
     @classmethod
     def setUpTestData(cls):
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         tags = create_tags('Alpha', 'Bravo', 'Charlie')
 
@@ -1581,9 +1581,9 @@ class DeviceRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
 
         cls.csv_update_data = (
             "id,name,description",
-            f"{device_roles[0].pk},Device Role 7,New description7",
-            f"{device_roles[1].pk},Device Role 8,New description8",
-            f"{device_roles[2].pk},Device Role 9,New description9",
+            f"{roles[0].pk},Device Role 7,New description7",
+            f"{roles[1].pk},Device Role 8,New description8",
+            f"{roles[2].pk},Device Role 9,New description9",
         )
 
         cls.bulk_edit_data = {
@@ -1665,11 +1665,11 @@ class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase):
         )
         DeviceType.objects.bulk_create(devicetypes)
 
-        deviceroles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
         )
-        DeviceRole.objects.bulk_create(deviceroles)
+        DeviceRole.objects.bulk_create(roles)
 
         platforms = (
             Platform(name='Platform 1', slug='platform-1'),
@@ -1678,9 +1678,9 @@ class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase):
         Platform.objects.bulk_create(platforms)
 
         devices = (
-            Device(name='Device 1', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]),
-            Device(name='Device 2', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]),
-            Device(name='Device 3', site=sites[0], rack=racks[0], device_type=devicetypes[0], device_role=deviceroles[0], platform=platforms[0]),
+            Device(name='Device 1', site=sites[0], rack=racks[0], device_type=devicetypes[0], role=roles[0], platform=platforms[0]),
+            Device(name='Device 2', site=sites[0], rack=racks[0], device_type=devicetypes[0], role=roles[0], platform=platforms[0]),
+            Device(name='Device 3', site=sites[0], rack=racks[0], device_type=devicetypes[0], role=roles[0], platform=platforms[0]),
         )
         Device.objects.bulk_create(devices)
 
@@ -1690,7 +1690,7 @@ class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase):
 
         cls.form_data = {
             'device_type': devicetypes[1].pk,
-            'device_role': deviceroles[1].pk,
+            'role': roles[1].pk,
             'tenant': None,
             'platform': platforms[1].pk,
             'name': 'Device X',
@@ -1715,7 +1715,7 @@ class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase):
         }
 
         cls.csv_data = (
-            "device_role,manufacturer,device_type,status,name,site,location,rack,position,face,virtual_chassis,vc_position,vc_priority",
+            "role,manufacturer,device_type,status,name,site,location,rack,position,face,virtual_chassis,vc_position,vc_priority",
             "Device Role 1,Manufacturer 1,Device Type 1,active,Device 4,Site 1,Location 1,Rack 1,10,front,Virtual Chassis 1,1,10",
             "Device Role 1,Manufacturer 1,Device Type 1,active,Device 5,Site 1,Location 1,Rack 1,20,front,Virtual Chassis 1,2,20",
             "Device Role 1,Manufacturer 1,Device Type 1,active,Device 6,Site 1,Location 1,Rack 1,30,front,Virtual Chassis 1,3,30",
@@ -1730,7 +1730,7 @@ class DeviceTestCase(ViewTestCases.PrimaryObjectViewTestCase):
 
         cls.bulk_edit_data = {
             'device_type': devicetypes[1].pk,
-            'device_role': deviceroles[1].pk,
+            'role': roles[1].pk,
             'tenant': None,
             'platform': platforms[1].pk,
             'serial': '123456',
@@ -2909,14 +2909,14 @@ class CableTestCase(
         site = Site.objects.create(name='Site 1', slug='site-1')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(model='Device Type 1', manufacturer=manufacturer)
-        devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
         vc = VirtualChassis.objects.create(name='Virtual Chassis')
 
         devices = (
-            Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole),
-            Device(name='Device 2', site=site, device_type=devicetype, device_role=devicerole),
-            Device(name='Device 3', site=site, device_type=devicetype, device_role=devicerole),
-            Device(name='Device 4', site=site, device_type=devicetype, device_role=devicerole),
+            Device(name='Device 1', site=site, device_type=devicetype, role=role),
+            Device(name='Device 2', site=site, device_type=devicetype, role=role),
+            Device(name='Device 3', site=site, device_type=devicetype, role=role),
+            Device(name='Device 4', site=site, device_type=devicetype, role=role),
         )
         Device.objects.bulk_create(devices)
 
@@ -3016,23 +3016,23 @@ class VirtualChassisTestCase(ViewTestCases.PrimaryObjectViewTestCase):
         device_type = DeviceType.objects.create(
             manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'
         )
-        device_role = DeviceRole.objects.create(
+        role = DeviceRole.objects.create(
             name='Device Role', slug='device-role-1'
         )
 
         devices = (
-            Device(device_type=device_type, device_role=device_role, name='Device 1', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 2', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 3', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 4', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 5', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 6', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 7', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 8', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 9', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 10', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 11', site=site),
-            Device(device_type=device_type, device_role=device_role, name='Device 12', site=site),
+            Device(device_type=device_type, role=role, name='Device 1', site=site),
+            Device(device_type=device_type, role=role, name='Device 2', site=site),
+            Device(device_type=device_type, role=role, name='Device 3', site=site),
+            Device(device_type=device_type, role=role, name='Device 4', site=site),
+            Device(device_type=device_type, role=role, name='Device 5', site=site),
+            Device(device_type=device_type, role=role, name='Device 6', site=site),
+            Device(device_type=device_type, role=role, name='Device 7', site=site),
+            Device(device_type=device_type, role=role, name='Device 8', site=site),
+            Device(device_type=device_type, role=role, name='Device 9', site=site),
+            Device(device_type=device_type, role=role, name='Device 10', site=site),
+            Device(device_type=device_type, role=role, name='Device 11', site=site),
+            Device(device_type=device_type, role=role, name='Device 12', site=site),
         )
         Device.objects.bulk_create(devices)
 
@@ -3211,11 +3211,11 @@ class PowerFeedTestCase(ViewTestCases.PrimaryObjectViewTestCase):
         device_type = DeviceType.objects.create(
             manufacturer=manufacturer, model='Device Type 1', slug='device-type-1'
         )
-        device_role = DeviceRole.objects.create(
+        role = DeviceRole.objects.create(
             name='Device Role', slug='device-role-1'
         )
         device = Device.objects.create(
-            site=Site.objects.first(), device_type=device_type, device_role=device_role
+            site=Site.objects.first(), device_type=device_type, role=role
         )
 
         powerfeed = PowerFeed.objects.first()

+ 6 - 6
netbox/dcim/views.py

@@ -407,7 +407,7 @@ class SiteView(generic.ObjectView):
             site=instance,
             rack__isnull=True,
             parent_bay__isnull=True
-        ).prefetch_related('device_type__manufacturer', 'parent_bay', 'device_role')
+        ).prefetch_related('device_type__manufacturer', 'parent_bay', 'role')
 
         return {
             'related_models': related_models,
@@ -489,7 +489,7 @@ class LocationView(generic.ObjectView):
             location=instance,
             rack__isnull=True,
             parent_bay__isnull=True
-        ).prefetch_related('device_type__manufacturer', 'parent_bay', 'device_role')
+        ).prefetch_related('device_type__manufacturer', 'parent_bay', 'role')
 
         return {
             'related_models': related_models,
@@ -1721,7 +1721,7 @@ class InventoryItemTemplateBulkDeleteView(generic.BulkDeleteView):
 
 class DeviceRoleListView(generic.ObjectListView):
     queryset = DeviceRole.objects.annotate(
-        device_count=count_related(Device, 'device_role'),
+        device_count=count_related(Device, 'role'),
         vm_count=count_related(VirtualMachine, 'role')
     )
     filterset = filtersets.DeviceRoleFilterSet
@@ -1735,7 +1735,7 @@ class DeviceRoleView(generic.ObjectView):
 
     def get_extra_context(self, request, instance):
         related_models = (
-            (Device.objects.restrict(request.user, 'view').filter(device_role=instance), 'role_id'),
+            (Device.objects.restrict(request.user, 'view').filter(role=instance), 'role_id'),
             (VirtualMachine.objects.restrict(request.user, 'view').filter(role=instance), 'role_id'),
         )
 
@@ -1762,7 +1762,7 @@ class DeviceRoleBulkImportView(generic.BulkImportView):
 
 class DeviceRoleBulkEditView(generic.BulkEditView):
     queryset = DeviceRole.objects.annotate(
-        device_count=count_related(Device, 'device_role'),
+        device_count=count_related(Device, 'role'),
         vm_count=count_related(VirtualMachine, 'role')
     )
     filterset = filtersets.DeviceRoleFilterSet
@@ -1772,7 +1772,7 @@ class DeviceRoleBulkEditView(generic.BulkEditView):
 
 class DeviceRoleBulkDeleteView(generic.BulkDeleteView):
     queryset = DeviceRole.objects.annotate(
-        device_count=count_related(Device, 'device_role'),
+        device_count=count_related(Device, 'role'),
         vm_count=count_related(VirtualMachine, 'role')
     )
     filterset = filtersets.DeviceRoleFilterSet

+ 2 - 3
netbox/extras/querysets.py

@@ -19,8 +19,7 @@ class ConfigContextQuerySet(RestrictedQuerySet):
           aggregate_data: If True, use the JSONBAgg aggregate function to return only the list of JSON data objects
         """
 
-        # `device_role` for Device; `role` for VirtualMachine
-        role = getattr(obj, 'device_role', None) or obj.role
+        role = obj.role
 
         # Device type and location assignment is relevant only for Devices
         device_type = getattr(obj, 'device_type', None)
@@ -121,7 +120,7 @@ class ConfigContextModelQuerySet(RestrictedQuerySet):
         if self.model._meta.model_name == 'device':
             base_query.add((Q(locations=OuterRef('location')) | Q(locations=None)), Q.AND)
             base_query.add((Q(device_types=OuterRef('device_type')) | Q(device_types=None)), Q.AND)
-            base_query.add((Q(roles=OuterRef('device_role')) | Q(roles=None)), Q.AND)
+            base_query.add((Q(roles=OuterRef('role')) | Q(roles=None)), Q.AND)
             base_query.add((Q(sites=OuterRef('site')) | Q(sites=None)), Q.AND)
             region_field = 'site__region'
             sitegroup_field = 'site__group'

+ 2 - 2
netbox/extras/tests/test_api.py

@@ -579,9 +579,9 @@ class ConfigContextTest(APIViewTestCases.APIViewTestCase):
         """
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
-        devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
         site = Site.objects.create(name='Site-1', slug='site-1')
-        device = Device.objects.create(name='Device 1', device_type=devicetype, device_role=devicerole, site=site)
+        device = Device.objects.create(name='Device 1', device_type=devicetype, role=role, site=site)
 
         # Test default config contexts (created at test setup)
         rendered_context = device.get_config_context()

+ 5 - 5
netbox/extras/tests/test_models.py

@@ -44,7 +44,7 @@ class ConfigContextTest(TestCase):
 
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1', slug='device-type-1')
-        devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
         region = Region.objects.create(name='Region')
         sitegroup = SiteGroup.objects.create(name='Site Group')
         site = Site.objects.create(name='Site 1', slug='site-1', region=region, group=sitegroup)
@@ -58,7 +58,7 @@ class ConfigContextTest(TestCase):
         Device.objects.create(
             name='Device 1',
             device_type=devicetype,
-            device_role=devicerole,
+            role=role,
             site=site,
             location=location
         )
@@ -252,7 +252,7 @@ class ConfigContextTest(TestCase):
             location=location,
             tenant=tenant,
             platform=platform,
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             device_type=DeviceType.objects.first()
         )
         device.tags.add(tag)
@@ -382,7 +382,7 @@ class ConfigContextTest(TestCase):
             site=site,
             tenant=tenant,
             platform=platform,
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             device_type=DeviceType.objects.first()
         )
         device.tags.set(tags)
@@ -430,7 +430,7 @@ class ConfigContextTest(TestCase):
             site=site,
             tenant=tenant,
             platform=platform,
-            device_role=DeviceRole.objects.first(),
+            role=DeviceRole.objects.first(),
             device_type=DeviceType.objects.first()
         )
         device.tags.set([tag1, tag2])

+ 3 - 3
netbox/ipam/tests/test_api.py

@@ -1009,11 +1009,11 @@ class ServiceTest(APIViewTestCases.APIViewTestCase):
         site = Site.objects.create(name='Site 1', slug='site-1')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1')
-        devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
 
         devices = (
-            Device(name='Device 1', site=site, device_type=devicetype, device_role=devicerole),
-            Device(name='Device 2', site=site, device_type=devicetype, device_role=devicerole),
+            Device(name='Device 1', site=site, device_type=devicetype, role=role),
+            Device(name='Device 2', site=site, device_type=devicetype, role=role),
         )
         Device.objects.bulk_create(devices)
 

+ 12 - 12
netbox/ipam/tests/test_filtersets.py

@@ -825,12 +825,12 @@ class IPAddressTestCase(TestCase, ChangeLoggedFilterSetTests):
         site = Site.objects.create(name='Site 1', slug='site-1')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1')
-        device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
 
         devices = (
-            Device(device_type=device_type, name='Device 1', site=site, device_role=device_role),
-            Device(device_type=device_type, name='Device 2', site=site, device_role=device_role),
-            Device(device_type=device_type, name='Device 3', site=site, device_role=device_role),
+            Device(device_type=device_type, name='Device 1', site=site, role=role),
+            Device(device_type=device_type, name='Device 2', site=site, role=role),
+            Device(device_type=device_type, name='Device 3', site=site, role=role),
         )
         Device.objects.bulk_create(devices)
 
@@ -1282,11 +1282,11 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests):
 
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1')
-        device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
         devices = (
-            Device(name='Device 1', site=sites[0], location=locations[0], rack=racks[0], device_type=device_type, device_role=device_role),
-            Device(name='Device 2', site=sites[1], location=locations[1], rack=racks[1], device_type=device_type, device_role=device_role),
-            Device(name='Device 3', site=sites[2], location=locations[2], rack=racks[2], device_type=device_type, device_role=device_role),
+            Device(name='Device 1', site=sites[0], location=locations[0], rack=racks[0], device_type=device_type, role=role),
+            Device(name='Device 2', site=sites[1], location=locations[1], rack=racks[1], device_type=device_type, role=role),
+            Device(name='Device 3', site=sites[2], location=locations[2], rack=racks[2], device_type=device_type, role=role),
         )
         Device.objects.bulk_create(devices)
 
@@ -1516,12 +1516,12 @@ class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests):
         site = Site.objects.create(name='Site 1', slug='site-1')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1')
-        device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
 
         devices = (
-            Device(device_type=device_type, name='Device 1', site=site, device_role=device_role),
-            Device(device_type=device_type, name='Device 2', site=site, device_role=device_role),
-            Device(device_type=device_type, name='Device 3', site=site, device_role=device_role),
+            Device(device_type=device_type, name='Device 1', site=site, role=role),
+            Device(device_type=device_type, name='Device 2', site=site, role=role),
+            Device(device_type=device_type, name='Device 3', site=site, role=role),
         )
         Device.objects.bulk_create(devices)
 

+ 2 - 2
netbox/ipam/tests/test_models.py

@@ -549,12 +549,12 @@ class TestL2VPNTermination(TestCase):
         site = Site.objects.create(name='Site 1')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1')
         device_type = DeviceType.objects.create(model='Device Type 1', manufacturer=manufacturer)
-        device_role = DeviceRole.objects.create(name='Switch')
+        role = DeviceRole.objects.create(name='Switch')
         device = Device.objects.create(
             name='Device 1',
             site=site,
             device_type=device_type,
-            device_role=device_role,
+            role=role,
             status='active'
         )
 

+ 2 - 2
netbox/ipam/tests/test_views.py

@@ -909,8 +909,8 @@ class ServiceTestCase(ViewTestCases.PrimaryObjectViewTestCase):
         site = Site.objects.create(name='Site 1', slug='site-1')
         manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1')
         devicetype = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1')
-        devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
-        device = Device.objects.create(name='Device 1', site=site, device_type=devicetype, device_role=devicerole)
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        device = Device.objects.create(name='Device 1', site=site, device_type=devicetype, role=role)
 
         services = (
             Service(device=device, name='Service 1', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[101]),

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

@@ -202,7 +202,7 @@
                         </tr>
                         <tr>
                             <th scope="row">{% trans "Role" %}</th>
-                            <td>{{ object.device_role|linkify }}</td>
+                            <td>{{ object.role|linkify }}</td>
                         </tr>
                         <tr>
                             <th scope="row">{% trans "Platform" %}</th>

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

@@ -10,7 +10,7 @@
         <h5 class="offset-sm-3">{% trans "Device" %}</h5>
       </div>
       {% render_field form.name %}
-      {% render_field form.device_role %}
+      {% render_field form.role %}
       {% render_field form.description %}
       {% render_field form.tags %}
     </div>

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

@@ -10,7 +10,7 @@
 
 {% block extra_controls %}
   {% if perms.dcim.add_device %}
-    <a href="{% url 'dcim:device_add' %}?device_role={{ object.pk }}" class="btn btn-sm btn-primary">
+    <a href="{% url 'dcim:device_add' %}?role={{ object.pk }}" class="btn btn-sm btn-primary">
       <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Device" %}
     </a>
   {% endif %}

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

@@ -19,7 +19,7 @@
                 <td>
                     <a href="{% url 'dcim:device' pk=device.pk %}">{{ device }}</a>
                 </td>
-                <td>{{ device.device_role }}</td>
+                <td>{{ device.role }}</td>
                 <td>{{ device.device_type }}</td>
                 {% if device.parent_bay %}
                     <td>{{ device.parent_bay.device|linkify }}</td>

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

@@ -13,7 +13,7 @@
 
 {% block extra_controls %}
   {% if perms.dcim.add_device %}
-    <a href="{% url 'dcim:device_add' %}?device_role={{ object.pk }}" class="btn btn-sm btn-primary">
+    <a href="{% url 'dcim:device_add' %}?role={{ object.pk }}" class="btn btn-sm btn-primary">
       <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Device" %}
     </a>
   {% endif %}

+ 1 - 1
netbox/utilities/testing/utils.py

@@ -44,7 +44,7 @@ def create_test_device(name, site=None, **attrs):
     manufacturer, _ = Manufacturer.objects.get_or_create(name='Manufacturer 1', slug='manufacturer-1')
     devicetype, _ = DeviceType.objects.get_or_create(model='Device Type 1', manufacturer=manufacturer)
     devicerole, _ = DeviceRole.objects.get_or_create(name='Device Role 1', slug='device-role-1')
-    device = Device.objects.create(name=name, site=site, device_type=devicetype, device_role=devicerole, **attrs)
+    device = Device.objects.create(name=name, site=site, device_type=devicetype, role=devicerole, **attrs)
 
     return device
 

+ 5 - 5
netbox/utilities/tests/test_filters.py

@@ -360,12 +360,12 @@ class DynamicFilterLookupExpressionTest(TestCase):
         )
         DeviceType.objects.bulk_create(device_types)
 
-        device_roles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
             DeviceRole(name='Device Role 3', slug='device-role-3'),
         )
-        DeviceRole.objects.bulk_create(device_roles)
+        DeviceRole.objects.bulk_create(roles)
 
         platforms = (
             Platform(name='Platform 1', slug='platform-1'),
@@ -401,9 +401,9 @@ class DynamicFilterLookupExpressionTest(TestCase):
         Rack.objects.bulk_create(racks)
 
         devices = (
-            Device(name='Device 1', device_type=device_types[0], device_role=device_roles[0], platform=platforms[0], serial='ABC', asset_tag='1001', site=sites[0], rack=racks[0], position=1, face=DeviceFaceChoices.FACE_FRONT, status=DeviceStatusChoices.STATUS_ACTIVE, local_context_data={"foo": 123}),
-            Device(name='Device 2', device_type=device_types[1], device_role=device_roles[1], platform=platforms[1], serial='DEF', asset_tag='1002', site=sites[1], rack=racks[1], position=2, face=DeviceFaceChoices.FACE_FRONT, status=DeviceStatusChoices.STATUS_STAGED),
-            Device(name='Device 3', device_type=device_types[2], device_role=device_roles[2], platform=platforms[2], serial='GHI', asset_tag='1003', site=sites[2], rack=racks[2], position=3, face=DeviceFaceChoices.FACE_REAR, status=DeviceStatusChoices.STATUS_FAILED),
+            Device(name='Device 1', device_type=device_types[0], role=roles[0], platform=platforms[0], serial='ABC', asset_tag='1001', site=sites[0], rack=racks[0], position=1, face=DeviceFaceChoices.FACE_FRONT, status=DeviceStatusChoices.STATUS_ACTIVE, local_context_data={"foo": 123}),
+            Device(name='Device 2', device_type=device_types[1], role=roles[1], platform=platforms[1], serial='DEF', asset_tag='1002', site=sites[1], rack=racks[1], position=2, face=DeviceFaceChoices.FACE_FRONT, status=DeviceStatusChoices.STATUS_STAGED),
+            Device(name='Device 3', device_type=device_types[2], role=roles[2], platform=platforms[2], serial='GHI', asset_tag='1003', site=sites[2], rack=racks[2], position=3, face=DeviceFaceChoices.FACE_REAR, status=DeviceStatusChoices.STATUS_FAILED),
         )
         Device.objects.bulk_create(devices)
 

+ 10 - 10
netbox/virtualization/tests/test_views.py

@@ -180,11 +180,11 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase):
     @classmethod
     def setUpTestData(cls):
 
-        deviceroles = (
+        roles = (
             DeviceRole(name='Device Role 1', slug='device-role-1'),
             DeviceRole(name='Device Role 2', slug='device-role-2'),
         )
-        DeviceRole.objects.bulk_create(deviceroles)
+        DeviceRole.objects.bulk_create(roles)
 
         platforms = (
             Platform(name='Platform 1', slug='platform-1'),
@@ -212,9 +212,9 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase):
         )
 
         virtual_machines = (
-            VirtualMachine(name='Virtual Machine 1', site=sites[0], cluster=clusters[0], device=devices[0], role=deviceroles[0], platform=platforms[0]),
-            VirtualMachine(name='Virtual Machine 2', site=sites[0], cluster=clusters[0], device=devices[0], role=deviceroles[0], platform=platforms[0]),
-            VirtualMachine(name='Virtual Machine 3', site=sites[0], cluster=clusters[0], device=devices[0], role=deviceroles[0], platform=platforms[0]),
+            VirtualMachine(name='Virtual Machine 1', site=sites[0], cluster=clusters[0], device=devices[0], role=roles[0], platform=platforms[0]),
+            VirtualMachine(name='Virtual Machine 2', site=sites[0], cluster=clusters[0], device=devices[0], role=roles[0], platform=platforms[0]),
+            VirtualMachine(name='Virtual Machine 3', site=sites[0], cluster=clusters[0], device=devices[0], role=roles[0], platform=platforms[0]),
         )
         VirtualMachine.objects.bulk_create(virtual_machines)
 
@@ -228,7 +228,7 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase):
             'platform': platforms[1].pk,
             'name': 'Virtual Machine X',
             'status': VirtualMachineStatusChoices.STATUS_STAGED,
-            'role': deviceroles[1].pk,
+            'role': roles[1].pk,
             'primary_ip4': None,
             'primary_ip6': None,
             'vcpus': 4,
@@ -260,7 +260,7 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase):
             'tenant': None,
             'platform': platforms[1].pk,
             'status': VirtualMachineStatusChoices.STATUS_STAGED,
-            'role': deviceroles[1].pk,
+            'role': roles[1].pk,
             'vcpus': 8,
             'memory': 65535,
             'disk': 8000,
@@ -289,12 +289,12 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase):
     def setUpTestData(cls):
 
         site = Site.objects.create(name='Site 1', slug='site-1')
-        devicerole = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
+        role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1')
         clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1')
         cluster = Cluster.objects.create(name='Cluster 1', type=clustertype, site=site)
         virtualmachines = (
-            VirtualMachine(name='Virtual Machine 1', site=site, cluster=cluster, role=devicerole),
-            VirtualMachine(name='Virtual Machine 2', site=site, cluster=cluster, role=devicerole),
+            VirtualMachine(name='Virtual Machine 1', site=site, cluster=cluster, role=role),
+            VirtualMachine(name='Virtual Machine 2', site=site, cluster=cluster, role=role),
         )
         VirtualMachine.objects.bulk_create(virtualmachines)