Skip to content

Commit 8c3439a

Browse files
committed
Remove image perms on job deletion
1 parent d122580 commit 8c3439a

2 files changed

Lines changed: 48 additions & 8 deletions

File tree

app/grandchallenge/algorithms/signals.py

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from django.db.models.signals import m2m_changed
1+
from django.db.models.signals import m2m_changed, pre_delete
22
from django.dispatch import receiver
33
from guardian.shortcuts import assign_perm, remove_perm
44

@@ -59,6 +59,17 @@ def update_input_image_permissions(
5959
)
6060

6161

62+
def _get_image_civs(*, jobs):
63+
queryset = ComponentInterfaceValue.objects.filter(
64+
image__isnull=False
65+
).select_related("image")
66+
67+
input_civs = queryset.filter(algorithms_jobs_as_input__in=jobs)
68+
output_civs = queryset.filter(algorithms_jobs_as_output__in=jobs)
69+
70+
return {*input_civs, *output_civs}
71+
72+
6273
def _update_image_permissions(
6374
*, jobs, component_interface_values, exclude_jobs: bool
6475
):
@@ -96,17 +107,23 @@ def update_group_permissions(
96107
for group in groups:
97108
operation("view_job", group, job)
98109

99-
queryset = ComponentInterfaceValue.objects.filter(
100-
image__isnull=False
101-
).select_related("image")
110+
component_interface_values = _get_image_civs(jobs=jobs)
111+
112+
_update_image_permissions(
113+
jobs=jobs,
114+
component_interface_values=component_interface_values,
115+
exclude_jobs=action == "pre_clear",
116+
)
102117

103-
input_civs = queryset.filter(algorithms_jobs_as_input__in=jobs)
104-
output_civs = queryset.filter(algorithms_jobs_as_output__in=jobs)
105118

106-
component_interface_values = {*input_civs, *output_civs}
119+
@receiver(pre_delete, sender=Job)
120+
def update_permissions_on_job_deletion(*_, instance: Job, signal, **__):
121+
jobs = [instance]
122+
123+
component_interface_values = _get_image_civs(jobs=jobs)
107124

108125
_update_image_permissions(
109126
jobs=jobs,
110127
component_interface_values=component_interface_values,
111-
exclude_jobs=action == "pre_clear",
128+
exclude_jobs=signal == pre_delete,
112129
)

app/tests/algorithms_tests/test_signals.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import pytest
2+
from django.contrib.auth.models import Group
23
from guardian.shortcuts import get_perms
34

45
from tests.algorithms_tests.factories import AlgorithmJobFactory
56
from tests.algorithms_tests.utils import TwoAlgorithms
67
from tests.components_tests.factories import ComponentInterfaceValueFactory
8+
from tests.evaluation_tests.test_permissions import get_groups_with_set_perms
79
from tests.factories import GroupFactory, ImageFactory, UserFactory
810
from tests.utils import get_view_for_user
911

@@ -287,3 +289,24 @@ def test_group_clearing(self, reverse):
287289
assert "view_job" not in get_perms(group, job)
288290
assert "view_image" not in get_perms(group, civ_in.image)
289291
assert "view_image" not in get_perms(group, civ_out.image)
292+
293+
294+
@pytest.mark.django_db
295+
def test_permissions_removed_on_job_deletion(settings):
296+
job = AlgorithmJobFactory(time_limit=60, public=True)
297+
image = ImageFactory()
298+
299+
job.inputs.add(ComponentInterfaceValueFactory(image=image))
300+
301+
reg_and_anon = Group.objects.get(
302+
name=settings.REGISTERED_AND_ANON_USERS_GROUP_NAME
303+
)
304+
305+
assert get_groups_with_set_perms(image) == {
306+
reg_and_anon: {"view_image"},
307+
job.viewers: {"view_image"},
308+
}
309+
310+
job.delete()
311+
312+
assert get_groups_with_set_perms(image) == {}

0 commit comments

Comments
 (0)