Skip to content

Commit 0e5b012

Browse files
committed
Remove use of on_commit
1 parent 67c0733 commit 0e5b012

2 files changed

Lines changed: 65 additions & 13 deletions

File tree

app/grandchallenge/archives/signals.py

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,42 @@
11
from django.db.models.signals import m2m_changed, post_save, pre_delete
22
from django.db.transaction import on_commit
33
from django.dispatch import receiver
4+
from guardian.shortcuts import assign_perm
45

56
from grandchallenge.archives.models import ArchiveItem
67
from grandchallenge.cases.models import Image
78

89

910
@receiver(m2m_changed, sender=ArchiveItem.values.through)
1011
def update_permissions_on_archive_item_changed(
11-
instance, action, reverse, pk_set, **_
12+
*, instance, action, reverse, model, pk_set, **_
1213
):
1314
if action not in ["post_add", "post_remove", "pre_clear"]:
1415
# nothing to do for the other actions
1516
return
1617

1718
if reverse:
1819
images = Image.objects.filter(componentinterfacevalue__pk=instance.pk)
20+
21+
if pk_set is None:
22+
# When using a _clear action, pk_set is None
23+
# https://docs.djangoproject.com/en/2.2/ref/signals/#m2m-changed
24+
archive_items = instance.archive_items.all()
25+
else:
26+
archive_items = model.objects.filter(pk__in=pk_set)
27+
28+
archive_items = archive_items.select_related(
29+
"archive__editors_group",
30+
"archive__uploaders_group",
31+
"archive__users_group",
32+
).only(
33+
"archive__editors_group",
34+
"archive__uploaders_group",
35+
"archive__users_group",
36+
)
1937
else:
38+
archive_items = [instance]
39+
2040
if pk_set is None:
2141
# When using a _clear action, pk_set is None
2242
# https://docs.djangoproject.com/en/2.2/ref/signals/#m2m-changed
@@ -29,11 +49,23 @@ def update_permissions_on_archive_item_changed(
2949
componentinterfacevalue__pk__in=pk_set
3050
)
3151

32-
def update_permissions():
33-
for image in images:
34-
image.update_viewer_groups_permissions()
52+
if action == "post_add":
53+
for archive_item in archive_items:
54+
for image in images:
55+
groups = [
56+
archive_item.archive.editors_group,
57+
archive_item.archive.uploaders_group,
58+
archive_item.archive.users_group,
59+
]
60+
assign_perm("view_image", groups, image)
3561

36-
on_commit(update_permissions)
62+
elif action in {"post_remove", "pre_clear"}:
63+
for image in images:
64+
image.update_viewer_groups_permissions(
65+
exclude_archive_items=archive_items
66+
)
67+
else:
68+
raise NotImplementedError
3769

3870

3971
@receiver(pre_delete, sender=ArchiveItem)

app/grandchallenge/cases/models.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,10 @@ def sitk_image(self):
670670
return sitk_image
671671

672672
def update_viewer_groups_permissions( # noqa: C901
673-
self, *, exclude_jobs=None
673+
self,
674+
*,
675+
exclude_jobs=None,
676+
exclude_archive_items=None,
674677
):
675678
"""
676679
Update the permissions for the algorithm jobs viewers groups to
@@ -685,7 +688,7 @@ def update_viewer_groups_permissions( # noqa: C901
685688
signal is sent.
686689
"""
687690
from grandchallenge.algorithms.models import Job
688-
from grandchallenge.archives.models import Archive
691+
from grandchallenge.archives.models import ArchiveItem
689692
from grandchallenge.reader_studies.models import ReaderStudy
690693

691694
expected_groups = set()
@@ -709,14 +712,31 @@ def update_viewer_groups_permissions( # noqa: C901
709712
logger.error(error, exc_info=True)
710713
raise
711714

712-
for archive in Archive.objects.filter(
713-
items__values__image=self
714-
).select_related("editors_group", "uploaders_group", "users_group"):
715+
archive_items_queryset = (
716+
ArchiveItem.objects.filter(values__image=self)
717+
.select_related(
718+
"archive__editors_group",
719+
"archive__uploaders_group",
720+
"archive__users_group",
721+
)
722+
.only(
723+
"archive__editors_group",
724+
"archive__uploaders_group",
725+
"archive__users_group",
726+
)
727+
)
728+
729+
if exclude_archive_items is not None:
730+
archive_items_queryset = archive_items_queryset.exclude(
731+
pk__in={ai.pk for ai in exclude_archive_items}
732+
)
733+
734+
for archive_item in archive_items_queryset:
715735
expected_groups.update(
716736
[
717-
archive.editors_group,
718-
archive.uploaders_group,
719-
archive.users_group,
737+
archive_item.archive.editors_group,
738+
archive_item.archive.uploaders_group,
739+
archive_item.archive.users_group,
720740
]
721741
)
722742

0 commit comments

Comments
 (0)