55 pre_delete ,
66 pre_save ,
77)
8- from django .db .transaction import on_commit
98from django .dispatch import receiver
109
1110from grandchallenge .cases .models import Image
1413
1514@receiver (m2m_changed , sender = DisplaySet .values .through )
1615def 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