diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 3ad4ced91..1ea789068 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -470,8 +470,8 @@ class ModuleTypeImportForm(NetBoxModelImportForm): class Meta: model = ModuleType fields = [ - 'manufacturer', 'model', 'part_number', 'description', 'airflow', 'weight', 'weight_unit', 'comments', - 'tags', + 'manufacturer', 'model', 'part_number', 'description', 'airflow', 'weight', 'weight_unit', 'profile', + 'comments', 'tags' ] diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index f0007f612..7eda9ef4d 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -3,7 +3,7 @@ from decimal import Decimal from zoneinfo import ZoneInfo import yaml -from django.test import override_settings +from django.test import override_settings, tag from django.urls import reverse from netaddr import EUI @@ -1000,18 +1000,7 @@ inventory-items: self.assertEqual(response.get('Content-Type'), 'text/csv; charset=utf-8') -# TODO: Change base class to PrimaryObjectViewTestCase -# Blocked by absence of bulk import view for ModuleTypes -class ModuleTypeTestCase( - ViewTestCases.GetObjectViewTestCase, - ViewTestCases.GetObjectChangelogViewTestCase, - ViewTestCases.CreateObjectViewTestCase, - ViewTestCases.EditObjectViewTestCase, - ViewTestCases.DeleteObjectViewTestCase, - ViewTestCases.ListObjectsViewTestCase, - ViewTestCases.BulkEditObjectsViewTestCase, - ViewTestCases.BulkDeleteObjectsViewTestCase -): +class ModuleTypeTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = ModuleType @classmethod @@ -1023,7 +1012,7 @@ class ModuleTypeTestCase( ) Manufacturer.objects.bulk_create(manufacturers) - ModuleType.objects.bulk_create([ + module_types = ModuleType.objects.bulk_create([ ModuleType(model='Module Type 1', manufacturer=manufacturers[0]), ModuleType(model='Module Type 2', manufacturer=manufacturers[0]), ModuleType(model='Module Type 3', manufacturer=manufacturers[0]), @@ -1031,6 +1020,8 @@ class ModuleTypeTestCase( tags = create_tags('Alpha', 'Bravo', 'Charlie') + fan_module_type_profile = ModuleTypeProfile.objects.get(name='Fan') + cls.form_data = { 'manufacturer': manufacturers[1].pk, 'model': 'Device Type X', @@ -1044,6 +1035,70 @@ class ModuleTypeTestCase( 'part_number': '456DEF', } + cls.csv_data = ( + "manufacturer,model,part_number,comments,profile", + f"Manufacturer 1,fan0,generic-fan,,{fan_module_type_profile.name}" + ) + + cls.csv_update_data = ( + "id,model", + f"{module_types[0].id},test model", + ) + + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_bulk_update_objects_with_permission(self): + self.add_permissions( + 'dcim.add_consoleporttemplate', + 'dcim.add_consoleserverporttemplate', + 'dcim.add_powerporttemplate', + 'dcim.add_poweroutlettemplate', + 'dcim.add_interfacetemplate', + 'dcim.add_frontporttemplate', + 'dcim.add_rearporttemplate', + 'dcim.add_modulebaytemplate', + ) + + # run base test + super().test_bulk_update_objects_with_permission() + + @tag('regression') + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) + def test_bulk_import_objects_with_permission(self): + self.add_permissions( + 'dcim.add_consoleporttemplate', + 'dcim.add_consoleserverporttemplate', + 'dcim.add_powerporttemplate', + 'dcim.add_poweroutlettemplate', + 'dcim.add_interfacetemplate', + 'dcim.add_frontporttemplate', + 'dcim.add_rearporttemplate', + 'dcim.add_modulebaytemplate', + ) + + # run base test + super().test_bulk_import_objects_with_permission() + + # TODO: remove extra regression asserts once parent test supports testing all import fields + fan_module_type = ModuleType.objects.get(part_number='generic-fan') + fan_module_type_profile = ModuleTypeProfile.objects.get(name='Fan') + + assert fan_module_type.profile == fan_module_type_profile + + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) + def test_bulk_import_objects_with_constrained_permission(self): + self.add_permissions( + 'dcim.add_consoleporttemplate', + 'dcim.add_consoleserverporttemplate', + 'dcim.add_powerporttemplate', + 'dcim.add_poweroutlettemplate', + 'dcim.add_interfacetemplate', + 'dcim.add_frontporttemplate', + 'dcim.add_rearporttemplate', + 'dcim.add_modulebaytemplate', + ) + + super().test_bulk_import_objects_with_constrained_permission() + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_moduletype_consoleports(self): moduletype = ModuleType.objects.first()