Skip to content

Commit 7549106

Browse files
[BUGFIX] Fix deleting projects without farm #659
2 parents 769bf18 + e4f3dd5 commit 7549106

File tree

4 files changed

+31
-13
lines changed

4 files changed

+31
-13
lines changed

promgen/management/commands/register-host.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def add_arguments(self, parser):
1818
parser.add_argument("host", help=help_text("name"))
1919

2020
def handle(self, project, **kwargs):
21-
if getattr(project, "farm", None) is None:
21+
if not hasattr(project, "farm"):
2222
raise CommandError("Project currently not associated with a farm :%s" % project)
2323

2424
host, created = project.farm.host_set.get_or_create(name=kwargs["host"])

promgen/prometheus.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def render_config(service=None, project=None):
107107
"project__shard",
108108
"project",
109109
):
110-
if getattr(exporter.project, "farm", None) is None:
110+
if not hasattr(exporter.project, "farm"):
111111
continue
112112
if service and exporter.project.service.name != service.name:
113113
continue

promgen/signals.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -224,28 +224,22 @@ def delete_farm(sender, instance, **kwargs):
224224
@skip_raw
225225
def save_exporter(sender, instance, **kwargs):
226226
"""Only trigger write if parent project also has hosts"""
227-
if (
228-
getattr(instance.project, "farm", None) is not None
229-
and instance.project.farm.host_set.exists()
230-
):
227+
if hasattr(instance.project, "farm") and instance.project.farm.host_set.exists():
231228
trigger_write_config.send(instance)
232229

233230

234231
@receiver(pre_delete, sender=models.Exporter)
235232
def delete_exporter(sender, instance, **kwargs):
236233
"""Only trigger write if parent project also has hosts"""
237-
if (
238-
getattr(instance.project, "farm", None) is not None
239-
and instance.project.farm.host_set.exists()
240-
):
234+
if hasattr(instance.project, "farm") and instance.project.farm.host_set.exists():
241235
trigger_write_config.send(instance)
242236

243237

244238
@receiver(post_save, sender=models.Project)
245239
@skip_raw
246240
def save_project(instance, **kwargs):
247241
if (
248-
getattr(instance, "farm", None) is not None
242+
hasattr(instance, "farm")
249243
and instance.farm.host_set.exists()
250244
and instance.exporter_set.exists()
251245
):
@@ -255,7 +249,11 @@ def save_project(instance, **kwargs):
255249

256250
@receiver(pre_delete, sender=models.Project)
257251
def delete_project(sender, instance, **kwargs):
258-
if instance.farm and instance.farm.host_set.exists() and instance.exporter_set.exists():
252+
if (
253+
hasattr(instance, "farm")
254+
and instance.farm.host_set.exists()
255+
and instance.exporter_set.exists()
256+
):
259257
trigger_write_config.send(instance)
260258

261259

promgen/tests/test_web.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# These sources are released under the terms of the MIT license: see LICENSE
33
from django.urls import reverse
44

5-
from promgen import tests, views
5+
from promgen import models, tests, views
66

77

88
class WebTests(tests.PromgenTest):
@@ -48,3 +48,23 @@ def test_routes(self):
4848
with self.subTest(viewname=viewname, params=params):
4949
response = self.client.get(reverse(viewname, kwargs=params))
5050
self.assertRoute(response, viewclass, status_code)
51+
52+
def test_delete_project_without_farm(self):
53+
# Create a project without associating it with a farm
54+
shard = models.Shard.objects.get(pk=1)
55+
service = models.Service.objects.get(pk=1)
56+
project = models.Project.objects.create(
57+
name="test delete project",
58+
owner=self.user,
59+
service=service,
60+
shard=shard,
61+
)
62+
63+
self.assertFalse(hasattr(project, "farm"))
64+
65+
# Attempt to delete the project
66+
response = self.client.post(reverse("project-delete", kwargs={"pk": project.pk}))
67+
68+
# Assert the project is deleted successfully
69+
self.assertEqual(response.status_code, 302)
70+
self.assertFalse(models.Project.objects.filter(pk=project.pk).exists())

0 commit comments

Comments
 (0)