Skip to content

Commit b965941

Browse files
committed
Remove on_commit for display set saving and deletion
1 parent 9b538d6 commit b965941

3 files changed

Lines changed: 54 additions & 47 deletions

File tree

app/grandchallenge/archives/signals.py

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from django.db.models.signals import m2m_changed, post_save, pre_delete
22
from django.dispatch import receiver
3-
from guardian.shortcuts import assign_perm
43

54
from grandchallenge.archives.models import ArchiveItem
65
from grandchallenge.cases.models import Image
@@ -24,15 +23,6 @@ def update_permissions_on_archive_item_changed(
2423
else:
2524
archive_items = model.objects.filter(pk__in=pk_set)
2625

27-
archive_items = archive_items.select_related(
28-
"archive__editors_group",
29-
"archive__uploaders_group",
30-
"archive__users_group",
31-
).only(
32-
"archive__editors_group",
33-
"archive__uploaders_group",
34-
"archive__users_group",
35-
)
3626
else:
3727
archive_items = [instance]
3828

@@ -48,29 +38,18 @@ def update_permissions_on_archive_item_changed(
4838
componentinterfacevalue__pk__in=pk_set
4939
)
5040

51-
if action == "post_add":
52-
for archive_item in archive_items:
53-
for image in images:
54-
groups = [
55-
archive_item.archive.editors_group,
56-
archive_item.archive.uploaders_group,
57-
archive_item.archive.users_group,
58-
]
59-
assign_perm("view_image", groups, image)
41+
exclude_archive_items = archive_items if action == "pre_clear" else None
6042

61-
elif action in {"post_remove", "pre_clear"}:
62-
for image in images:
63-
image.update_viewer_groups_permissions(
64-
exclude_archive_items=archive_items
65-
)
66-
else:
67-
raise NotImplementedError
43+
for image in images:
44+
image.update_viewer_groups_permissions(
45+
exclude_archive_items=exclude_archive_items
46+
)
6847

6948

7049
@receiver(pre_delete, sender=ArchiveItem)
7150
@receiver(post_save, sender=ArchiveItem)
7251
def update_permissions_on_archive_item_change(
73-
*_, instance: ArchiveItem, signal, **__
52+
*, instance: ArchiveItem, signal, **__
7453
):
7554
images = Image.objects.filter(
7655
componentinterfacevalue__archive_items=instance

app/grandchallenge/cases/models.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,7 @@ def update_viewer_groups_permissions( # noqa: C901
674674
*,
675675
exclude_jobs=None,
676676
exclude_archive_items=None,
677+
exclude_display_sets=None,
677678
):
678679
"""
679680
Update the permissions for the algorithm jobs viewers groups to
@@ -689,7 +690,7 @@ def update_viewer_groups_permissions( # noqa: C901
689690
"""
690691
from grandchallenge.algorithms.models import Job
691692
from grandchallenge.archives.models import ArchiveItem
692-
from grandchallenge.reader_studies.models import ReaderStudy
693+
from grandchallenge.reader_studies.models import DisplaySet
693694

694695
expected_groups = set()
695696

@@ -740,13 +741,28 @@ def update_viewer_groups_permissions( # noqa: C901
740741
]
741742
)
742743

743-
for rs in ReaderStudy.objects.filter(
744-
display_sets__values__image=self
745-
).select_related("editors_group", "readers_group"):
744+
display_set_queryset = (
745+
DisplaySet.objects.filter(values__image=self)
746+
.select_related(
747+
"reader_study__editors_group",
748+
"reader_study__readers_group",
749+
)
750+
.only(
751+
"reader_study__editors_group",
752+
"reader_study__readers_group",
753+
)
754+
)
755+
756+
if exclude_display_sets is not None:
757+
display_set_queryset = display_set_queryset.exclude(
758+
pk__in={ds.pk for ds in exclude_display_sets}
759+
)
760+
761+
for display_set in display_set_queryset:
746762
expected_groups.update(
747763
[
748-
rs.editors_group,
749-
rs.readers_group,
764+
display_set.reader_study.editors_group,
765+
display_set.reader_study.readers_group,
750766
]
751767
)
752768

app/grandchallenge/reader_studies/signals.py

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
pre_delete,
66
pre_save,
77
)
8-
from django.db.transaction import on_commit
98
from django.dispatch import receiver
109

1110
from grandchallenge.cases.models import Image
@@ -14,15 +13,25 @@
1413

1514
@receiver(m2m_changed, sender=DisplaySet.values.through)
1615
def update_permissions_on_display_set_changed(
17-
instance, action, reverse, pk_set, **_
16+
*, instance, action, reverse, model, pk_set, **_
1817
):
1918
if action not in ["post_add", "post_remove", "pre_clear"]:
2019
# nothing to do for the other actions
2120
return
2221

2322
if reverse:
2423
images = Image.objects.filter(componentinterfacevalue__pk=instance.pk)
24+
25+
if pk_set is None:
26+
# When using a _clear action, pk_set is None
27+
# https://docs.djangoproject.com/en/2.2/ref/signals/#m2m-changed
28+
display_sets = instance.display_sets.all()
29+
else:
30+
display_sets = model.objects.filter(pk__in=pk_set)
31+
2532
else:
33+
display_sets = [instance]
34+
2635
if pk_set is None:
2736
# When using a _clear action, pk_set is None
2837
# https://docs.djangoproject.com/en/2.2/ref/signals/#m2m-changed
@@ -35,23 +44,26 @@ def update_permissions_on_display_set_changed(
3544
componentinterfacevalue__pk__in=pk_set
3645
)
3746

38-
def update_permissions():
39-
for image in images:
40-
image.update_viewer_groups_permissions()
47+
exclude_display_sets = display_sets if action == "pre_clear" else None
4148

42-
on_commit(update_permissions)
49+
for image in images:
50+
image.update_viewer_groups_permissions(
51+
exclude_display_sets=exclude_display_sets
52+
)
4353

4454

4555
@receiver(pre_delete, sender=DisplaySet)
4656
@receiver(post_save, sender=DisplaySet)
47-
def update_view_image_permissions(*_, instance: DisplaySet, **__):
48-
images = [civ.image for civ in instance.values.filter(image__isnull=False)]
49-
50-
def update_permissions():
51-
for image in images:
52-
image.update_viewer_groups_permissions()
53-
54-
on_commit(update_permissions)
57+
def update_view_image_permissions(*, instance: DisplaySet, signal, **__):
58+
images = Image.objects.filter(
59+
componentinterfacevalue__display_sets=instance
60+
).distinct()
61+
exclude_display_sets = [instance] if signal is pre_delete else None
62+
63+
for image in images:
64+
image.update_viewer_groups_permissions(
65+
exclude_display_sets=exclude_display_sets
66+
)
5567

5668

5769
@receiver(m2m_changed, sender=DisplaySet.values.through)

0 commit comments

Comments
 (0)