diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index a9797b59e..be4de06eb 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -497,10 +497,9 @@ class SiteTestCase(APIViewTestCases.APIViewTestCase): results_by_id = {r['id']: r for r in response.data['results']} self.assertIn(site1.pk, results_by_id) self.assertIn(site2.pk, results_by_id) - # Site 1 (no dependents) would have succeeded - self.assertEqual(results_by_id[site1.pk]['status'], 'ok') - # Site 2 (has Device) should have failed - self.assertEqual(results_by_id[site2.pk]['status'], 'error') + # Site 1 (no dependents) would have succeeded — no errors key + self.assertNotIn('errors', results_by_id[site1.pk]) + # Site 2 (has Device) should have failed — errors key present self.assertIn('errors', results_by_id[site2.pk]) # Verify that no sites were actually deleted (transaction rolled back) @@ -2233,12 +2232,11 @@ class DeviceTestCase(APIViewTestCases.APIViewTestCase): self.assertIn('detail', response.data) self.assertIn('results', response.data) self.assertEqual(len(response.data['results']), 2) - # First item passed validation + # First item passed validation — no errors key self.assertEqual(response.data['results'][0]['index'], 0) - self.assertEqual(response.data['results'][0]['status'], 'ok') - # Second item failed validation + self.assertNotIn('errors', response.data['results'][0]) + # Second item failed validation — errors key present self.assertEqual(response.data['results'][1]['index'], 1) - self.assertEqual(response.data['results'][1]['status'], 'error') self.assertIn('errors', response.data['results'][1]) diff --git a/netbox/netbox/api/viewsets/mixins.py b/netbox/netbox/api/viewsets/mixins.py index c1a3145f6..0ad7c5295 100644 --- a/netbox/netbox/api/viewsets/mixins.py +++ b/netbox/netbox/api/viewsets/mixins.py @@ -183,9 +183,9 @@ class SequentialBulkCreatesMixin: # All creates are rolled back together if any item in the batch fails. self.perform_create(serializer) return_data.append(serializer.data) - results.append({'index': i, 'status': 'ok'}) + results.append({'index': i}) else: - results.append({'index': i, 'status': 'error', 'errors': serializer.errors}) + results.append({'index': i, 'errors': serializer.errors}) error_count += 1 if error_count: @@ -288,9 +288,9 @@ class BulkUpdateModelMixin: if serializer.is_valid(): self.perform_update(serializer) updated_pks.append(obj.pk) - results.append({'id': obj.pk, 'status': 'ok'}) + results.append({'id': obj.pk}) else: - results.append({'id': obj.pk, 'status': 'error', 'errors': serializer.errors}) + results.append({'id': obj.pk, 'errors': serializer.errors}) error_count += 1 if error_count: transaction.set_rollback(True) @@ -378,7 +378,7 @@ class BulkDestroyModelMixin: pk = obj.pk # Django sets obj.pk = None after deletion; capture it first try: self.perform_destroy(obj) - results.append({'id': pk, 'status': 'ok'}) + results.append({'id': pk}) except (ProtectedError, RestrictedError) as e: protected = list( e.protected_objects if isinstance(e, ProtectedError) else e.restricted_objects @@ -388,7 +388,6 @@ class BulkDestroyModelMixin: # the caller may not have permission to view. results.append({ 'id': pk, - 'status': 'error', 'errors': { 'detail': _( 'Unable to delete: {n} dependent object(s) prevent deletion.' diff --git a/netbox/utilities/testing/api.py b/netbox/utilities/testing/api.py index 99ea69a39..1a651b163 100644 --- a/netbox/utilities/testing/api.py +++ b/netbox/utilities/testing/api.py @@ -579,9 +579,8 @@ class APIViewTestCases: self.assertIn('results', response.data) self.assertEqual(len(response.data['results']), 2) self.assertEqual(response.data['results'][0]['id'], id_list[0]) - self.assertEqual(response.data['results'][0]['status'], 'ok') + self.assertNotIn('errors', response.data['results'][0]) self.assertEqual(response.data['results'][1]['id'], id_list[1]) - self.assertEqual(response.data['results'][1]['status'], 'error') self.assertIn('errors', response.data['results'][1]) # Verify atomicity: object 0 passed validation but must not have been modified