Skip to content

Commit 1b6c539

Browse files
committed
fix repo/mirror bulk delete bug
1 parent d1119d6 commit 1b6c539

2 files changed

Lines changed: 116 additions & 2 deletions

File tree

repos/tests/test_views.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
from django.contrib.auth.models import User
2+
from django.test import TestCase, override_settings
3+
from django.urls import reverse
4+
5+
from arch.models import MachineArchitecture
6+
from repos.models import Mirror, Repository
7+
8+
9+
@override_settings(
10+
CELERY_TASK_ALWAYS_EAGER=True,
11+
CACHES={'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
12+
)
13+
class RepoBulkActionTests(TestCase):
14+
"""Tests for repo_bulk_action view."""
15+
16+
def setUp(self):
17+
self.user = User.objects.create_user(
18+
username='testuser', password='testpass'
19+
)
20+
self.client.login(username='testuser', password='testpass')
21+
self.arch = MachineArchitecture.objects.create(name='x86_64')
22+
self.repos = []
23+
for i in range(3):
24+
self.repos.append(Repository.objects.create(
25+
name=f'repo-{i}',
26+
arch=self.arch,
27+
repotype='D',
28+
enabled=True,
29+
))
30+
31+
def test_bulk_delete_selected(self):
32+
"""Test bulk delete with individually selected repos."""
33+
ids = [str(r.id) for r in self.repos[:2]]
34+
resp = self.client.post(reverse('repos:repo_bulk_action'), {
35+
'action': 'delete',
36+
'selected_ids': ids,
37+
})
38+
self.assertEqual(resp.status_code, 302)
39+
self.assertEqual(Repository.objects.count(), 1)
40+
41+
def test_bulk_delete_select_all_filtered(self):
42+
"""Test bulk delete with select-all-filtered (uses .distinct())."""
43+
resp = self.client.post(reverse('repos:repo_bulk_action'), {
44+
'action': 'delete',
45+
'select_all_filtered': '1',
46+
'filter_params': '',
47+
})
48+
self.assertEqual(resp.status_code, 302)
49+
self.assertEqual(Repository.objects.count(), 0)
50+
51+
def test_bulk_enable_disable(self):
52+
"""Test bulk enable/disable actions."""
53+
ids = [str(r.id) for r in self.repos]
54+
self.client.post(reverse('repos:repo_bulk_action'), {
55+
'action': 'disable',
56+
'selected_ids': ids,
57+
})
58+
self.assertTrue(all(
59+
not r.enabled for r in Repository.objects.all()
60+
))
61+
self.client.post(reverse('repos:repo_bulk_action'), {
62+
'action': 'enable',
63+
'selected_ids': ids,
64+
})
65+
self.assertTrue(all(
66+
r.enabled for r in Repository.objects.all()
67+
))
68+
69+
70+
@override_settings(
71+
CELERY_TASK_ALWAYS_EAGER=True,
72+
CACHES={'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
73+
)
74+
class MirrorBulkActionTests(TestCase):
75+
"""Tests for mirror_bulk_action view."""
76+
77+
def setUp(self):
78+
self.user = User.objects.create_user(
79+
username='testuser', password='testpass'
80+
)
81+
self.client.login(username='testuser', password='testpass')
82+
self.arch = MachineArchitecture.objects.create(name='x86_64')
83+
self.repo = Repository.objects.create(
84+
name='repo-0',
85+
arch=self.arch,
86+
repotype='D',
87+
enabled=True,
88+
)
89+
self.mirrors = []
90+
for i in range(3):
91+
self.mirrors.append(Mirror.objects.create(
92+
repo=self.repo,
93+
url=f'http://mirror{i}.example.com/repo',
94+
))
95+
96+
def test_bulk_delete_select_all_filtered(self):
97+
"""Test bulk delete mirrors with select-all-filtered (uses .distinct())."""
98+
resp = self.client.post(reverse('repos:mirror_bulk_action'), {
99+
'action': 'delete',
100+
'select_all_filtered': '1',
101+
'filter_params': '',
102+
})
103+
self.assertEqual(resp.status_code, 302)
104+
self.assertEqual(Mirror.objects.count(), 0)
105+
106+
def test_bulk_delete_selected(self):
107+
"""Test bulk delete with individually selected mirrors."""
108+
ids = [str(m.id) for m in self.mirrors[:2]]
109+
resp = self.client.post(reverse('repos:mirror_bulk_action'), {
110+
'action': 'delete',
111+
'selected_ids': ids,
112+
})
113+
self.assertEqual(resp.status_code, 302)
114+
self.assertEqual(Mirror.objects.count(), 1)

repos/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ def repo_bulk_action(request):
491491
refresh_repo.delay(repo.id)
492492
messages.success(request, f'Queued {count} {name} for refresh')
493493
elif action == 'delete':
494-
repos.delete()
494+
Repository.objects.filter(pk__in=repos.values_list('pk', flat=True)).delete()
495495
messages.success(request, f'Deleted {count} {name}')
496496
else:
497497
messages.warning(request, 'Invalid action')
@@ -574,7 +574,7 @@ def mirror_bulk_action(request):
574574
mirrors.update(refresh=False)
575575
messages.success(request, f'Disabled refresh for {count} {name}')
576576
elif action == 'delete':
577-
mirrors.delete()
577+
Mirror.objects.filter(pk__in=mirrors.values_list('pk', flat=True)).delete()
578578
messages.success(request, f'Deleted {count} {name}')
579579
else:
580580
messages.warning(request, 'Invalid action')

0 commit comments

Comments
 (0)