11from django .db .models .signals import m2m_changed , post_save , pre_delete
22from django .db .transaction import on_commit
33from django .dispatch import receiver
4+ from guardian .shortcuts import assign_perm
45
56from grandchallenge .archives .models import ArchiveItem
67from grandchallenge .cases .models import Image
78
89
910@receiver (m2m_changed , sender = ArchiveItem .values .through )
1011def 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 )
0 commit comments