Drop explicit status key from bulk operation results
Success is now inferred from the absence of an errors key, matching
Jeremy's suggestion. Error entries carry only {id/index, errors};
successful entries carry only {id/index}. Update all tests accordingly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
3c77972f59
commit
48e08779d1
|
|
@ -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])
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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.'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue